讓道具添加隨心所欲——70行代碼實現(xiàn)表格轉換工具

?
不得不說的前言
大家好。由于各種原(jie)因(kou),咱們在其他網站發(fā)布的文章很長一段時間都未能同步到B站。

接下來,會陸續(xù)將干貨文章同步過來,希望在大家的游戲開發(fā)學習之路上,能提供一些助力。
文章難度:★★☆☆☆
Excel表格作為配置文件,這種做法在十多年前就被很多國產網絡游戲大規(guī)模采用。多年以來國內游戲開發(fā)者將這種二維表格的使用發(fā)揮到了極致,衍生出一整套基于Excel配置表格的開發(fā)流程,至今已經成為了游戲開發(fā)的標配。
Excel表格分析工具作為一種基礎設施,其實不用自己從頭寫起。本人已經開發(fā)過至少三種表格讀取+分析程序(每個項目都有特別的需求,干脆重寫一套)。而隨著時間推移,開發(fā)技術和開發(fā)工具都有大幅度改進,所以分析工具也越做越簡單、越做越好。比方說Python的Excel讀取庫就有多種選擇,而后期出現(xiàn)的庫例如OpenPyxl往往用法更簡單、執(zhí)行效率也更高。
今天我?guī)Т蠹覍崿F(xiàn)一種非常簡單的表格轉換工具,可以實現(xiàn)從xlsx原始表格到json的直接轉換。
1、科普:Python,Excel,Json
Python
“人生苦短,我用Python?!薄苍S你在很多地方都聽說過這句話。Python真的有那么神嗎?不好說??梢钥隙ǖ氖荘ython是為了解放程序員的生產力而生的,而且它在很大程度上完成了這個偉大的目標。
Download Python
以上鏈接即可下載最新的Python安裝包,本文采用3.x版本(由于歷史原因Python 2.x版本依然在廣泛使用,在2018年的今天我建議盡量采用3.x版本)。安裝后打開命令行,輸入python,如果如下圖所示即為安裝OK:

(如果沒能啟動成功,請修改環(huán)境變量PATH,讓Python可在命令行下啟動),之后在命令行使用命令:
pip install openpyxl
即可安裝讀取Excel表格的庫。
Excel
Word和Excel在當今的信息世界真的占有極其重要的地位……雖然它也有各種弊端,但是也確實無可取代。特別是在中等規(guī)模的游戲項目中(例如大部分手游),他是配置數(shù)據(jù)的首選方案。
這里要注意,openpyxl等等新版的讀取工具,都僅支持xlsx格式的文件,不再支持老版本xls的文件。xls格式有很多弊病,以后會慢慢淡出歷史舞臺。
Json
Json是一種非常簡單明了的數(shù)據(jù)表示方法。想一想:是否任何數(shù)據(jù)都可以用字符串、數(shù)字、列表(List)和字典(Dictionary)表示呢?大概是可行的吧。
摘抄百度百科里面的例子:
{
"people":[
{
"firstName": "Brett",
"lastName":"McLaughlin"
},
{
"firstName":"Jason",
"lastName":"Hunter"
}
]
}
Json用[ ]表示一個列表,用{ }代表字典。如果你知道列表和字典大概是什么,就能猜出以上Json表示了兩個人的姓名,裝在一個列表中;而該列表又保存在一個字典中,這個字典有一個鍵people。Json特別擅長這種層級化的數(shù)據(jù)表示。
2、Excel轉Json的轉換方式定義
一個典型的道具表Items.xlsx內容如下:

前兩行是表頭。第二行是每個字段的名稱,第一行是描述行,指定了該字段的類型。
從第三行開始就是所有的數(shù)據(jù)了,直接將數(shù)值填寫進去即可。注意:、
注意類型,int是整數(shù),float是浮點數(shù),text是需要翻譯的文字,string是不需要翻譯的字符串。(本文只以這四種基本類型為例,其它可能還有字符串、整數(shù)、浮點數(shù)的數(shù)組)
必須有一個字段叫做id,轉換后的Json要以id作為主鍵。
不填描述或者名稱的列作為注釋,不需要轉換。
轉換Json的定義:

