Unity手游開發(fā)札記——從零開始搭建手游開發(fā)的工具集

從8月中旬到現(xiàn)在12月底,四個(gè)多月的時(shí)間,經(jīng)歷團(tuán)隊(duì)組建、引擎熟悉、基礎(chǔ)工作流搭建、核心Demo開發(fā)以及一些技術(shù)預(yù)研的工作,這其中的每一項(xiàng)拿出來都可以寫出一篇文章。之前已經(jīng)聊過一些Unity和Lua相關(guān)的技術(shù),今天就主要聊一聊不那么技術(shù)的部分——對(duì)于一個(gè)從零開始組建的小團(tuán)隊(duì),游戲開發(fā)的一些基礎(chǔ)的工作流程和協(xié)作工具,希望可以幫助后來人節(jié)省部分時(shí)間,也拋磚引玉,想了解下其他團(tuán)隊(duì)中有什么更好的解決方案~

1. 為什么需要

商業(yè)游戲的開發(fā)是一個(gè)大工程,需要參與的職位很多——策劃、程序、美術(shù)、QA、營銷、外包等等,每一個(gè)職位的人也不少,比如策劃團(tuán)隊(duì)可能會(huì)有6-7人,程序團(tuán)隊(duì)可能會(huì)在10人以上,還會(huì)區(qū)分客戶端與服務(wù)端。要想讓游戲開發(fā)的工作可以更好更快地推進(jìn),確保每個(gè)職位之間和內(nèi)部的協(xié)作都是順暢的,需要工作流的精確定義和強(qiáng)大工具的支持。

在游戲開發(fā)中,程序的職責(zé)不僅僅是實(shí)現(xiàn)游戲玩法邏輯,構(gòu)建合理的工作流程和開發(fā)強(qiáng)力的工具集也是工作的一部分。這一部分內(nèi)容可能無法體現(xiàn)在最后發(fā)布的游戲中,但是在保證項(xiàng)目按時(shí)完成,提升整個(gè)團(tuán)隊(duì)的工作效率方面卻具有非常重大的意義。

在大公司中,這部分內(nèi)容會(huì)由IT、運(yùn)維等其他部門的同事提供,但是在一家小公司,一切只能自己動(dòng)手。作為程序組的負(fù)責(zé)人,特別是最初只有我一個(gè)程序的情況下,這份看上去只是進(jìn)行一些工具調(diào)研,然后部署的工作就毫無疑問地落在了我的身上。實(shí)話實(shí)說,相對(duì)于實(shí)現(xiàn)一個(gè)有意思的玩法,這個(gè)過程的確有些枯燥無趣,但回頭來看,這些工作讓整個(gè)團(tuán)隊(duì)可以順利地推進(jìn)工作,沉淀知識(shí),反思問題,也是一種成就感。

2. 包含哪些內(nèi)容

這里涉及到的絕大部分工具都是不自己開發(fā)的,而是對(duì)于世面上已有的工具的試用和選擇。本文也不進(jìn)行深入的技術(shù)探究,只從自己團(tuán)隊(duì)需求的角度出發(fā),記錄這些工具的選擇過程和決策原因。涉及的部分包括溝通工具、知識(shí)分享、版本管理、項(xiàng)目協(xié)作與管理、自動(dòng)化構(gòu)建工具、編輯器和部分程序開發(fā)工具這幾個(gè)方面。

3. 溝通工具

在團(tuán)隊(duì)組建的最初,我們只有一個(gè)微信群來進(jìn)行溝通。在搬進(jìn)新的工作地點(diǎn)之后,公司正式成立,就需要確定對(duì)內(nèi)和對(duì)外使用的溝通工具。這部分內(nèi)容看上去非常簡單,但也有很多值得思考的內(nèi)容。

3.1 郵件服務(wù)

