網站首頁 單機圖文攻略 單機視頻攻略 單機遊戲攻略 單機遊戲問答 遊戲常見問題 遊戲心得體會 手遊圖文攻略 手遊視頻攻略 手遊圖鑑攻略 手遊軟件教程 手遊攻略問題 網遊圖文攻略 網遊綜合攻略 網遊遊戲問答
當前位置:趣味遊戲館 > 單機遊戲攻略 > 

MOD製作教程 MOD源碼解析及開發指南|二、基本API解讀 城市:天際線

欄目: 單機遊戲攻略 / 發佈於: / 人氣:2.57W

二、基本API解讀

二、基本API解讀 城市:天際線 MOD製作教程 MOD源碼解析及開發指南

官方給出了一個基本的API文檔。但是。。真的是太基本了,基本什麼也做不了。但是給的這些API又確實非常基礎,無論你做什麼MOD,這幾個API還確實是很常用的。所以還是要大體上說一下的。

1、IUserMod

最簡單,最常用的interface,沒有之一。就是定義MOD的名稱和描述。基本沒其他作用。

代碼

using ICities;

namespace SuperBigTransport

{

public class Mod : IUserMod

{

public const int unit_number = 16;

public string Name

{

get

{

return "【SB】超級客運"+ unit_number * 5 + "人版 | SuperBigTransport "+ unit_number * 5;

}

}

public string Description

{

get

{

return "公交車容量改爲"+ unit_number * 5 + ",火車改爲" + unit_number * 5 * 8+ ",地鐵改爲" + unit_number * 5 * 6;

}

}

}

}

要注意的是namespace的定義。有些同學說我的mod怎麼衝突了,其實就是這個namespace重名了。所以,不同的mod必須要起不同的namespace,即使類名不同也不行。所以推薦跟你的mod名稱對應。

其他應該很簡單吧。。。我覺得好像沒什麼要解釋的。。。unit_number這個問題我後面再說。

2、LoadingExtensionBase

這個抽象類是在遊戲存檔加載時生效的(包括新建遊戲)。

4個方法,create、release是單例創建和銷燬時觸發的,這個貌似很少用

比較常用的是load和unload方法,就是存檔加載和退出時的方法。

看代碼:

using System;

using System.Collections.Generic;

using ColossalFramework;

using ICities;

using UObject = UnityEngine.Object;

namespace SuperBigTransport

{

public class LoadingExtension : LoadingExtensionBase

{

public override void OnLevelLoaded(LoadMode mode)

{//遊戲加載開始。

ForEachPrefab((VehicleInfo i) =>//在讀取所有車輛資訊時,對每一個車輛資訊進行處理。主意這裏不是每一輛車,是每一類車,注意是Info類

{

ReplaceVehicleAI

ReplaceVehicleAI

});

//遊戲加載結束

}

static void ReplaceVehicleAI

where TOldAI : VehicleAI

where TNewAI : VehicleAI, IAIReplacement, new()

{

var oldAI = i.gameObject.GetComponent();

if (oldAI == null)

return;

i.gameObject.AddComponent();//必須先把新的AI註冊進去,再取出來。。好奇怪的寫法,但是不這麼寫不行

var newAI = i.gameObject.GetComponent();

newAI.CopyFrom(oldAI);//AI也有屬性,如果要替換,必須把原有的屬性也全部對拷,否則就會出現各種奇怪的情況

i.m_vehicleAI = newAI;

UObject.Destroy(oldAI);

newAI.InitializeAI();

}

static void ForEachPrefab(Action f) where T : PrefabInfo

{

for (var i = 0u; i < PrefabCollection.LoadedCount(); i++)

f(PrefabCollection.GetLoaded(i));

}

}

interface IAIReplacement

{

void CopyFrom(T ai);

}

}

3、ThreadingExtensionBase

這個類其實也還算是常用的,就是在遊戲畫面(frame)每次重新載入時,觸發的地方。只是在公交增容這個mod裏我沒用到。需要注意的是,這個類中的update()方法,觸發的頻率非常高,不要試圖在這個方法裏做很複雜的事情,基本判斷個bool值,或者是算個簡單地數字就好了,指望這裏進行復雜的對象操作,或者是打印日誌什麼的,只有一個下場,就是遊戲永遠處於加載狀態,cpu飆升。

一般如果你要做介面什麼的,纔會用到這個類。

到這裏基本結束。剩下的幾個官方接口,我覺得都是很好理解的,沒什麼要特別說的了,而且公交增容這個mod也沒用到。我覺得一般大家看看也就能理解了。

所以呢,大家會感覺到,啊?這就是官方接口?怎麼沒見你寫什麼代碼來讓公交增容啊?恩,就是這樣的,所以我才說,官方給的API,基本什麼也做不了。