整個表格是一個大的字典,每行是字典中的一項,以id作為這一項的Key。
每行又是一個字典,按照?"字段名":數(shù)據(jù)?的方式組織。
這樣就不言自明地定義了整個表格。大家可以根據(jù)Excel的內容和Json內容對比即知。
3、用Python實現(xiàn)它
用Python實現(xiàn)這樣一個轉換的工作,分為幾個步驟:
讀取xlsx并分析為原始數(shù)據(jù)結構。
將原始結構根據(jù)類型定義轉換為字符串、數(shù)字等等,并組裝為字典。
將字典轉化為Json。
實現(xiàn)這些步驟需要多少Python代碼呢?400行?多了。100行?還是多了。實際上只需要70行代碼左右,就能完成以上目標。
第一部分:導入工具庫,和讀取表格的小函數(shù)

第二部分:核心的轉換代碼

(next函數(shù)和一種叫做迭代器的高級特性有關,由于前面有兩個next(rows)處理過前兩行,所以for循環(huán)時不會再處理前面兩行,明白大致意思即可……理解迭代器需要自行試驗。)
第三部分:調用以上函數(shù)

從第三部分很容易看出整個程序的執(zhí)行過程。
work_book就是讀取文件到數(shù)據(jù)結構里面,這個work_book的類型,是openpyxl庫定義的。我們要按照文檔使用它。
把work_book按行轉換成字典,并裝在一個大字典中。output_all就是整個一個大字典包含了表格里的所有東西。
用json庫可以一步將大字典轉化為json。
再次說明:以上代碼使用Python3編寫,用Python2會遇到編碼方面的問題(也不難解決)。
4、后續(xù)工作
我們的工具直接讀取了命令行參數(shù)作為表格名稱,這里可以自行擴展,或者使用BAT批處理的方式輔助使用。舉個例子,新建一個txt文件重命名為bat(看不到后綴的請修改文件夾選項,不要隱藏文件后綴):

編輯它,內容為:

這個%1什么意思呢?使用時只需要將items.xlsx拖拽到生成bat文件上,Windows就會自動生成命令:python load_xlsx.py items.xlsx items.xlsx.json。明白了嗎?

這種拖拽的方式在文件多了以后也不方便,可以自己舉一反三,使用更適合批量處理的方式。
我們拿到Json之后,如果要在Unity中使用,可以用LitJson庫進行讀取。
如果是拿到H5小游戲中,因為Json本來就是JavaScript的標準數(shù)據(jù)格式,可以無縫使用。
如果用在其它引擎中,只要有相應語言的庫即可。比如Lua讀取Json也是很容易的。
讀者可以自行查找相關資料。
5、總結
多年以前,我們使用表格的方式往往是用Excel原始表格->另存為txt(csv)格式->自己寫代碼分割、轉換成自定義的對象。
這個過程不僅繁瑣,而且還不標準、不簡潔。而到了今天我們已經可以用一小時的代價編寫一個十分簡單有效的表格分析工具了。
本文力求簡潔,所以去掉了所有繁瑣的內容,比如更多的字段類型,以及表格的錯誤檢測的代碼。我們用在項目中的工具,往往要考慮多方面需求,代碼長度往往在幾百行以上。不過無論怎樣復雜,其實本質過程是類似的。看看基本原理,反而能啟發(fā)我們做出更適合自己的工具。
OK,希望本文對在游戲開發(fā)的道路上的你有所啟發(fā)。

想系統(tǒng)學習游戲開發(fā)的童鞋,歡迎到:http://www.levelpp.com/?駐足圍觀。
游戲開發(fā)攪基QQ群:610475807?
微信公眾號:皮皮關