郵件服務(wù)作為一個(gè)最為正式的溝通工具,無論是對(duì)內(nèi)還是對(duì)外,都需要可以正常使用??梢赃M(jìn)行的選擇是自己搭建一個(gè)郵件服務(wù)器還是使用比如騰訊或者阿里這樣大公司提供的企業(yè)級(jí)郵箱。在經(jīng)過一些調(diào)研、對(duì)比和討論之后,出于對(duì)郵件內(nèi)容安全性的考慮,我們選擇了自己搭建的方式。
使用MDaemon作為郵件服務(wù)器,申請(qǐng)了公司的域名,購買了阿里云的主機(jī),搭建過程交給了一個(gè)朋友幫忙(所以不要問我是不是破解版,我不會(huì)回答的。。。),目前的工作方式是我自己遠(yuǎn)程上去手動(dòng)維護(hù)郵件賬戶和列表。(這有點(diǎn)蛋疼,但不頻繁還可以忍受...)
客戶端我們沒有強(qiáng)制規(guī)定,但大部分使用了網(wǎng)易的閃電郵,這完全是習(xí)慣使然,其中的日歷和會(huì)議邀請(qǐng)功能還是很實(shí)用的。

3.2 即時(shí)通訊工具

每個(gè)團(tuán)隊(duì)都需要IM工具,在網(wǎng)易的時(shí)候使用的是POPO,但是作為一個(gè)對(duì)外好久沒有更新的工具,而且是“老東家”的產(chǎn)品,有點(diǎn)怕。我們調(diào)研了Slack、釘釘、微信企業(yè)版,考慮了QQ,最終選擇了釘釘。我個(gè)人很喜歡Slack這一類型的IM工具——使用頻道代替群的概念,信息永久保存、可以修改搜索消息,這些設(shè)計(jì)減少了水群的存在,也讓溝通的人說話更加謹(jǐn)慎高效。

但是,Slack沒有中文版本,詢問了一下開發(fā)者,貌似近期也沒有推出的計(jì)劃,而國內(nèi)幾個(gè)小團(tuán)隊(duì)做的相似版本不太敢去用,怕哪天倒閉了聊天內(nèi)容都沒辦法導(dǎo)出來。相比之下,雖然釘釘有很多我個(gè)人不喜歡的地方——譬如“釘一下”的概念是為老板服務(wù)的——我們還是無奈選擇了它,有如下幾個(gè)原因:

  1. 帶有簡單的OA,比如部門管理、簽到、審批,這些是我們初期需要但又不想花太多時(shí)間去開發(fā)新的內(nèi)容;
  2. 有比較完備的桌面版和移動(dòng)版;
  3. 使用方式還是比較常規(guī)的方式,適合策劃和美術(shù)上手;
  4. 有Open API提供,可以進(jìn)行一些工具的開發(fā);
  5. 阿里“爸爸”怎么說也是家大公司,倒掉的概率比較小。。。對(duì)于我們這種小團(tuán)隊(duì)的信息也懶得偷看(迫害妄想癥)。。。

當(dāng)然用了這幾個(gè)月也有很多槽點(diǎn)想吐:

  1. 完全沒辦法圖文混排,美術(shù)吐槽這點(diǎn)吐槽了好久;
  2. 傳輸文件不是點(diǎn)對(duì)點(diǎn)的方式,而是上傳然后再下載,也無法傳輸文件夾,我們現(xiàn)在局域網(wǎng)傳輸都不用它了,嫌慢又怕外泄;
  3. 出于安全的考慮,Open API不開放獲取聊天信息的接口,導(dǎo)致我們現(xiàn)在一些想做的便捷功能沒辦法做;
  4. 我只把它當(dāng)做一個(gè)IM工具,不想釘別人,也不想被別人釘……(純吐槽)

總之,小而精的團(tuán)隊(duì),可以嘗試下Slack~~

3.3 現(xiàn)場溝通

對(duì)于小團(tuán)隊(duì)來說,吼一嗓子,或者跑到位置上去聊,可能是最為快速高效的工作方式了。這不需要任何工具,只是有時(shí)候需要提醒注意討論對(duì)于其他人工作效率的影響,比較長或者涉及人比較多的討論還是建議去會(huì)議室進(jìn)行。但最好進(jìn)去之前明確討論主題,注意討論時(shí)間,否則很容易錯(cuò)過飯點(diǎn)。。。(流淚)

4 知識(shí)共享

團(tuán)隊(duì)開發(fā)需要知識(shí)共享,一些規(guī)范也需要讓別人可以方便地查找,對(duì)于后進(jìn)入團(tuán)隊(duì)的人,也可以盡快熟悉規(guī)范,避免一些坑重復(fù)去踩。因此我們需要一些知識(shí)和文件共享的方式。

