Unity3D資源管理——Excel檔案轉化成ScriptableObject
阿新 • • 發佈:2018-12-11
1.開發環境
Unity2017.2f
2.主要思路
3.主要程式碼
(1)資料檔案
using System; using UnityEngine; using System.Collections.Generic; using ResourceSystem; public class ResourcesInfo:ScriptableObject,IDataCollectionTemplete { public List<ResourcesData> Data = new List<ResourcesData>(); /// <summary> /// 獲得內容Type /// </summary> public Type GetContenType() { return typeof(ResourcesData); } /// <summary> /// 轉換成當前內容型別的列表 /// </summary> public void ConvertToContentList(List<IDataTemplete> contents) { for(int i = 0; i < contents.Count; i++) { Data.Add((ResourcesData)contents[i]); } } } [Serializable] public class ResourcesData:IDataTemplete { /// <summary> /// 索引號 /// </summary> public string ID ; /// <summary> /// 名稱 /// </summary> public string Name ; /// <summary> /// 路徑 /// </summary> public string Path ; /// <summary> /// 版本 /// </summary> public string version ; /// <summary> /// 依賴 /// </summary> public List<string> Dependencys ; /// <summary> /// 被依賴的數量 /// </summary> public int DependeciedNum ; /// <summary> /// 構造方法 /// </summary> public ResourcesData() { ID= default(string); Name= default(string); Path= default(string); version= default(string); Dependencys= new List<string>(); DependeciedNum= default(int); } /// <summary> /// 反序列化 /// </summary> public void DeSerialize(object[] content) { ID = content[0].ToString(); Name = content[1].ToString(); Path = content[2].ToString(); version = content[3].ToString(); Dependencys = ConvertUtils.GetStringListByString(content[4].ToString()); DependeciedNum = Int32.Parse(content[5].ToString()); } }
(2)核心程式碼
private static void GenerateExcelToScriptableObject(string typeName,string path, string targetPath) { ScriptableObject instance = ScriptableObject.CreateInstance(typeName); if (instance == null) { return; } //讀取Excel檔案 List<IDataTemplete> content = ResourceSystemFacade.Inst.ReadExcel(((IDataCollectionTemplete)instance).GetContenType(), path); ((IDataCollectionTemplete)instance).ConvertToContentList(content); string[] paths = targetPath.Split('/'); string finalPath = ""; bool isStart = false; for(int i = 0; i < paths.Length; i++) { if (paths[i] == "Assets") { isStart = true; } if (isStart) { finalPath += paths[i] + "/"; } } DirectoryInfo dir = new DirectoryInfo(finalPath); if (!dir.Exists) { Directory.CreateDirectory(targetPath); } string initAssetPath = finalPath + typeName + ".asset"; AssetDatabase.DeleteAsset(initAssetPath); AssetDatabase.CreateAsset(instance, initAssetPath); }