Unity3D 利用 ScriptableObject 把 Xml 打包成 assetbundle

在开发游戏的过程中,配置文件或多或少都会用到,但是大家的选择也是各种各样,有的用 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 文件内容了。

相关文章

这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价...
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分...
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文...