Unity3D 利用 ScriptableObject 把 Xml 打包成 assetbundle
发布时间:2020-12-16 06:14:18 所属栏目:百科 来源:网络整理
导读:在开发游戏的过程中,配置文件或多或少都会用到,但是大家的选择也是各种各样,有的用 XML 作为配置,有的用 CSV 作为配置等等,但其实 Unity 提供了可以将配置文件打包成 assetbundle 的工具以及内置类库,这儿我们使用 ScriptableObject 来把 XML 打包成 a
在开发游戏的过程中,配置文件或多或少都会用到,但是大家的选择也是各种各样,有的用 XML 作为配置,有的用 CSV 作为配置等等,但其实 Unity 提供了可以将配置文件打包成 assetbundle 的工具以及内置类库,这儿我们使用 ScriptableObject 来把 XML 打包成 assetbundle。
首先创建一个 C# 类继承自 ScriptableObject,这儿我们取名 ConfigData.cs,代码如下: using UnityEngine; using System.Xml;using System.Collections.Generic; public class ConfigData : ScriptableObject { public List<ConfigDataItem> content; public void Init(string xmlPath) { this.content = new List<ConfigDataItem>(); XmlDocument xmlDocument = new XmlDocument (); xmlDocument.Load (xmlPath); XmlNodeList xmlNodeList = xmlDocument.SelectNodes ("//item"); foreach(XmlNode xmlNode in xmlNodeList) ConfigDataItem configDataItem = new ConfigDataItem(); configDataItem.key = xmlNode.Attributes["key"].Value; configDataItem.value = xmlNode.Attributes["value"].Value; this.content.Add(configDataItem); } 如果继承自 ScriptableObject 的子类中(上面的 ConfigData.cs)还包含其他类(ConfigDataItem.cs),那么这个类需要标记添加 [System.Serializable],代码如下:using UnityEngine; using System.Collections; [System.Serializable] public class ConfigDataItem public string key; public string value; 下面我们使用 BuildPipeline.BuildAssetBundle 函数来把 Xml 打包成 assetbundle 文件,新建一个类取名 ExportScriptableObjectBySelection.cs 并把这个类放到 Editor 目录中,代码如下:using UnityEngine; using UnityEditor; public class ExportScriptableObjectBySelection { [MenuItem("Assets/Build ScriptableObject From Selection")] public static void Execute() { string path = EditorUtility.SaveFilePanel ("Save Resource","","New Resource","assetbundle"); if (path.Length != 0) string assetTempPath = "Assets/Temp/{0}.asset"; Object[] selections = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets); Object[] assetObjectList = new Object[selections.Length]; for(int index = 0; index < selections.Length; index++) { string selectPath = AssetDatabase.GetAssetPath((UnityEngine.Object)selections[index]); selectPath = Application.dataPath + selectPath.Substring(selectPath.IndexOf("/")); string selectName = selections[index].name; string assetPath = string.Format(assetTempPath,selectName); Object assetObject = null; if(selectName == "config") { ConfigData configData = ScriptableObject.CreateInstance<ConfigData>(); configData.Init(selectPath); AssetDatabase.CreateAsset(configData,assetPath); assetObject = AssetDatabase.LoadAssetAtPath(assetPath,typeof(ConfigData)); } // 打包多个 XML 文件可以继承添加 /*else if(selectName == "user") UserData userData = ScriptableObject.CreateInstance<UserData>(); userData.Init(selectPath); AssetDatabase.CreateAsset(userData,typeof(UserData)); }*/ assetObjectList[index] = assetObject; } BuildPipeline.BuildAssetBundle(null,assetObjectList,path,BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.StandaloneWindows); AssetDatabase.Refresh(); 到这儿,我们选中相应的 XML 文件并选择好存放目录,就可以完成打包了,有了 assetbundle,我们可以通过加载 assetbundle 来使用 XML 文件,新建立一个类,取名 InitObject.cs,代码如下:using UnityEngine; public class InitObject : MonoBehaviour void Start () { this.StartCoroutine (this.LoadAsset ()); IEnumerator LoadAsset() WWW www = new WWW("file:///" + Application.dataPath + "/XmlConfig.assetbundle"); yield return www; Object[] objectList = www.assetBundle.LoadAll(typeof(ConfigData)); foreach(Object objectItem in objectList) ConfigData configData = objectItem as ConfigData; if(configData != null) Debug.Log(configData.content[0].key); objectList = www.assetBundle.LoadAll(typeof(UserData)); UserData userData = objectItem as UserData; if(userData != null) Debug.Log(userData.content[0].id); 这样就可以解析 assetbundle 中 Xml 文件的内容了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |