城市:天際線 MOD製作教程 MOD源碼解析及開發指南
城市:天際線 MOD製作教程 MOD源碼解析及開發指南
一直想寫這篇文章,但是總覺得寫出來也沒幾個人人能看得懂,太過於小眾,就算看得懂,又能有幾個人耐得住性子去調代碼呢,所以就拖啊拖啊到現在。但是,中國人做的mod實在是太少了(當然整個工坊也就200來個=.=),咬咬牙還是寫吧,希望能多看到點國人做的mod,我也有個能交流的朋友是不。
本文主要闡述天際線AI類MOD開發的基礎,包括天際線概念框架體系、基本API、進階開發以及注意事項,希望能拋磚引玉,給有編程基礎的朋友一個入門的方向。更多的造化就看您的努力了。本文將以公交增容MOD的源碼為例進行講解。
需要閱讀者必須具備基本的面向對象基礎,可使用vs studio進行開發及調試。另外由於本人主要從事java開發工作,c#純屬自學,所以有關概念表述的不一定十分準確,各位看客要自行甄別。
如何搭建開發環境我在這裡就不再廢話了(我隻提一句,是library類工程),如果你不知道怎麽搭建開發環境,基本也看不懂我這篇文章。對了,按照官方的說法,你只要把c#代碼寫好,扔到mod檔案夾下面就好了,他們會編譯這些代碼。但是我沒有成功,我是在vs裡面直接build成dll後扔到mod裡的,效果一樣。
一、首先是天際線的基本概念體系,以及AI在其中所起的作用。
遊戲裡有很多的建築物、人、車等事物。這些東西都有自己的屬性,比如位置在哪?顏色?是生老病死,還是3級5級?移動速度?等等,描述的是物體的客觀狀態。還有一類,就是這些事物的行為方式:
例如小人是去買東西,還是去上班?出門是坐公交還是自己開車?公車下一站往哪開?建築物是更新還是廢棄?這些基本都是由各個物件自己決定的,那麽這個決策部分,就稱之為AI,用面向對象來說,就是行為/方法(method)
比如市民,市民是一個類,名字、男女、年齡、教育程度、健康狀況、是否在開車等等,是屬性。但是市民有幾十萬,每一個市民都有自己不同的屬性,有幾十萬的對象,在記憶體裡都要佔用相應的位置,但是他們的AI是一致的,AI只有一個。修改了這個AI,所有市民的行為方式都會相應變化。
然後是天際線中跟AI相關的有如下常見類名後綴:
AI、Manager、Info(當然還有很多與UI相關的,我就不再列舉了,跟本文關係不大)
AI毫無疑問就是AI類的了,CitizenAI就是市民AI(這裡我簡單化了,後面我會詳細講到,這個CitizenAI其實不是“居民AI”)
Manager是所有相關對象引用的管理類,比如CitizenManager就是管理所有市民的管理器,無論是創建一個市民,還是查詢所有生病的市民,都要通過這個管理器
Info是一類對象的“模板”。這裡我用建築物來解釋。比如警察總局,就是一個BuildingInfo類的對象。裡面定義了這個物件的名稱叫“警察總局”,所有警察總局的屬性,比如造價、維護費用、佔地大小等等,都是在這裡的,警察總局的AI,也是在這裡有一個引用(AI是另外一個類)。不管你在遊戲中建幾個“警察總局”,這個BuildingInfo對象都會只有一個,但是不同位置的警察總局,會有多個不同的Building對象(其實是struct)來表達,比如具體的xz位置(y在天際線裡是高度軸),或者你給他改名叫“天下第一警察總局”,那麽名字也是存在這裡的。
接著,是跟AI相關的橫向概念。
天際線裡AI總共分4類:建築物(Building)、車輛(Vehicle)、市民(Citizen)、路網(Net)。
每類都會有一個上述英文名稱的struct來表達數據, 以及配套的前述3個類(AI、Manager、Info),和眾多的相關衍生類。
當然這也只是一個最基本的分類,最深的繼承關係可達7層,由於此圖是在是太大,所以我在下圖僅以市民AI舉例說明:
在天際線中,CitizenAI其實應該翻譯成是“生物AI”好點。它有2個子類:動物AI和人類AI。也就是說,你在遊戲中看到的鳥啊,寵物狗啊什麽的,其實都是算作是Citizen,都用Citizen這個struct來存儲數據的,佔用那104萬上限。動物AI就不說了。人類AI中又分為服務人員AI(就是消防隊那個滅火的小人、靈車抬屍體的小人等)、旅遊者AI和居民AI。這裡最多的就是居民了,104萬的上限,我看有人達到了101萬。
那麽,這所有的104萬的Citizen,全部都是由CitizenManager來管理的。CitizenManager中有創建市民的方法,銷毀的方法,查詢的方法等。當前市民數量、Citizen集合的引用等資訊,都是這個類的變量,市民的總數上限啊、市民出行開車的概率啊、生孩子的概率啊、成為gay的概率啊等等常量,也都在這裡。這個CitizenManager是單例的,你不能顯式的去創建這個對象,調用單例的方法後面的代碼裡有。
另外還要提一句,市民上限是100萬多點,但是不代表所有的市民都會被顯卡“畫出來”,只有被實例化(Instance)的市民,才會交給frame,去具體的在界面上畫出來。Instance的上限,我記得是65000+,所以大家不用擔心人多了顯卡“畫”不動