二、基本API解讀 城市:天際線 MOD製作教程 MOD源碼解析及開發指南
二、基本API解讀
官方給出了一個基本的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
{
var oldAI = i.gameObject.GetComponent
if (oldAI == null)
return;
i.gameObject.AddComponent
var newAI = i.gameObject.GetComponent
newAI.CopyFrom(oldAI);//AI也有屬性,如果要替換,必須把原有的屬性也全部對拷,否則就會出現各種奇怪的情況
i.m_vehicleAI = newAI;
UObject.Destroy(oldAI);
newAI.InitializeAI();
}
static void ForEachPrefab
{
for (var i = 0u; i < PrefabCollection
f(PrefabCollection
}
}
interface IAIReplacement
{
void CopyFrom(T ai);
}
}
3、ThreadingExtensionBase
這個類其實也還算是常用的,就是在遊戲畫面(frame)每次刷新時,觸發的地方。只是在公交增容這個mod裏我沒用到。需要注意的是,這個類中的update()方法,觸發的頻率非常高,不要試圖在這個方法裏做很複雜的事情,基本判斷個bool值,或者是算個簡單地數字就好了,指望這裏進行復雜的對象操作,或者是打印日誌什麼的,只有一個下場,就是遊戲永遠處於加載狀態,cpu飆升。
一般如果你要做界面什麼的,纔會用到這個類。
到這裏基本結束。剩下的幾個官方接口,我覺得都是很好理解的,沒什麼要特別說的了,而且公交增容這個mod也沒用到。我覺得一般大家看看也就能理解了。
所以呢,大家會感覺到,啊?這就是官方接口?怎麼沒見你寫什麼代碼來讓公交增容啊?恩,就是這樣的,所以我才說,官方給的API,基本什麼也做不了。