【Unity】讀取Excel工具

寫在前面
這個工具在年初的時候就有一個想法雛形,但是為什么到今天才完成呢,其實就是,每天下班回家根本都不想動了,就想葛優(yōu)癱~這兩天在學(xué)校度假就搗鼓搗鼓了一下這個東西。最開始想做這個是因為公司的那個讀表的系統(tǒng)有個硬傷就是你每改一個表里的一個數(shù)據(jù)就需要重新全部手動(專門有一個小軟件來生成數(shù)據(jù)代碼)生成全部數(shù)據(jù)腳本,但是這樣做應(yīng)該是想讓客戶端和服務(wù)器用同一套數(shù)據(jù)腳本,然后就幾經(jīng)查閱就產(chǎn)生了現(xiàn)在這一套工具。

是什么?

工具視圖

這一個工具是讀取Excel表中的數(shù)據(jù),并把它存在一個ScriptObject數(shù)據(jù)類。
對于ScriptObject可以看看我的這一篇文章。


主要功能
1.就是上面說的,轉(zhuǎn)化為ScriptObject數(shù)據(jù)類,這里分為兩種:
a.分離一個Excel表中的所有sheet為單獨的一個數(shù)據(jù)體。
b.把一個Excel表中所有的sheet合成在一個數(shù)據(jù)體中。
注意:第二種exce中必須每一個sheet的數(shù)據(jù)項是一樣并且位置也是相同的
2.可以選擇每一個sheet或者sheet中的數(shù)據(jù)單項是否被生成到數(shù)據(jù)體中。
3.系統(tǒng)會自動識別每一個數(shù)據(jù)單項的數(shù)據(jù)類型與數(shù)據(jù)參數(shù)名,當(dāng)然也可以用戶更改。
4.在創(chuàng)建數(shù)據(jù)體完成后,再改表中的數(shù)據(jù),數(shù)據(jù)體自動更新。當(dāng)然如果是增加刪除單項數(shù)據(jù),就需要重新生成數(shù)據(jù)體。


規(guī)則示例

Excel表格填寫規(guī)則
1.第一行為變量名稱,數(shù)組參數(shù)名稱結(jié)尾為[]。建議不要再次手動修改,不然后面不好區(qū)分。
2.第一列必須為id名稱,并且必須類型為整形。id名稱不要修改。
3.第二行為注釋。
4.下面即為數(shù)據(jù)了。
注意:這個格式必須按照這樣來,不然會出錯。


使用方法

1.在Project視窗下選中需要生成數(shù)據(jù)類的Excel表,右鍵菜單,選擇“Read Excel”。

第一步

2.設(shè)置數(shù)據(jù)類的名字,是否分離,包括哪一些sheet與數(shù)據(jù)項,檢測數(shù)據(jù)項類型名字。
注意:浮點型的數(shù)需要用戶自己設(shè)置

3.所有設(shè)置完成即可點擊“Create”。
4.生成數(shù)據(jù)實體類與ScriptObject導(dǎo)入類,會有提示框提示,再次選中Excel表右鍵點擊Reimprot按鈕,導(dǎo)入ScriptObject數(shù)據(jù)。到這一步,編輯器下操作步驟就完成了。

Paste_Image.png

5.然后在游戲載入時調(diào)用一下下面這一句話。

ExcelDataInit.Init();

6.實際運用時數(shù)據(jù)分為兩類:

a.分離單數(shù)一個sheet的數(shù)據(jù)體訪問。

testObj_Sheet1.GetData(1).name

testObj_Sheet1是你的數(shù)據(jù)類,然后使用GetData方法傳入id即可返回數(shù)據(jù)體實例。

b.合并sheet的數(shù)據(jù)體訪問方式。

testObj.GetSheet((int)testObj.SheetName.allone).GetData(1).ddd

testObj是你的數(shù)據(jù)類,然后使用GetSheet方法獲得sheet,這里自動幫用戶生成了sheet的枚舉,用戶可以直接使用枚舉來獲得sheet,然后的方法和上一種一樣。


原理

unity使用.net的api是2.0的,所以沒有可以直接讀取Excel哪部分源碼。就選擇使用了NPOI這樣一個開源框架。這里有幾個學(xué)習(xí)NPOI的傳送門,官網(wǎng)、官網(wǎng)繁體文檔、官網(wǎng)英文文檔、CSDN博客推薦看這個,具體的就不詳細講解了。

讀取到數(shù)據(jù)后再使用try測試數(shù)據(jù)類型,自動填充數(shù)據(jù)類型。這里就是為什么浮點型需要用戶自己設(shè)置的原因。

使用的ScriptObject這個Unity給出可以用來存數(shù)據(jù)的資源。這個其實也可以更改成Json文件,這樣服務(wù)器跟客戶端都可以用了。不過ScriptObject可以很直觀的看到數(shù)據(jù)的儲存。

這里用到一個資源變化的回調(diào)OnPostprocessAllAssets,這個是需要繼承于AssetPostprocessor這類的,詳細可以看這里。

這里因為字典不能序列化所以需要在游戲加載時,初始化數(shù)據(jù)一次。

原理就說這么多吧,再具體的大家可以看看源碼。

寫最后
感謝各位看官看到最后,這個工具算是寫完了,其中的BUG還未有全部測出,優(yōu)化也沒有太多的優(yōu)化,大家見諒見諒。這個是工程地址,有興趣的朋友可以一起來探討一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容