我們在使用Unity3D開發(fā)游戲的過程中,難免會讀取各種配置數(shù)據(jù)并運(yùn)用到游戲當(dāng)中碉克,可以實(shí)現(xiàn)的方法種類很多川梅,我今天就分享一個(gè)新鮮的做法:直接讀取Excel的數(shù)據(jù)偏友,然后把數(shù)據(jù)綁定到Prefab上。大體的功能就是這樣,下面我們具體來實(shí)現(xiàn)。
1. 讀取Excel數(shù)據(jù)
Unity沒有支持直接讀取Excel的接口,我們就只能采用引入.NET的類庫末患,用ODBC的接口去訪問Excel的方式。首先锤窑,項(xiàng)目中的Plugin目錄要添加System.Data.dll和System.EnterpriseServices.dll這樣才能正確的引用 System.Data和System.Data.Odbc璧针,具體信息網(wǎng)上都可以搜到,我就不再多說了渊啰。引用完成后探橱,才是我們的重點(diǎn)申屹,開始讀取Excel數(shù)據(jù),具體代碼如下:
using UnityEngine;
using System.Collections;
using System.Data.Odbc;
using System.Data;
public class TestTable : MonoBehaviour
{
private readonly string FILENAME = " TestTable.xls";
[System.Serializable]
public class TestInfo
{
public int id;
public string content;
}
public TestInfo[] testInfoList;
private bool tableReload = false;
public bool TableReload
{
set { tableReload = value; }
get { return tableReload; }
}
public void Load()
{
if (Application.platform == RuntimePlatform.WindowsEditor)
{
ReadInfo();
tableReload = true;
}
}
public void ReadInfo()
{
string fileName = PathForDocumentsFile("/Resources/Data/" + FILENAME);
string con = "Driver={Microsoft Excel Driver (*.xls)}; DriverId=790; Dbq=" + fileName + ";"; // 必須保存后綴名是.xls的文件
string query = "SELECT * FROM [Sheet1$]";
OdbcConnection oCon = new OdbcConnection(con);
OdbcCommand oCmd = new OdbcCommand(query, oCon);
DataTable dtData = new DataTable("MyData");
oCon.Open();
OdbcDataReader rData = oCmd.ExecuteReader();
dtData.Load(rData);
rData.Close();
oCon.Close();
int Count = 0;
for (int i = 0; i < dtData.Rows.Count; i++)
{
int Num = 0;
if (int.TryParse(dtData.Rows[i][0].ToString(), out Num))
{
Count++;
}
}
testInfoList = new TestInfo[Count];
for (int i = 0; i < dtData.Rows.Count; i++)
{
int Num = 0;
if (int.TryParse(dtData.Rows[i][0].ToString(), out Num))
{
TestInfo Info = new TestInfo();
Info.id = int.Parse(dtData.Rows[i][0].ToString());
Info.content = dtData.Rows[i][1].ToString();
testInfoList[i] = Info;
}
}
}
public int GetTotalCount()
{
return testInfoList.Length;
}
public TestInfo GetTestInfo(int id)
{
foreach (TestInfo Info in testInfoList)
{
if (Info.id == id) return Info;
}
return null;
}
public string PathForDocumentsFile(string fileName)
{
return Application.dataPath + fileName;
}
}
從以上代碼我們可以看出隧膏,在Load()方法中我們通過ODBC接口讀取數(shù)據(jù)暫存到DataTable中哗讥,然后從其中遍歷數(shù)據(jù)存放到一個(gè)數(shù)組中供游戲調(diào)用。但是有個(gè)遺憾就是安卓平臺不支持Excel數(shù)據(jù)的直接讀取胞枕,所以我們代碼中限制了只能在Editor環(huán)境杆煞。那我想讀出來的數(shù)據(jù)在安卓平臺使用該怎么辦呢?那就得進(jìn)行下面的第二步腐泻。
2. 綁定Excel數(shù)據(jù)到Prefab
首先决乎,在Resource/Data目錄下新建一個(gè)Prefab叫“TestData”,然后掛載上面的TestTable腳本派桩,這樣就可以執(zhí)行自動綁定數(shù)據(jù)的插件工具了构诚,插件的代碼很簡單,如下:
using UnityEngine;
using UnityEditor;
public class SetDataToPrefab : Editor
{
[MenuItem("DataBuilder/Set Data To Prefab", false, 0)]
static void Init()
{
BindData();
}
static void BindData()
{
GameObject dataObj = Resources.Load("Prefabs/Data/TestData", typeof(GameObject)) as GameObject;
dataObj.GetComponent<TestTable>().Load();
PropertyModification[] temp = new PropertyModification[1];
temp[0] = new PropertyModification();
temp[0].target = dataObj;
PrefabUtility.SetPropertyModifications(((GameObject)dataObj), temp);
if (EditorUtility.DisplayDialog("結(jié)果","數(shù)據(jù)綁定完成", "OK"))
{
}
}
}
功能很簡單铆惑,就是讀取TestTable類中的Load()方法范嘱,然后通過PropertyModification存儲并設(shè)置數(shù)據(jù)。這樣我們就可以調(diào)用Prefab設(shè)置好的數(shù)據(jù)鸭津,并且完美兼容各個(gè)平臺彤侍,是不是很贊?_
Ricky Yang個(gè)人原創(chuàng)逆趋,版權(quán)所有,轉(zhuǎn)載注明晒奕,謝謝闻书。