本博文目的在于帮助对Killing Floor 1&2 插件制作感兴趣的玩家/程序员快速的了解插件的运作机制和编写方法。
这里只介绍一代版本,二代版本的编写只会比一代更简单,原理相通。博主虚幻零基础,琢磨插件用了小半个月,踩了不少坑(特别是换了好几个编辑器),目前已经提交了两个插件,特此来这里记录和分享一下,顺便试试博客的Markdown~~。
只是入坑!因为博主也刚入坑不久
学习插件编写的好处:
1.认识更多的人
2.装饰你的Steam个人资料
3.对虚幻引擎(旧版本)有一个初步的认识
4.从根本上了解和改变你手里的游戏
5.在玩家面前装逼
正式开始
一.准备工作:
1.一个好用的代码编辑器
一个好用的编辑器非常重要!习惯了C#+VS的我根本无法忍受没有代码补全、Goto、查找引用、语法检查的编辑器。在最初的时候我尝试了很多款,Sublime,NotePad++,nFringe,UnrealScriptIDE等等,最后选择了VSCode。下载完了记得安装一个UnrealScript语法拓展。虽然它对UT2004版本的UnrealScript支持的还不是很好,但是部分功能还是可以用的。
2.能够适应UnrealScript脚本语法
UnrealScript这个语言基本上已经死了,最新版本的UE4更希望开发者使用C++,而且UT2004的UnrealScript所提供的库也很少。但是语言只是工具,暂时学习一下也不会很困难,多看别人的源码就好了。
3.良好的英语基础 or 活用翻译软件
国内的文档很少!如果要查一些教程或者介绍,你需要去T社官网的插件讨论区,Legacy Unreal Wiki,T社官方教程区和UT2004UDN文档翻找,或者看开发者在源码中留下的文字,甚至去讨论区或者在steam向国外的插件大佬讨教。抵触英文的话会让你的学习之路变得非常痛苦。
4.基本了解面向对象编程
这个没啥好解释的,游戏就是用OOP写的,不懂肯定很难受。要是不懂也没事,下功夫多看看,大家都会,没什么难的。
二.创建你的第一个插件:
下载Killing Floor SDK 位置:Steam -> 库 -> 工具
T社官方插件最简教程
在killing floor目录下创建目录和文件ExampleMutator/Classes/ExampleMutator.uc
如果你按照官方的文档来做的话,得到的代码应该是这样
class ExampleMutator extends Mutator;
function PostBeginPlay()
{
SetTimer(1, true);
}
function Timer()
{
local KFHumanPawn Player;
foreach DynamicActors(class 'KFHumanPawn', Player)
{
if (Player.Health + 2 <= Player.HealthMax) Player.Health += 2;
else Player.Health = Player.HealthMax;
}
}
defaultproperties
{
GroupName="KFExampleMutator"
FriendlyName="Example Mutator"
Description="Mutator description here"
}
1.最开始我们可以看到,这个插件继承了Mutator
父类。
2.PostBeginPlay()
方法,类似于Unity里的Start()
方法,意思是在你的mut对象实例化之后执行,是继承的Actor
的方法,在该方法内调用了SetTimer()
方法,含义是创建一个计时器,调用Timer()
方法,传入的参数具体含义去查询Legacy UnrealWiki。其实就是运行间隔和是否循环,如果要取消计时器就SetTimer(0,false)
。
类似的还有PreBeginPlay()
,这些都是方便Actor
子类初始化一些内部数据用的。毕竟工厂模式不可能把构造函数留给你写,都是Spawn()
封装的。
3.注意力回到Timer()
,能看到里面定义了KFHumanPawn
的对象,然后用DynamicActors()
迭代器查询所有KFHumanPawn
子类的对象,返回值给Player
,并修改其Health
属性。
4.下面的defaultproperties
是存储插件的一些需要持久化的数据用的,官方标注的这三个缺一不可,否则无法在KF1插件面板上显示。如果你定义了config var bool bDisplayMessage
之类的东西,最好也在最下面里写上一个默认值.
好,这么官方给的最简单的一个插件就分析完了,但是还远远不够,我们需要让他变成自己想要的样子。比如你想再添加护甲,但是你不知道该修改什么变量,或者代码写在什么地方,那么下一步,就是编写插件的过程中最重要的部分:阅读源码。
三.阅读SDK源码
以前写Unity代码的时候我最喜欢干的事情就是分析代码的框架,理清继承关系和消息机制处理流程。但是因为VSCode要在UnrealScript环境下查找变量方法的所有引用是很困难的事情,因此理清这些事情会变得比较麻烦(特别是零虚幻基础,像博主一样)。那我们就要多翻源码了,这是没办法的事情。
什么是KFHumanPawn?什么是Mutator?要搞清楚这些问题,最简单的办法就是从SDK里找到定义他们的代码,以及他们的父类。
KFHumanPawn -> KFPawn -> xPawn -> UnrealPawn -> Pawn -> Actor -> object
Mutator -> Info -> Actor -> object
可以看出Mutator和KFHumanPawn都是Actor的子类,这也是虚幻程序员的共识。
那他们自己身上的属性方法和父类的属性方法将会是插件修改的突破口。我们看下Mutator都有哪些方法可以重写——T社官方Mutator类介绍。
function PostBeginPlay(){}
function Tick(float delta){}
function PostBeginPlay(){}
function Timer(){}
function ModifyPlayer(Pawn Other){}
function Mutate(string MutateString, PlayerController Sender){}
function bool CheckReplacement(Actor Other, out byte bSuperRelevant){}
static function FillPlayInfo(PlayInfo PlayInfo){}
static function string GetDescriptionText(string SettingName){}
function ModifyLogin(out string Portal, out string Options){}
function NotifyLogout(Controller Exiting){}
......
我