您的位置:首页 > 移动开发 > Unity3D

unity中游戏装备数据怎么 建立,存储和读取?

2016-12-25 19:42 701 查看

我是新手,完全没有基础,用unity 想做一款放置类游戏。目前就差 装备 这一块了。我用的C# ,在二维数组中存了一大串装备的名称,然后再通两个随机数X,Y 找到 数组中的位置来获得相对应的名称。 再通过X,Y的大小计算出装备的某一项属性名称叫power。结果发现

1,这样写的花,当我第二次运行这个代码的时候power的值肯定会改变的。那我在身上的第一件装备怎么办?我是不是要添加一个变量n,然后每运行一次都+1,在把power设置成数组类型的。 感觉这样好麻烦。

2,不知道怎么存储这些信息 只会用 playerprefs 存储一些简单的信息,如果要存入多个信息怎么办?

3,怎么把一些数据绑定在一个元素上?

感觉你的问题应该有更直接的办法,一是不太懂你的意思,比如你具体是要实现怎样的功能?为什么要根据XY计算,难道同样的装备随机次数不同,power计算也不同? 第一、第二个装备又是什么意思?理论上应该限定总的可装备上限,比如一共就可以装备三个东西,那么你自然需要定义一个三个元素的数组了。如果每个装备名称对应的xy是固定的话,计算power似乎没意义了,还不如把power参数和装备写在一起,而你只要随机xy来取不同装备就行了吧。

以下顺带讲一下写入数据的办法。

(不好意思我用的是JS,语法上转换一下就行了。)

不用playerprefs的方法是:

新建一个类,这个类里面定义你要储存在磁盘上的变量,最后把这个类写成*.dat文件(binary文件),这样这个类里的数据就写在磁盘上了,以后你就可以随时调取、更新所存储的数据了。

(1)编程时你要用到几个基本的包:

import System;

import System.Runtime.Serialization.Formatters.Binary; //用来写binary文件

import System.IO; //基本的输入输出

详细的你还可以去查.net 的MSDN 参考。

(2)你要自定义一个类用来规定数据,比如:

Class GameData {

var itemID:int;

var power:float;

}

(3)你还需要一个实例化的脚本(比如命名成,GameDataManager ),把这个脚本放在一个场景中GameObject上就可以了,这个脚本用来实际操作读取和写入。把这个类做成一个Singleton,就是说仅在整个游戏刚启动时初始化一个静态的实例,而且在此后的场景退出时都不要清除,这样可以避免反复覆盖读取和存储数据的风险。比如:

static var instance:GameDataManager;

Awake() {

if(instance == null){ //当前场景中没有其他实例化的脚本,

DontDestroyOnLoad(gameObject); //那么说现在本脚本是唯一的实例,所以不要销毁

instance = this; //把唯一的静态指针指向自己。

}else if(instance != this){

Destroy(gameObject); //当前场景中已经有了其它实例!说本脚本是重复的实例,销毁!

}

}

(4)接下来要判断是否已经存在先前的存档binary文件,如果没有,就需要初始化一个GameData类。

var myGameData:GameData;

function Start () {

myGameData= Load(); //此处Load()是脚本后面定义的一个读取binary文件.Dat的方法

if(myGameData== null){ // 如果没有读取到文件,就初始化一个新的数据类

myGameData= new GameData();

myGameData.power= 999; // 数据初始化,这里你可以自定义更复杂的方法或算法

Save(); //写入数据,此处Save()也是后面定义的一个存储binary文件.Dat的方法

}

}

(5)具体完成Load() 和 Save()方法:

function Save (){

var bFile:BinaryFormatter;

var file:FileStream;

bFile = new BinaryFormatter();

file = File.Create(Application.persistentDataPath + "/GameData.dat"); //在系统默认应用程序路径创建.Dat文件

bFile.Serialize(file, currentGameData); // 写入数据

file.Close(); //完成文件

}

function Load ():GameData{

var bFile:BinaryFormatter;

var file:FileStream;

var loadData:GameData;

if(File.Exists(Application.persistentDataPath + "/GameData.dat")){//判断.dat文件是否存在

bFile = new BinaryFormatter();

file = File.Open(Application.persistentDataPath +"/GameData.dat", FileMode.Open);//打开系统默认路径中的.Dat文件

loadData = bFile.Deserialize(file) as GameData; //获取读取到的数据

file.Close();//关闭文件

}

return loadData; //返回获取到的数据类

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: