[KF2][Mut&Gm Tutorial]Modding第二步:開始制作你的第一個簡易Mutator
在這之前請確保
[KF2][Mut&Gm Tutorial]Modding第一步:設置好KF2的UnrealScript編譯環境
如果你是一個電腦愛好者但是沒有編程基礎,請打開記事本或者npp跟著學習(下文統稱初級玩家);如果你是一個編程愛好者或者Experienced Programmer(高級玩家),請按照以上文章配置好UsIDE跟著學習
註意:此教程制作出來的插件只適用於單人單機SOLO模式
涉及到服務器以及多人的插件
因為涉及到PRI和GRI等網絡流對象(玩家網絡復制信息 遊戲網絡復制信息),所有教程將不會講解,請自行學習
在此,我將會根據一個實例來講解Mutator的基本結構,包括:
1.類繼承以及基本命名
2.工作原理
3.基本框架
4.常用函數以及用法
開始吧,我們首先從一個最基本的插件開始講,我將這個插件命名為BBMut,效果為每隔5秒鐘自動BB一句自定義的話,如圖所示:
工作原理以及基本命名
UnrealScript中,所有函數都是虛函數,這意味著每個函數都能夠通過重寫來實現自己想要的功能,這也決定了整個US內容皆以 類(Class)來包裝
在US中,類的聲明如下
class ClassName extends FatherClass;
其中ClassName是你寫的這個類的類名,FatherClass是這個類的父類,也就是所繼承的類
繼承出來的類包含了父類的所有功能,並且能夠獨立的在父類的基礎上增加一些自定功能,這也是KF2中插件編寫及運行的基本靠山
對於Mutator來說,它是一個獨立的類,繼承(擴展)自Object,而KF2因為有自己的獨立特性,所以有一個自己的KFMutator類,繼承自Mutator,專門容納KF2中Mutator的特性及功能
我們的目的就是通過重寫(新手可以理解成覆蓋原先的內容)KFMutator裏面的函數來實現自己的功能,但是又不能丟掉官方自己的一些東西,所以有必要引入Super這一概念
Super:可以籠統的理解為父級的意思,沒有大礙
在重寫非自己創建的函數的時候,如果不是全部重寫,而是想在官方的基礎上加一些功能或者更改部分功能(比如說更改401回血一針100,或者給401增加一個新功能),請使用Super.function(parameter)來調用父級函數!
_>STEP-ONE
我將這個插件的包名取名為ArTest(我昵稱的縮寫Ar+Test),也就是說以後我在教程裏面制作的插件將會放到這個包裏面;
我將這個插件命名為BBMut,也就是這個插件的類名
1.建立好插件的文件夾結構(詳見 [KF2][Mut&Gm Tutorial]Modding第一步),如圖所示(註意此時文件夾內沒有BBMut.uc)
2.建立BBMut.uc:對於初級玩家,請直接右鍵新建文本文檔,重命名為BBMut.uc;對於高級玩家,請依照下列方式在UsIDE建立uc文件並命名為BBMut.uc
3.寫入基本內容:對於高級玩家,在UsIDE新建uc文件過後IDE會自動填充以下代碼
class Class extends Object; defaultproperties { }
如前文所說,這個插件的類名我命名為BBMut,這個插件類型是Mutator,所以請將class後面的Class替換為BBMut(uc文件同名),extends後面的Object改為KFMutator,如下
class BBMut extends KFMutator; defaultproperties { }
對於初級玩家,請直接將上述代碼復制粘貼進入記事本並保存
4.寫入基本框架
我們想一想,如果要寫一個MUT,那麽首先必須要這個MUT能和其他MUT兼容,也就是說使用自己這個MUT的時候其他的MUT也能夠一起運行並且不會出錯,那麽我們就引入一個函數如下:
function InitMutator(string Options, out string ErrorMessage)
這個函數的作用是初始化MUT並且檢查MUT隊列,看看是否有下一個MUT,有的話就繼續初始化下一個,一直循環;
其次,我們需要設置一個計時器,以便每5秒鐘調用一次BB函數來說話——那麽這個計時器設置在哪兒呢?很明顯,如果我們要讓它精確運行的話必須設置在我們出生(或者重生)的那一刻,所以有必要引入另一個函數如下:
function ModifyPlayer(Pawn Other)
這個函數被另外一個函數RestartPlayer(...)調用,而RestartPlayer(...)會在玩家重生或者出生的時候被調用,所以我們借此間接地來設置一個計時器來實現這個功能(為什麽不能直接設置?這涉及到更高深的內容,以後會講解)
然後就是計時器函數
/** * Sets a timer to call the given function at a set * interval. Defaults to calling the ‘Timer‘ event if * no function is specified. If InRate is set to * 0.f it will effectively disable the previous timer. * * NOTE: Functions with parameters are not supported! * * @param InRate the amount of time to pass between firing * @param inbLoop whether to keep firing or only fire once * @param inTimerFunc the name of the function to call when the timer fires */ native(280) final function SetTimer(float InRate, optional bool inbLoop, optional Name inTimerFunc=‘Timer‘, optional Object inObj);
不要被這麽大一堆參數困住了,其實用法很簡單,第一個參數是計數時間,第二個參數是是否循環,第三個參數是想調用的函數的名稱,後面參數超出本教程範圍所以不用管
那麽我們現在明確了,如果要每隔5秒BB一次,那麽時間要設置成5s,計時器要循環,調用的函數名稱就是我們的BB函數!如下:
SetTimer(5, True, "BBFunction");
然後參考上面的 工作原理以及基本命名 ,寫好基本框架之後的代碼如下:
class BBMut extends KFMutator; function InitMutator(string Options, string ErrorMessage) { super.InitMutator(Options, ErrorMessage); } function ModifyPlayer(Pawn Other) { SetTimer(5, True, "BBFunction"); super.ModifyPlayer(Other); } defaultproperties { }
5.編寫BB函數
計時器寫好了,那麽就開始BB啦!
KF2裏面BB的原理是這樣的:
每個玩家進入遊戲的時候,UE3會給你分配一個 棋子(Pawn),這個棋子包含了你選擇的所有信息(職業、等級、武器、飾品等等等....)
然後UE3會給這個棋子分配一個 KF2玩家控制器(KFPlayerController),這個控制器包含了所有“這個棋子應該怎麽反應你做出的動作”的所有信息和函數,而我們所需要的BB函數就在裏面,如下
reliable client event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type, optional float MsgLifeTime ) : KFPlayerController
也不要因為這麽一長串就頭暈了,你大可只復制我下面給出的代碼就行,如果你想知道原理的話我下面也會詳細講解;
寫好的如下:
class BBMut extends KFMutator; var Pawn KFP; var KFPlayerController KFPC; function InitMutator(string Options, string ErrorMessage) { super.InitMutator(Options, ErrorMessage); } function ModifyPlayer(Pawn Other) { KFP=Other; SetTimer(5, True, "BBFunction"); super.ModifyPlayer(Other); } function BBFunction() { KFPC=KFPlayerController(KFP.Controller); KFPC.TeamMessage(KFPC.PlayerReplicationInfo, "I Love FCY!", ‘TeamSay‘); } defaultproperties { }
原理:
首先我們要獲取重生或者復活的這個玩家的棋子,然後獲取他的KF2玩家控制器,然後利用裏面的TeamMessage(團隊消息)函數來BB
我們在開頭聲明兩個變量,一個是KFP(類型Pawn),一個是KFPC(類型KFPlayerController),然後在ModifyPlayer中將傳入的Other賦值給KFP,然後獲取KFP中的KFPlayerController賦值給KFPC,這樣就成功了
然後調用KFPlayerController中的方法TeamMessage開始BB,參數為
1.KFPRI(KF2玩家網絡復制信息,高級進階用法,涉及到網絡流,所有教程不做講解,請自行學習,在此你只需要看看就好,撰寫請記住套路復制粘貼: KFPC.PlayerReplicationInfo)
2.要說的話
3.說話類型:TeamSay 團隊消息(效果是 自己說出來一句話) Event(效果和CD的每波總結一樣,是系統消息)
_>STEP-TWO
開始編譯吧!
編譯成功後, 你在
\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script 中找到一個 (你自己的包名).u
比如說我這個就是ArTest.u
_>STEP-TWO
此步當然是運行試試看啦
命令行:
Open MapName?Mutator=PackageName.ClassName
對於此教程,如果你是完全按照步驟來的話命令行應該是:
Open KF-Outpost?Mutator=ArTest.BBMut (其中地圖請隨意)
註意:此教程制作出來的插件只適用於單人單機SOLO模式
涉及到服務器以及多人的插件
因為涉及到PRI和GRI等網絡流對象(玩家網絡復制信息 遊戲網絡復制信息),所有教程將不會講解,請自行學習
[KF2][Mut&Gm Tutorial]Modding第二步:開始制作你的第一個簡易Mutator