游戏蛮牛学习群(纯技术交流,不闲聊):539178957
福建体彩31选7开奖 手机端
查看: 398|回复: 2
发新帖

体育彩票31选7开奖: [基础知识] Unity跨平台读取文件(txt,csv,xml等)

[复制链接]  [移动端链接]
7日久生情
2552/5000
排名
1012
昨日变化
9

福建体彩31选7开奖 www.jlh8.com.cn 47

主题

713

帖子

2552

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7665
威望
0
注册时间
2015-1-20
在线时间
787 小时
最后登录
2018-7-24
跳转到指定楼层
楼主
发表于 2018-6-15 15:17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 煮粥侠 于 2018-6-15 15:19 编辑

在我们制作游戏的时候,游戏中的信息,配置等都是通过读取文件来获取的,可能有人会问为什么不在控件中添加对应的文本呢,首先我们制作游戏的时候这些数据都是策划给你的,他在制作的时候就是根据处理文本的软件来配置的,如果我们手动去打是不是感觉有点小傻,不幸的是如果你碰到一个一直不断修改数据的策划你不是要疯了吗,况且我们为了以后游戏上线的更新考虑还是用读取文件是一个不错的选择。

    在这里我提供一种可以支持在各个平台上使用并且支持多种格式读取的方法。

[C#] 纯文本查看 复制代码
public static class ReadFile
{

        public static string[][] GetCSVStrings(string path)
        {
                string[][] Array;
                //读取csv二进制文件,将文件放在Resources文件夹下,通过名字加载文本
                TextAsset binAsset = Resources.Load(path, typeof(TextAsset)) as TextAsset;

                //读取每一行的内容,'\r'返回一行的全部内容 
                string[] lineArray = binAsset.text.Split('\r');
                string[] lineArray2 = new string[lineArray.Length];
                int index = 0;
                //将每行的换行符去掉
                foreach (string str in lineArray)
                {
                        lineArray2[index] = str.Replace("\n", "");
                        index++;
                }
                //创建二维数组 
                Array = new string[lineArray2.Length][];

                //把csv中的数据储存在二位数组中 
                for (int i = 0; i < lineArray2.Length; i++)
                {
                        Array = lineArray2.Split(',');
                }
                return Array;
        }
}


这个脚本就是用来读取文件,我们将需要读取的文件放在Resources文件夹下,这样我们就可以根据文件的名字来进行读取。那这个脚本是如何调用的呢,我们通过下面的脚本来读取。

[C#] 纯文本查看 复制代码
public class ConfigManager
{
        //声明一个字典key为int类型,value为Objectinfo类型(Objectinfo为一个类)
        public Dictionary<int, ObjectInfo> objectsInfoDict = new Dictionary<int, ObjectInfo>();
        //默认构造函数
        public ConfigManager()
        {
                initObjectInfoList("ObjectsInfoList");//形参是文件的名字作为路径加载
        }
        //读取文件并保存在字典中
        void initObjectInfoList(string path)
        {
                string[][] strings = ReadFile.GetCSVStrings(path);
                //如果有标题的话i=1,没有为0
                for (int i = 0; i < strings.GetUpperBound(0) + 1; i++)
                {
                        ObjectInfo info = new ObjectInfo();
                        info.id = int.Parse(strings[0]);
                        info.name = strings[1];
                        info.icon_name = strings[2];
                        string str_type = (strings[3]);
                        ObjectType type = new ObjectType();
                        switch(str_type)
                        {
                        case "Drug":
                                type = ObjectType.Drug;
                                break;
                        case "Equip":
                                type = ObjectType.Equip;
                                break;
                        case "Mat":
                                type = ObjectType.Mat;
                                break;
                        }
                        if(type==ObjectType.Drug)
                        {
                                info.hp =int.Parse(strings[4]);
                                info.mp = int.Parse(strings[5]);
                                info.price_sell = int.Parse(strings[6]);
                                info.price_buy = int.Parse(strings[7]);
                        }
                        objectsInfoDict.Add(info.id,info);
                        Debug.Log(objectsInfoDict.Keys.Count);
                }
        }
}

[C#] 纯文本查看 复制代码
//物品的类型
public enum ObjectType
{
        Drug,
        Equip,
        Mat
}
//物品的属性
public class ObjectInfo
{
        public int id;
        public string name;
        public string icon_name;
        public ObjectType type;//通过判断物品的类型来对相应的值设置
        public int hp;
        public int mp;
        public int price_sell;
        public int price_buy;


}

我在这里解释一下上面的脚本,我首先创建了一个ObjectInfo(物品属性)类,然后里面有一个类型,所有用了一个枚举;然后在ConfigManager类中构造函数中初始化,

//如果有标题的话i=1,没有为0的意思是


就是如果我们在1001的上面加上id,小瓶血药上加上name等,则i=1,像我这样则i=0.然后将获取到的数据赋值给info 对象,并将这个对象添加到字典里。

最后就是通过Unity中的脚本调用这个代码了。


[C#] 纯文本查看 复制代码
public class GameManager : MonoBehaviour {
        public static GameManager _Instance;
        private ConfigManager configManager;
        // Use this for initialization
        void Awake () {
                _Instance = this;
                configManager = new ConfigManager();
                if(configManager.objectsInfoDict.ContainsKey(1001))
                {
                        print(configManager.objectsInfoDict[1001].icon_name);
                }
        }
}


好了,将这个脚本附加到场景中的任何一个物体上就可以运行了,虽然代码有点多,但是扩展性比较好。谢谢大家!

转自:https://blog.csdn.net/caojianhua1993/article/details/50709330?locationNum=6&fps=1


3偶尔光临
271/300
排名
7847
昨日变化
5

1

主题

33

帖子

271

积分

Rank: 3Rank: 3Rank: 3

UID
273353
好友
2
蛮牛币
397
威望
0
注册时间
2018-3-20
在线时间
96 小时
最后登录
2018-7-24
沙发
发表于 2018-6-26 08:44:39 | 只看该作者
Mark一下

4四处流浪
349/500
排名
9171
昨日变化
2

0

主题

188

帖子

349

积分

Rank: 4

UID
281167
好友
1
蛮牛币
640
威望
0
注册时间
2018-5-14
在线时间
50 小时
最后登录
2018-7-24
板凳
发表于 2018-7-6 13:56:56 | 只看该作者
感谢分享

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 福建体彩31选7开奖 返回列表
219| 609| 396| 323| 867| 752| 935| 248| 150| 546|