【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来存储游戏数据
【特点】
- 在使用时,不像Xml、Json那样需要先解析
- 结合AssetBundle打包可以热更新
【实例】
-
按需求定义一个可序列化的类 RoadInfo。
【实例】【脚本】(1)[System.Serializable] public class RoadInfo { public int id = 10000; public string road = ""; }
-
创建一个数据类 RoadInfoList。
【实例】【脚本】(2)public class RoadInfoList : ScriptableObject { public List<RoadInfo> roadList; }
-
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>
-
将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 生成一个数据类实例 -
测试使用 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 中,运行场景,打印控制台中看到 -
将RoadData.asset 或者有引用它的预设Prefab 打成AB包,一些必要的C#类映射到Lua中,就可以在Lua中使用这些数据了。
本文地址:https://blog.csdn.net/Constant23/article/details/108582318
上一篇: 幽默闲侃,还是有不少道理的!