KF1 mod 开发教程
输出 Hello World
学习编程最简单的入门方式依旧是打印 Hello World! 就算是写MOD也不例外,在游戏引擎这么复杂的环境中,更需要一些调试输出。

杀地板中有四种调试方式:
这里我们暂时了解一下“控制台消息”,因为从结果来看 更接近普通的编程。 日志 需要打开文件进行查看,广播 打印后会自动消失,交互绘制 代码复杂更难实现; 如上所述,我们还是用控制台来入门 MOD编程。

输出方式我们选好了,但写代码之前 还是要了解一下执行入口。
游戏入口
在编程入门时 代码需要写在 main 函数中,表示主程序入口; 游戏的主程序入口 不是我们定义的,是由虚幻引擎规定,所以我们需要另外想办法。

这里有个 PostBeginPlay 函数,表示游戏开始之后执行(即 地图加载后 房间等待时) 插件对象 跟随在地图信息中,地图加载后 插件也就马上出现,触发 PostBeginPlay 函数。 该函数名在 Actor 类中的定义是一个事件;

不同的类 在地图中出现的时机不一样,也就是 PostBeginPlay 执行的时机不完全相同。 以面向对象的角度来看,游戏中很多类都继承自 Actor 类,我们的插件继承自 Mutator, 而 Mutator 是间接继承到 Actor 的,继承路径如下:
Mutator - Info - Actor
上面的说明有点复杂,也许对具体函数的溯源工作很有帮助,某些时候还能让你发现更多有趣的函数。
代码:游戏开始之后
接下来有一段示例代码,这里我们要记住 代码是写在我们的插件类中, 即 Mutator 子类中;由于控制台藏的有点深 要访问到它,代码可能复杂一点。

由于加载顺序的问题,不能直接在 PostBeginPlay 函数里访问玩家的控制台, 解释是 玩家还没出生时 插件就已经执行 PostBeginPlay 事件函数。 这里用了 SetTimer 表示“计时器”等待5秒,5秒之后会执行自身的 Timer 函数,即: 游戏开始后留5秒钟 保证玩家出生 再调试输出 Hello World!(注意用英文,没有装汉化时 中文会乱码)
// 请将代码写到你的插件类中

// 游戏开始之后
function PostBeginPlay()
{
	// 设置计时器5秒后执行,第二个参数表示“不重复执行”
	SetTimer(5, false);
}

// 计时器
function Timer()
{
	local PlayerController PC;

	PC = Level.GetLocalPlayerController();
	if (PC != none)
	    PC.Player.Console.Message("Hello World!", 0);
}
以上过程是从“插件类”到“玩家控制器”的复杂访问过程; 当游戏开始时,程序会获得一个玩家控制器,这里的本地玩家控制器 主要区别多人游戏中别人的控制器。

这些代码有点像 JAVA 那么长,由于程序逻辑的复杂性 不同的功能是写在不同的类中, 然后对象之间 用属性相互关联存储,下面翻译它们关联顺序:
Level.GetLocalPlayerController();
解释:关卡中,有个函数 能获得本地玩家控制


PC.Player.Console.Message("Timer called", 0);
解释:
	玩家控制器 有个“玩家”属性
	玩家 有个“控制台”属性
	控制台,有个函数 用来输出消息
由于某些特殊情况,可能拿不到玩家控制器 即:拿到空对象。 当用空对象 访问属性或函数时 会报错。所以写个条件判断是有必要的。 none 表示空对象(空值)

写好代码之后 编译MOD,打开游戏激活该插件 进地图查看效果; 游戏中按 ~ 波浪键查看控制台。