• unity3d读取plist或xml文件


    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

    http://blog.csdn.net/lzhq1982/article/details/12949827

    前一篇文章介绍了协同异步加载游戏场景,但前台没干活,浪费了。有的游戏在loading的时候会把一些游戏的Tips(小提示)介绍给玩家,我这里说一下是怎么实现的。

    说到小提示,其实是后台有个配置文件,里面有很多提示语句,程序以一定的时间间隔随机读取一条,显示在界面上,很简单。这里说到配置文件,花样就多了,以前做cocos2d-x游戏时,用的最多的是plist文件和csv文件,unity用的都是xml和exel文件,那我能用unity也读取plist文件和csv文件文件吗,当然可以,本篇我先说读取plist文件。

    其实读取plist文件很简单,因为plist文件就是xml文件,所以只要把文件扩展名改一下就可以了,把.plist改成.xml,然后按读取xml的方式读它就行了,哈哈,不要喷我。所以我重点介绍一下读取xml的方法。

    先看一下我的plist文件内容:

    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
    3. <plist version="1.0">  
    4. <dict>  
    5.     <key>tips</key>  
    6.     <array>  
    7.         <string>重新挑战已经通过的关卡,也可以获得金币</string>  
    8.         <string>某一关卡无法通过?您缺少的仅仅是英雄和士兵的等级罢了!</string>  
    9.         <string>优先升级城堡等级、兵力恢复速度,会带来意想不到效果</string>  
    10.         <string>选择合适的时机使用英雄技能或城防道具,可以提高获胜几率</string>  
    11.         <string>尽可能一次性出多个士兵,能够最大化提高您的军团战斗力</string>  
    12.         <string>合适的时机使用英雄技能或城防道具,可以提高您的获胜几率</string>  
    13.         <string>获得成就可以获得大量钻石,当您缺少钻石时不妨看看成就列表</string>  
    14.         <string>每个兵种的特殊各不相同,不仅仅是高级兵种才有展示的空间</string>  
    15.         <string>当连续闯关失败时,换一个战术或出兵的方式就能有所转机</string>  
    16.         <string>让士兵与敌人的等级保持一致是一个不错的主意</string>  
    17.         <string>获得成就可以获得大量钻石,缺少钻石的时候不妨看看成就列表</string>  
    18.         <string>战斗中想查看地图上的状态,只需要左右滑动屏幕就行啦</string>  
    19.     </array>  
    20. </dict>  
    21. </plist>  

    这是“时空领地”的Loading界面用到的tips,当时用plist做的,用xml文件打开,其实就是个xml,这就好办了,unity已经有成型的读取xml的接口了。先上一下代码吧。

    [csharp] view plaincopy
     
    1. void loadXml()  
    2.     {  
    3.         string filePath = Application.dataPath + @"/Resource/settings/tips.xml";  
    4.         if (File.Exists (filePath)) {  
    5.             XmlDocument xmlDoc = new XmlDocument();  
    6.             xmlDoc.Load(filePath);  
    7.             XmlNodeList node = xmlDoc.SelectSingleNode("plist").ChildNodes;  
    8.             foreach(XmlElement nodeList in node) {  
    9.                 foreach(XmlElement xe in nodeList) {  
    10.                     if (xe.Name == "array") {  
    11.                         int i = 0;  
    12.                         _tips = new string[xe.ChildNodes.Count];  
    13.                         foreach(XmlElement xe1 in xe.ChildNodes) {  
    14. //                          Debug.Log(xe1.InnerText);  
    15.                             _tips[i] = xe1.InnerText;  
    16.                             i++;  
    17.                         }  
    18.                         break;  
    19.                     }  
    20.                 }  
    21.             }  
    22.         }  
    23.     }  

    结合上面的配置文件,你会很容易明白怎么用的。Application.dataPath是Assets文件夹目录,先判断文件是否存在,如果存在,创建一个XmlDocument,load加载文件,根节点是<plist>,先循环遍历<plist>的子节点们,这里只有<dict>,然后再循环遍历<dict>的子节点们,这里有两个,一个是<key>,一个是<array>,所以判断Name是否array,是的话创建一个字符串数组,拥有array这么多元素的数组,然后从array里逐一读取出来存到数组里。以后我们就可以在该数组里随机查找了。这段代码在start里调用,只读取一次。记住,不要试图总是查询外部文件,那样效率会很低下的,提前cache起来是不错的选择。

    读取完了,我要在loading节目加载了,我用的依然是NGUI,在bottom那里布局个label,不清楚怎么布局的看我这篇文章:unity3d学习笔记(八)--NGUI制作游戏界面,这里截图如下:

    其中Label要用中文字体,不清楚怎么创建中文字体的看我这篇文章:unity3d学习笔记(十)--NGUI制作中文字体

    最后程序控制一定间隔读取上面cache的字符串。

    [csharp] view plaincopy
     
    1. private string [] _tips;  
    2. public UILabel _tipsLabel;  
    3. private float _lastTime = 0.0f;  
    4. private const int WAIT_TIME = 2;  
    5.           
    6. void Start () {  
    7.     loadXml();  
    8.     if (_tips != null && _tips.Length > 0) {  
    9.         int idx = Random.Range(0, _tips.Length-1);  
    10.         _tipsLabel.text = _tips[idx];  
    11.     }  
    12.     StartCoroutine(loadScene());  
    13. }  
    14.       
    15. // Update is called once per frame  
    16. void Update () {  
    17.     if (_tips == null || _tips.Length <= 0)  
    18.         return;  
    19.           
    20.     if (Time.time - _lastTime >= WAIT_TIME) {  
    21.         _lastTime = Time.time;  
    22.         int idx = Random.Range(0, _tips.Length-1);  
    23.         _tipsLabel.text = _tips[idx];  
    24.     }  
    25. }  


    这样2秒钟界面显示一下tips,我们的loading界面的协同异步终于有意义了。最后上个图吧。

  • 相关阅读:
    不使用第三个变量来交换两数的值
    关于索引的注意事项(何时创建,索引无效,索引数量)
    MySQL文档生成工具mysql_markdown
    在windows如何下载android源码
    redmibuds3青春版串联 小米耳机只有一只耳朵响 耳机只有一边出声
    深入浅出玩转fPGA读书笔记
    crisis is comming stone
    Kubernetes入门(七)
    Kubernetes入门(六)
    Kubernetes入门(三)
  • 原文地址:https://www.cnblogs.com/littleYellowDoggy/p/5024198.html
Copyright © 2020-2023  润新知