学习编程最简单的入门方式依旧是打印 Hello World!
就算是写MOD也不例外,在游戏引擎这么复杂的环境中,更需要一些调试输出。
杀地板中有四种调试方式:
-
日志文件:log
-
屏幕广播:Broadcast
-
控制台消息:Message
-
交互绘制:Interaction
这里我们暂时了解一下“控制台消息”,因为从结果来看 更接近普通的编程。
日志 需要打开文件进行查看,广播 打印后会自动消失,交互绘制 代码复杂更难实现;
如上所述,我们还是用控制台来入门 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,打开游戏激活该插件 进地图查看效果;
游戏中按 ~ 波浪键查看控制台。