4.1 文件共享

文件共享分為兩種,不需要版本控制的我們使用了FTP的方式,購買了一臺(tái)windows server的服務(wù)器放置在了內(nèi)網(wǎng),然后直接使用了系統(tǒng)自帶的FPT服務(wù),用于文件共享和一些內(nèi)網(wǎng)的文件傳輸中轉(zhuǎn),簡單粗暴。
需要版本控制的文件,比如策劃文檔,我們使用了SVN進(jìn)行管理。

4.2 文檔共享

基本上是出于個(gè)人習(xí)慣的考慮,文檔共享方面推薦團(tuán)隊(duì)使用了印象筆記。一開始團(tuán)隊(duì)中有人吐槽它沒有文件夾管理太難用,其實(shí)我覺得Tag的方式比文件夾更加方便合理。當(dāng)然也有一些不方便的地方:

  1. 無法支持兩個(gè)人同時(shí)編輯一份文檔,甚至一個(gè)人看的時(shí)候光標(biāo)只要在文檔內(nèi)就會(huì)把文檔鎖定別人無法修改。當(dāng)時(shí)考慮了一下石墨文檔,但是沒有推廣去用,需要的朋友可以去看下。
  2. 對(duì)于Markdown的支持不夠好,排版太難看。。。嘆氣。馬克飛象雖然可以用,收費(fèi)不說,還不能在印象筆記中修改,怎么共同編輯,摔。
  3. 美術(shù)不樂意用,嫌棄說都是文字不夠直觀……這個(gè)我也沒辦法,手動(dòng)攤手。

知識(shí)共享和記錄是一件非常重要的事情,前兩天就遇到部署Jenkins的時(shí)候沒有做記錄,然后重啟機(jī)器遇到問題忘記怎么弄又搗鼓半天的事情。年紀(jì)大了,事情多了,腦袋不好使了,爛筆頭更重要了。更何況,很多東西是規(guī)范性的,需要其他職位的人遵守,口頭的約定總是會(huì)忘記或者記不清楚,落實(shí)到文字上才更有約束力。

5 版本管理

前面提到了,策劃文檔使用了SVN管理,游戲工程也是選擇了SVN,原因是團(tuán)隊(duì)大部分成員習(xí)慣了SVN的使用。如果只有程序團(tuán)隊(duì)使用,可能就去推行Git了,但是想想要給美術(shù)和策劃培訓(xùn)Git,還有解釋本地版本和服務(wù)器版本的概念就頭疼。在剛進(jìn)入網(wǎng)易的時(shí)候有一段時(shí)間是跟著美術(shù)處理各種svn沖突,clean up無效等問題,深深體會(huì)到svn和git這種按照程序員理性思維建立的工具,感性的美術(shù)需要花挺多精力去理解。

5.1 外鏈問題

在工程中,避免不了的是有些目錄需要同時(shí)出現(xiàn)在多個(gè)地方,比如客戶端與服務(wù)端可能會(huì)共用一份數(shù)據(jù)文件,當(dāng)數(shù)據(jù)修改的時(shí)候,在多處進(jìn)行修改是不合適的做法,維護(hù)起來很麻煩。于是版本管理軟件提供了外鏈的功能,比如svn的externals。但是外鏈有一個(gè)很嚴(yán)重的問題是當(dāng)你需要建立分支的時(shí)候,如果不做任何修改,外鏈還會(huì)是指認(rèn)到原始trunk上的路徑,當(dāng)外鏈很多的時(shí)候,就需要針對(duì)每個(gè)外鏈單獨(dú)建立分支,然后修改整個(gè)分支中所有外鏈的路徑到正確的分支位置去。在項(xiàng)目后期,需要編寫一個(gè)單獨(dú)的腳本來進(jìn)行分支的創(chuàng)建,而不是一條簡單的cp指令就可以了。與外鏈相對(duì)應(yīng)的是所謂的“內(nèi)鏈”,即路徑不再是一個(gè)以https或者svn開頭的全地址路徑,而是一個(gè)類似../../../CommonData這樣的相對(duì)路徑。這樣,只要保證分支是在根目錄創(chuàng)建的,內(nèi)鏈就是分支內(nèi)部的路徑,不需要做任何額外的修改。當(dāng)然,內(nèi)鏈無法跨svn repository運(yùn)作,如果是另外一個(gè)svn repository的內(nèi)容,只能使用外鏈的方式。
SVN的這部分構(gòu)建和設(shè)計(jì)工作最好在項(xiàng)目初期做好規(guī)劃,否則后期進(jìn)行分支維護(hù)的時(shí)候會(huì)比較麻煩,容易出錯(cuò)。

