欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Unity】ScriptableObject —— 替代Xml、Json来存储游戏数据

程序员文章站 2022-04-21 11:33:29
ScriptableObject_4#Unity@common使用ScriptableObject 替代Xml、Json来存储游戏数据【特点】在使用时,不像Xml、Json那样需要先解析结合AssetBundle打包可以热更新【实例】按需求定义一个可序列化的类 RoadInfo。【实例】【脚本】(1) [System.Serializable] public class RoadInfo { public int id = 10000;...

ScriptableObject_4#Unity

@common

使用ScriptableObject 替代Xml、Json来存储游戏数据

【特点】

  1. 在使用时,不像Xml、Json那样需要先解析
  2. 结合AssetBundle打包可以热更新

【实例】

  1. 按需求定义一个可序列化的类 RoadInfo。
    【实例】【脚本】(1)

        [System.Serializable]
        public class RoadInfo {
            public int id = 10000;
            public string road = "";
        }
    
  2. 创建一个数据类 RoadInfoList。
    【实例】【脚本】(2)

        public class RoadInfoList : ScriptableObject
        {
            public List<RoadInfo> roadList;
        }
    
  3. Xml数据源 x_roadinfo.xml,用来转化成 ScriptableObject 在游戏中直接使用。
    【实例】【数据】(1)

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <roadinfo>
        <id>10001</id>
        <road>12,12,12;33,33,33;54,54,54</road>
      </roadinfo>
      <roadinfo>
        <id>10002</id>
        <road>10,10,10;20,20,20;30,30,30</road>
      </roadinfo>
    </root>
    
  4. 将Xml文件中的数据通过数据类 RoadInfoList 转化成一个数据类实例 RoadData.asset,注意根据自己的工程修改文件目录路径。
    【实例】【脚本】(3)

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using System.Xml;	
    public class MakeRoadData : MonoBehaviour
    	{
            [MenuItem("Assets/Create/ScriptableObject_4#Unity/CreateRoadData", false, 4)]
            public static void CreateRoadData()
            {
                RoadInfoList roadData = ScriptableObject.CreateInstance<RoadInfoList>();
                AssetDatabase.CreateAsset(roadData, "Assets/PG/Examples/ScriptableObject_4#Unity/RoadData.asset");
                roadData.roadList = new List<RoadInfo>();
    
                string xmlPath = "file://" + Application.dataPath + "/PG/Examples/ScriptableObject_4%23Unity/" + "x_roadinfo.xml";
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(xmlPath);
                XmlNode root = xmlDocument.SelectSingleNode("root");
                XmlNodeList rootlist = root.SelectNodes("roadinfo");
                foreach (XmlNode xmlNode in rootlist)
                {
                    RoadInfo roadInfo = new RoadInfo();
                    roadInfo.id = int.Parse(xmlNode.SelectSingleNode("id").InnerText);
                    roadInfo.road = xmlNode.SelectSingleNode("road").InnerText;
                    roadData.roadList.Add(roadInfo);
                }
                AssetDatabase.SaveAssets();
                EditorUtility.FocusProjectWindow();
                Selection.activeObject = roadData;
            }
        }
               
    

    【预期】
    运行菜单栏选项 Assets/Create/ScriptableObject_4#Unity/CreateRoadData 后,会根据 x_roadinfo.xml 生成一个数据类实例
    【Unity】ScriptableObject —— 替代Xml、Json来存储游戏数据

  5. 测试使用 RoadData.asset,创建脚本 DataModule
    【实例】【脚本】(4)

    using UnityEngine;
    public class DataModule:MonoBehaviour
    {
        public static DataModule Instance
        {
            private set;
            get;
        }
        public RoadInfoList roadData;
        void Awake()
        {
            Instance = this;
        }
        void Start()
        {
            foreach(RoadInfo info in roadData.roadList)
            {
                Debug.Log("id:" + info.id.ToString() +" road:" +  info.road);
            }
        }
    }
    

    【预期】
    创建一个新场景,将 DataModule 脚本挂载在任意对象上,拖动 RoadData.asset 到公开属性 roadData 中,运行场景,打印控制台中看到

    【Unity】ScriptableObject —— 替代Xml、Json来存储游戏数据

  6. 将RoadData.asset 或者有引用它的预设Prefab 打成AB包,一些必要的C#类映射到Lua中,就可以在Lua中使用这些数据了。

本文地址:https://blog.csdn.net/Constant23/article/details/108582318