最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity3d 数据保存
本文主要介绍 Unity3D 中简单数据的持久化存储。在 Unity3D 里,本身提供了一种简单有效的数据持久化方法。若你之前有过 Android 开发经验,会发现 Unity3D 中持久化数据的存储方式与 Android 十分相似。下面将通过一个简单且有效的示例,详细介绍 Unity3D 中持久化数据的操作。
1. PlayerPrefs 类
首先,我们需要熟悉 Unity3D 中的 PlayerPrefs 类。该类封装了 9 个方法,专门用于数据的存储与读取。其采用键值对的形式进行数据操作,每个 Key 对应一个 Value,存储后可通过 Key 获取之前存储的 Value。
以下是存储和读取操作的示例代码:
PlayerPrefs.SetString("key", "value");
string str = PlayerPrefs.GetString("key", "default");
在 GetString() 方法中,第二个参数代表默认值。若通过第一个参数的 Key 未找到对应的 Value,GetString() 方法将返回第二个参数所设置的默认值。这种方式与 Android 的数据存储方式极为相似,使用起来较为便捷。
2. 字体设置
Unity3D 默认字体的大小仅为 16,在 iPhone4(960 X 640)屏幕上,字体显示会非常小。我们可以从互联网下载字体,也可以从自己的电脑中拷贝字体。以 Mac 电脑为例,字体存放在 Finder -> 资源库 -> Fonts 路径下。
具体操作步骤如下:
- 在电脑字体文件夹中,任选一个字体,例如将
华文仿宋.ttf用鼠标拖动到 Unity3D 的Project中。 - 选中
华文仿宋字体后,可进行以下设置:FontSize 30:设置字体大小,此处设置为 30 可使字体接近放大 1 倍。Character:设置字体的文字编码,可选择Unicode或ASCII编码。Style:设置字体的风格,如粗体、斜体等。
- 点击
Create -> GUISkin创建一个 GUI 皮肤,将华文仿宋字体拖动到指定位置。在下面的控件设置区域,可以对各个高级控件进行详细设置,你可以手动修改参数查看不同的显示效果。
3. 游戏场景与数据保存示例
游戏场景在游戏制作中至关重要,任何一款游戏都是由若干个场景组成,Unity3D 的游戏场景功能设计得十分贴心。接下来,我们将创建两个游戏场景,分别为 scene0 和 scene1,目标是在第一个游戏场景 scene0 中保存一些基本游戏数据,然后切换到第二个场景 scene1 中显示第一个场景中保存的数据,实现场景的切换和数据的存储。
3.1 在 scene0 中创建脚本
在 scene0 中创建一个 C# 脚本,名为 Scene0Main.cs,并将其绑定在摄像头对象上。以下是 Scene0Main.cs 的代码:
using UnityEngine;
using System.Collections;
public class Scene0Main : MonoBehaviour {
// 储存数据的显示
public string testStr;
public string testInt;
public string testFloat;
// GUI 皮肤 为上面我们添加的皮肤
// 在外面用鼠标拖动上为它赋值
public GUISkin fontSkin;
// 显示的图片
public Texture Imagetexture;
// Use this for initialization
void Start () {
// 读取 key 的值
testStr = PlayerPrefs.GetString("testStr", "default");
testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
}
// Update is called once per frame
void Update () {
}
void OnGUI() {
// 将 GUI 的皮肤设置为我们创建的皮肤
GUI.skin = fontSkin;
// 贴上图片
GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
// 添加输入框让用户输入信息,这里面我没有捕获异常,因为用户有可能输入一个不合法的数值
testStr = GUI.TextField (new Rect(10, 200, 200, 50), testStr, 50);
testInt = GUI.TextField (new Rect(10, 250, 200, 50), testInt, 50);
testFloat = GUI.TextField (new Rect(10, 300, 200, 50), testFloat, 50);
// 点击按钮保存所有数据
if (GUI.Button(new Rect(220, 200, 150, 100), "commit all"))
{
PlayerPrefs.SetString("testStr", testStr);
PlayerPrefs.SetInt("testInt", int.Parse(testInt));
PlayerPrefs.SetFloat("testFloat", float.Parse(testFloat));
// 切换场景到 scene1
Application.LoadLevel("scene1");
}
}
}
3.2 在 scene1 中创建脚本
在 scene1 中创建一个 C# 脚本,名为 Scene1Main.cs。以下是 Scene1Main.cs 的代码:
using UnityEngine;
using System.Collections;
public class Scene1Main : MonoBehaviour {
public string testStr;
public string testInt;
public string testFloat;
public GUISkin fontSkin;
public Texture Imagetexture;
// Use this for initialization
void Start () {
testStr = PlayerPrefs.GetString("testStr", "default");
testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
}
void OnGUI() {
GUI.skin = fontSkin;
GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
// 显示 label
GUI.Label(new Rect(10,150,300,50),"testStr = "+ testStr);
GUI.Label(new Rect(10,200,300,50),"testInt = "+ testInt);
GUI.Label(new Rect(10,250,300,50),"testFloat = "+ testFloat);
if (GUI.Button(new Rect(220, 200, 150, 100), "clean all"))
{
// 删除所有键值
PlayerPrefs.DeleteAll();
// 返回场景 0
Application.LoadLevel("scene0");
}
if (GUI.Button(new Rect(220, 320, 150, 100), "only return"))
{
// 返回场景 0
Application.LoadLevel("scene0");
}
}
}
3.3 场景添加与项目运行
- 选择
File -> Build Settings,点击Add Current添加场景。这一步非常重要,若不添加场景,在代码中切换场景时会抛出异常,请务必注意。 - 执行
Build and Run导出并运行项目。在运行界面中,分别输入string、int、float三种类型的数据,然后点击commit all按钮,所有数据将被保存,游戏场景会切换到scene1场景。 - 切换到
scene1场景后,可正常显示scene0中存储的数值。点击clean all按钮,将清空存储的所有信息并返回场景scene0;点击only return按钮,则直接返回场景scene0。
通过以上步骤,我们实现了 Unity3D 中简单数据的持久化存储以及场景之间的数据传递和显示。