5.2 工具使用

SVN服務(wù)使用了最為簡單的VisualSVN Server,帶有g(shù)ui,方便易用,目前比較惡心一點(diǎn)的是為別人創(chuàng)建賬號(hào)的時(shí)候密碼輸入只能在界面上進(jìn)行,暫時(shí)沒時(shí)間調(diào)研更好的工具來自己創(chuàng)建賬號(hào)。權(quán)限的分配完全按照Group進(jìn)行,從不單獨(dú)針對(duì)某一個(gè)賬號(hào)進(jìn)行權(quán)限分配,這點(diǎn)是在網(wǎng)易的時(shí)候維護(hù)SVN權(quán)限時(shí)老大強(qiáng)調(diào)的一點(diǎn),方便,不容易出錯(cuò)。雖然是小團(tuán)隊(duì),但是SVN的權(quán)限管理還是要做好,否則代碼泄露出去隱患還是很大的。

SVN服務(wù)端的Hook目前只加了兩個(gè):

  1. 不允許提交過短的log,強(qiáng)制防止有人偷懶不寫log;
  2. 允許log被提交者自己編輯。

客戶端基本推廣的是小烏龜,Mac和Linux就使用命令行。美術(shù)同學(xué)有人喜歡裝一個(gè)中文語言包,就按照各自的喜好去用。這里有幾個(gè)小Tips提供給不太熟悉小烏龜?shù)娜耍?/p>

  1. 按住Shift點(diǎn)擊右鍵,彈出的svn菜單里會(huì)多一些比如“刪除不再版本控制下的文件”這樣的快速選項(xiàng);
  2. 在Settings中,Main Context Menu中可以添加常用的菜單選項(xiàng),比如revert、Show Log,這樣就不需要進(jìn)入SVN的二級(jí)菜單了;
  3. 如果在update的時(shí)候,有更新的文件被比如3DS Max、Photoshop等軟件打開著的時(shí)候,可能會(huì)出現(xiàn)被鎖死的情況,這時(shí)候提示你要進(jìn)行Clean up操作,在關(guān)閉了相應(yīng)軟件之后,如果Clean up仍然失敗,可以嘗試使用如下的代碼來解決。如果仍然不行,可以只刪除掉.svn文件,然后重新check out,這樣既可以保留已有的修改,又可以避免下載所有的文件,加快速度。
sqlite3.exe .svn/wc.db "select * from work_queue"
sqlite3 .svn/wc.db "delete from work_queue"
ECHO "DONE!"
PAUSE

5.3 美術(shù)外包資源管理

除了游戲工程之外,美術(shù)外包或者內(nèi)部制作的Max等資源也需要進(jìn)行一定的版本管理。本質(zhì)上說,使用svn對(duì)這部分資源進(jìn)行管理并不合適,因?yàn)檫@些資源大都是二進(jìn)制而非文本的,svn這種代碼版本管理軟件并不非常合適,更好的選擇是NXN和Preforce這樣的——有圖形化的樹狀結(jié)構(gòu)界面,不需要完整下載到本地,修改之前必須獲取鎖——這些這對(duì)于美術(shù)來說是更加直觀、容易理解的方式。
但是,NXN收費(fèi)很貴,Preforce也只允許20人以下的團(tuán)隊(duì)免費(fèi)使用。花費(fèi)了一些時(shí)間去做調(diào)研,但是目前我們出于統(tǒng)一和成本的角度考慮,依然使用SVN來對(duì)這部分的美術(shù)資源進(jìn)行管理,后續(xù)可能會(huì)進(jìn)行一些改進(jìn)。

