1. 程式人生 > >[KF2][Mut&Gm Tutorial]Modding第二步:開始制作你的第一個簡易Mutator

[KF2][Mut&Gm Tutorial]Modding第二步:開始制作你的第一個簡易Mutator

是否 info one 重寫 nat game 運行 跟著 lis

在這之前請確保

[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