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

來源:樂享遊戲吧 2.62W

二、基本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,基本什麼也做不了。

熱門標籤