在一個(gè)團(tuán)隊(duì)中,推廣一個(gè)工具的使用需要不少的人力成本,尤其是美術(shù)和程序是兩種不太相同的思維方式,而且很多美術(shù)對(duì)于工具使用都是一種機(jī)械記憶而非理解原理的方式,因此這也限制了一些可能更好的工具的應(yīng)用。

6. 項(xiàng)目管理與協(xié)作

項(xiàng)目管理這一部分也是花費(fèi)了較多時(shí)間的,調(diào)研和試用了一系列的工具,稍微整理一下:

  1. Project和Excel,這是最為傳統(tǒng)的項(xiàng)目管理軟件了,簡單來說基于甘特圖,適合項(xiàng)目經(jīng)歷做排期和監(jiān)控項(xiàng)目進(jìn)度,但是對(duì)于團(tuán)隊(duì)中各個(gè)職位的同事協(xié)作幫助并不大。
  2. Redmine,在網(wǎng)易的時(shí)候也是使用Redmine進(jìn)行項(xiàng)目管理的,后來網(wǎng)易公司也自己開發(fā)和擴(kuò)展了“易協(xié)作”這樣的平臺(tái)。這應(yīng)該是最為老牌和經(jīng)典的項(xiàng)目協(xié)作軟件了,免費(fèi)開源,也有比較豐富的插件提供。
  3. 偏向敏捷開發(fā)的協(xié)作平臺(tái),比如teambition、TowerWorklite等等,試用了幾個(gè),感覺大同小異,和Redmine的區(qū)別在于更加偏向于小團(tuán)隊(duì)敏捷開發(fā),一些跨職位的流程功能提供不是非常全面,比如有些就沒有提供從策劃提單、程序做單、QA測單的流程性的東西。

目前我們采用了內(nèi)網(wǎng)Redmine+worklite的方式。出于搭建方便,節(jié)省時(shí)間的考慮,從淘寶購買了一套組織好插件的所謂“一鍵部署”的Redmine版本,自己做了兩個(gè)簡單的調(diào)整:

  1. 我的工作臺(tái)看板增加若干列,提供更多信息;
  2. ticket可以進(jìn)行主題和描述的編輯功能。
    部署過程還算順利,除了遇到了端口和VisualSVN Server使用的端口沖突之外,沒遇到太多問題,后面修改這兩個(gè)調(diào)整花費(fèi)了一些時(shí)間,對(duì)于Ruby和Web開發(fā)都不是很熟悉,一點(diǎn)點(diǎn)通過代碼搜索來尋找修改的地方,然后不斷測試修改才搞定。
    Worklite我們用在對(duì)外美術(shù)外包的一些工作管理和面試流程管理上,因?yàn)橥饩W(wǎng)方便訪問,所以這么來做。我個(gè)人是很想推進(jìn)一些敏捷協(xié)作平臺(tái)的使用的,無論從理念上還是從美感上,可能都比Redmine要舒服一些,但是最終在試用之后沒有這么來做的原因有如下幾個(gè):
  3. 數(shù)據(jù)安全性的考慮,項(xiàng)目的一些內(nèi)容,比如玩法設(shè)計(jì)可能會(huì)在任務(wù)單中有體現(xiàn),這些是想保密的,放在外網(wǎng)服務(wù)器還是有些擔(dān)心;
  4. 做平臺(tái)的小公司倒掉了,我們?cè)趺崔k?遷移的成本很大。
  5. 比如前文提到過的從策劃提單、程序做單、QA測單的工作流程,很多敏捷工具不能很好地定義和推進(jìn);
  6. 有一些硬性的功能修改需求,使用Redmine花費(fèi)一些時(shí)間還有可能實(shí)現(xiàn),使用別人的平臺(tái),可能只能去提建議;
  7. 在試用的時(shí)候,遇到過外網(wǎng)訪問困難的情況,比如刷新慢,上傳文件比較慢等等問題,還是內(nèi)網(wǎng)效率高速度快;

對(duì)于工具的選擇,往往有各方面的限制,其實(shí)不完全是決定著自己的喜好可以左右的……

7. 自動(dòng)化構(gòu)建工具

