需求:
將策劃寫好的excel文件,在unity編輯器環境下加工成可以跨平臺的數據資源文件
實現思路:
1)編輯器下使用窗體工具獲取路徑
2)使用獲取路徑讀取excel功能
3)創建AssetDatabase資源
第一步:
實現編輯器下用窗體工具獲取目標文件路徑
相關API:
EditorUtility: http://docs.unity3d.com/ScriptReference/EditorUtility.html
小步驟:
1)打開一個獲取路徑窗口,在窗口選擇完確認后會得到一個地址信息,
2)通過對地址進行判斷得出是否合格
3)符合的路徑拿去加載目標excel文件
[UnityEditor.MenuItem("Assets/Create/Create_InfoObject")]
static void Create_InfoObject()
{
string asset_url = EditorUtility.OpenFilePanel("Overwrite with xlsx", "", "xlsx");
if (new DirectoryInfo(asset_url).Exists == false)
{
return;
}
LoadAndCreate(asset_url, @"Assets/StreamAsset/ScriptableObject_info");
}
第二部:
按路徑讀取excel文件
相關dll文件:
Excel.dll & System.Data.dll: http://pan.baidu.com/s/1gf4rZXp
1)打開目標路徑下的文件
2)讀取表信息內的行列數據
3)讀取后存儲到信息類的對象中并返回
創建一個與策劃存儲信息協議一致的類
public class M_Info:ScriptableObject
{
public int m_int_value;
public string m_string_value;
public float m_float_value;
......
}
將表信息讀取并存儲進對象對應屬性
public static M_Info Load_Info(string url)
{
FileStream stream = File.Open(url, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
int rows = result.Tables[0].Rows.Count;
M_Info m_info = new M_Info();
for (int i = 0; i < rows; i++)
{
m_info.m_int_value = int.Parse(result.Tables[0].Rows[i][0].ToString());
m_info.m_float_value = float.Parse(result.Tables[0].Rows[i][1].ToString());
m_info.m_string_value = result.Tables[0].Rows[i][1].ToString();
......
}
return m_info;
}
}
步驟三:
實現對象保存為可跨平臺使用的數據資源格式(此處使用AssetDatabase資源)
相關API:
AssetDatabase: http://docs.unity3d.com/ScriptReference/30_search.html?q=AssetDatabase
static void LoadAndCreate(string load_url,string save_url)
{
M_Info m_info = Load_Info(save_url);
AssetDatabase.CreateAsset(m_info, save_url);
AssetDatabase.Refresh();
}
完整代碼:
using UnityEngine;
using System.Data;
using System.IO;
using Excel;
using UnityEditor;
public class SaveDataToAsset : Editor
{
//轉換名為info的excel文件到unity可讀二進制文件
[UnityEditor.MenuItem("Assets/Create/Create_InfoObject")]
static void Create_InfoObject()
{
//打開unity-api窗體,選擇對象獲取路徑
string asset_url = EditorUtility.OpenFilePanel("Overwrite with xlsx", "", "xlsx");
//檢查一下路徑下有東西沒
if (new DirectoryInfo(asset_url).Exists == false)
{
Debug.Log("這肯定不行");
return;
}
//按該路徑獲取對象,同時設定一下創建的資源存在哪;
LoadAndCreate(asset_url, @"Assets/StreamAsset/ScriptableObject_info");
}
static void LoadAndCreate(string load_url,string save_url)
{
//將excel文本資源加載,并創建一個承載該類信息的對象,
M_Info m_info = Load_Info(save_url);
//將該對象存為資源文件,保存到指定路徑下
AssetDatabase.CreateAsset(m_info, save_url);
//刷新一下將當前創建的內容在編輯器下第一時間顯示,額,還會觸發一個垃圾回收;
AssetDatabase.Refresh();
}
public static M_Info Load_Info(string url)
{
//打開目標文件
FileStream stream = File.Open(url, FileMode.Open, FileAccess.Read);
//得到excel信息接口
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//得到表信息對象
DataSet result = excelReader.AsDataSet();
//int columns = result.Tables[0].Columns.Count;//列
//表1中有多少排
int rows = result.Tables[0].Rows.Count;
M_Info m_info = new M_Info();
for (int i = 0; i < rows; i++)
{
//根據協議基礎按列的位數獲取想要的信息
m_info.m_int_value = int.Parse(result.Tables[0].Rows[i][0].ToString());
//同上
m_info.m_float_value = float.Parse(result.Tables[0].Rows[i][1].ToString());
//同上
m_info.m_string_value = result.Tables[0].Rows[i][1].ToString();
......
}
return m_info;
}
}
public class M_Info:ScriptableObject
{
public int m_int_value;
public string m_string_value;
public float m_float_value;
......
}