網(wǎng)易內(nèi)部有一套很有趣的網(wǎng)易POPO機(jī)器人,來輔助比如導(dǎo)表、打包這樣的自動(dòng)化構(gòu)建過程,減少程序員的工作量。會(huì)申請(qǐng)一個(gè)特定的機(jī)器人賬號(hào),把它加入到一些工作群,只需要在這些群里輸入比如“Android打包”,它就會(huì)構(gòu)建已經(jīng)建立好的自動(dòng)化腳本進(jìn)行打包,并把結(jié)果輸出在群里,比如失敗的錯(cuò)誤信息,成功之后的下載鏈接等等。
這套東西非常方便,最初選擇釘釘?shù)臅r(shí)候看到有Open API就想去構(gòu)建一下這套自動(dòng)化的流程,后來經(jīng)過測試和向官方詢問發(fā)現(xiàn)無法通過接口獲取群的聊天信息,其實(shí)后來也想通過網(wǎng)絡(luò)抓包、釘釘軟件破解等方式來做,但是太過麻煩,而且維護(hù)起來比較費(fèi)時(shí),所以選擇了使用Jenkins+釘釘?shù)姆绞健?br> Jenkins本身就是自動(dòng)化持續(xù)構(gòu)建的工具,釘釘只是用來反饋一些信息給策劃、美術(shù)這些不習(xí)慣使用Jenkins的同事,比如打包結(jié)果,導(dǎo)表的錯(cuò)誤信息等。這里提供一個(gè)簡單的通過釘釘發(fā)送消息的Python腳本,需要的可以拿去用:

# -*- coding: utf-8 -*-
import time
import sys
import Config
from HTTPUtils import http_get
from HTTPUtils import http_post

class TokenManager(object):
    """Token每隔兩個(gè)小時(shí)過期一次,再次獲取刷新時(shí)間間隔。"""
    def __init__(self):
        super(TokenManager, self).__init__()
        self._token = None
        self._update_time = 0

    def get_token(self):
        if not (self._token and (time.time() - self._update_time < 1000)):
            self._token = get_access_token()
            self._update_time = time.time()
        return self._token
        
token_mgr_instance = TokenManager()

def get_access_token():
    access_token = None
    ret, msg = http_get("https://oapi.dingtalk.com/gettoken?corpid=%s&corpsecret=%s"%(Config.CORP_ID, Config.CORP_SECRET))
    if ret:
        access_token = msg["access_token"]
    return access_token

def send_message(msg, chat_id = Config.ROBOT_CHAT_ID):
    access_token = token_mgr_instance.get_token()
    data = {"chatid" : chat_id, 
            "sender" : Config.ROBOT_ID,
            "msgtype": "text",
            "text":{
                "content" : msg
            }}
    ret, msg = http_post("https://oapi.dingtalk.com/chat/send?access_token=%s"%access_token, data)
    return ret

http_gethttp_post兩個(gè)方法使用了Requests,基本定義如下:

import requests

def http_get(url):
    try:
        response = requests.get(url, timeout=10)
    except Exception, e:
        logger.error(e)
        return None
    result = json.loads(response.text)
    return handle_result(result)


def http_post(url, data):
    headers = {
        "Content-Type": "application/json",
        "Accept-Charset": "utf-8"
    }
    try:
        response = requests.post(url, headers=headers, data=json.dumps(data), timeout=10)
    except Exception, e:
        logger.error(e)
    result = json.loads(response.text)
    return handle_result(result)

最初的時(shí)候使用urllib2,但是在mac系統(tǒng)上遇到了SSL錯(cuò)誤的問題,研究半天最后還是使用了Requests庫來做。Jenkins的搭建也是花費(fèi)了一些時(shí)間和精力,包括在Mac機(jī)器上的權(quán)限問題,編碼問題,SVN權(quán)限問題等等,可惜的是當(dāng)時(shí)沒有做完整詳細(xì)的記錄,一些坑沒有辦法完全記錄下來,但是遇到了之后通過Google都可以找到解決方案。

通過這一套方案,加上一些基于Python腳本構(gòu)建的自動(dòng)化打包、導(dǎo)表等流程,就可以讓一些原本需要程序來做的工作編程策劃/美術(shù)驅(qū)動(dòng)機(jī)器人來完成,沒有錯(cuò)誤的情況下無需程序參與。

8. 編輯器

游戲開發(fā)的最理性情況,是程序編寫玩法框架,策劃來填充游戲內(nèi)容,比如UE4的藍(lán)圖功能、Unity的PlayMaker插件,就是一種對(duì)于程序工作的釋放。但是在一個(gè)大型商業(yè)游戲的開發(fā)中,引擎原生提供的編輯工具還是無法為策劃、美術(shù)和UI提供完整的游戲內(nèi)容實(shí)現(xiàn)工具,需要程序來實(shí)現(xiàn)一些與游戲玩法相關(guān)的編輯器或者代碼功能,比如技能編輯、戰(zhàn)場編輯器等等。

網(wǎng)易早期,加上現(xiàn)在了解到的一些創(chuàng)業(yè)小團(tuán)隊(duì),是以Excel表為核心提供策劃編輯的功能。Excel的強(qiáng)大功能和靈活的編輯方式的確為策劃提供了很多便利,但是還有一些小問題:

  1. 比較難做到所見即所得,即對(duì)于有些東西的編輯不夠直觀,比如場景中的位置等;
  2. 一些多維的數(shù)據(jù)需要進(jìn)行拆分到多張表里的方式實(shí)現(xiàn),設(shè)計(jì)和填寫上會(huì)有些困難;
  3. 比較難限制策劃填寫一些數(shù)據(jù)的正確性,比如一個(gè)外鍵值,策劃填寫時(shí)需要去其他表中查詢這個(gè)key值是否存在,編輯器就可以提供下拉列表這樣的方式來做。(Excel使用比較麻煩的方式也可以做到,或者在導(dǎo)表程序的后處理中檢查。)

對(duì)于這樣的數(shù)據(jù),我們采用編輯器的方式來實(shí)現(xiàn),之前項(xiàng)目使用了一套元數(shù)據(jù)的編輯器框架,不需要維護(hù)編輯器的人修改界面,只需要簡單增加或者修改一些元數(shù)據(jù)就可以了。Unity引擎本身的編輯器就是類似這樣的實(shí)現(xiàn)思路,因此我們無需做額外的太多工作。

編輯器的開發(fā)需要消耗程序不少的工作量,因此有時(shí)候在進(jìn)度緊張人力不夠的情況下,需要評(píng)估編輯器能夠產(chǎn)出的價(jià)值。當(dāng)編輯器真正能夠讓使用者的工作效率得到的提升遠(yuǎn)大于程序付出的時(shí)候,編輯器的意義才能夠展現(xiàn)出來。

9. 程序開發(fā)工具

程序開發(fā)工具可以說的有很多,這里分為Unity和Lua腳本兩部分進(jìn)行簡單的描述。

9.1 Unity引擎部分

選擇了Unity作為游戲開發(fā)的引擎,為了方便熱更使用了Lua作為游戲邏輯開發(fā)的腳本語言。Unity引擎對(duì)于游戲調(diào)試的支持還是很好的,我們?cè)陂_發(fā)便利性方面只引入了兩個(gè)增強(qiáng)型的工具:

  1. Unity Editor內(nèi)的SVN集成插件:Svn Tools Lite
  2. 控制臺(tái)Log查看支持搜索等功能的擴(kuò)展:Console Enhanced Free

9.2 Lua部分

Lua語言方面,我們使用了Tango作為跨Lua虛擬機(jī)通訊的解決方案。在游戲腳本開發(fā)中,支持?jǐn)帱c(diǎn)調(diào)試通常比較困難,或者在聯(lián)網(wǎng)情況下并不非常好用,比如有可能一斷點(diǎn)就網(wǎng)絡(luò)就斷掉了,因此類似于Telnet的方案,可以在另外一個(gè)Lua虛擬機(jī)中直接連接游戲進(jìn)程中的Lua虛擬機(jī),進(jìn)行一些屬性查看、方法調(diào)用,也是一種非常實(shí)用的方法,甚至可以支持遠(yuǎn)程連接移動(dòng)設(shè)備進(jìn)行調(diào)試。

這種多虛擬機(jī)的整合方案在網(wǎng)易內(nèi)部應(yīng)用得非常廣泛,因?yàn)槲覅⑴c的大部分項(xiàng)目都使用了Python語言,因此使用RPyC作為解決方案,為游戲引擎外運(yùn)行的編輯器開發(fā)提供了非常多的便利,與測試用的服務(wù)器相連接,也可以通過編輯器/控制臺(tái)直接更新服務(wù)器內(nèi)存數(shù)據(jù)。在手游項(xiàng)目中,也大量的使用于設(shè)備上的測試??上У氖悄壳笆褂肔ua語言,Tango雖然也提供了類似的功能,但是相比如RPyC來說完備性和易用性差很多,而且它是一個(gè)5年沒有維護(hù)的項(xiàng)目了。。。好在基本的功能還是可以使用的,因此也就不再挑剔什么了。

在游戲邏輯的開發(fā)中,可以利用Lua腳本語言的動(dòng)態(tài)特性,提供運(yùn)行時(shí)Reload的功能,在不重啟游戲的情況下,修改游戲邏輯之后直接一鍵Reload游戲代碼,然后查看修改結(jié)果。這可以非常大地提升游戲開發(fā)效率,當(dāng)然對(duì)于添加函數(shù)或者修改數(shù)據(jù)結(jié)構(gòu)這樣的修改可能會(huì)存在一些問題,適用性有一定的限制。

Lua的斷點(diǎn)調(diào)試方式我們目前還沒有走通,ToLua#的中提供了一套基于zerobrane的調(diào)試方法,但是我們?cè)囉眠€存在一些問題,斷點(diǎn)只能停在main函數(shù)入口的地方,其他位置無法斷點(diǎn),還需要一些時(shí)間踩坑。

Lua這部分可以聊的有很多,語言特性、面向?qū)ο蟮慕Y(jié)構(gòu)等等,有時(shí)間計(jì)劃拿出單獨(dú)的一篇博客來講,這里就只提供上面的幾個(gè)工具的實(shí)現(xiàn)思路,有興趣的可以留言詳細(xì)聊。

10. 總結(jié)

洋洋灑灑寫了這么多,其實(shí)有技術(shù)含量的東西不多,但這些零零碎碎的工作,卻又是從零開始組織一個(gè)手游開發(fā)公司必不可少的過程。一個(gè)程序的負(fù)責(zé)人必須利用有限的時(shí)間和人力,使用盡量少的資源搭建起讓所有職位都可以正常運(yùn)轉(zhuǎn)與合作的工作流程與工具集合,而且盡量讓這個(gè)流程更高效。

從大公司的“溫室”里“逃”出來,想做些不一樣的事情,但初始要做的,卻是這些在大公司不屑于去做的事情。這雖然有點(diǎn)諷刺的以為,但這個(gè)過程,也是學(xué)習(xí)和反思的過程——從之前的工作流程中提取好用高效的部分,反思哪些流程是可以改變和改進(jìn)的。慚愧的是,現(xiàn)在搭建和使用的這些工具,大多還是“網(wǎng)易 like”的模式,不過已經(jīng)看清了那些好處和壞處,等以后有人力和時(shí)間的時(shí)候,可以進(jìn)行大刀闊斧的改進(jìn),這些是在大公司不太會(huì)去思考和改變的。

2016年12月25日夜 于杭州家中
PS:圣誕夜,老婆去馬來西亞學(xué)習(xí)潛水了,我自己一個(gè)人在家寫這篇總結(jié),想想還有點(diǎn)凄涼。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評(píng)論 25 708
  • 0. 前言 有段時(shí)間沒有寫博客了,主要原因是事情有點(diǎn)多,一件接著一件,沒有太多整理總結(jié)的機(jī)會(huì)。游戲開發(fā)逐漸進(jìn)入鋪量...
    董夕閱讀 7,347評(píng)論 15 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,947評(píng)論 18 139
  • 親愛的孩子: 今天晚上到念英語的時(shí)間了,我喚你幾次,卻不見回應(yīng)。走到你的房間,才發(fā)現(xiàn)不知何時(shí),你已放下手中書,酣然...
    晶晶亮的稅月閱讀 376評(píng)論 0 0
  • Struts2注解 1Struts2注解的作用 使用注解可以用來替換struts.xml配置文件!!! 2導(dǎo)包 必...
    拂清風(fēng)閱讀 839評(píng)論 0 1