这几天开始制作《Blade & Soul》风格的视角和控制方式,对虚幻输入系统有了一个大致的了解,在此分享一些我的学习心得。(或者说是“学习笔记”之类的更适合一些?)

要做出一款自己的游戏,仅仅使用 UDK 默认提供的按键功能肯定是远远不够的。通过拓展和修改现有的按键绑定,来实现我们需要的功能。本文将介绍在 UDK 中自定义游戏按键的技巧,以及如何结合 UnrealScript 为自定义按键绑定按键功能。

UDK_defaultinput

在位于 UDK 安装目录下的 UDKGameConfig 文件夹中有一个名为 DefaultInput.ini 的配置文件(如上图所示),这个文件定义了游戏运行时的默认按键绑定,下面介绍一下有关这个文件的几个小技巧:

注:由于UDN上对这个配置文件的基础操作已经有较为详尽的讲解,本文对此不再赘述。

基于事件的按键绑定链:

使用按键绑定链可以将多个命令绑定到一个按键上,一个常用的实例是当按下和释放按键时执行不同的命令:

;当 J 被按下时执行命令 StartFire,当放开按键时执行 StopFire .Bindings=(Name="J",Command="StartFire | OnRelease StopFire")

使用别名:

使用别名可以将多个不同的按键映射到同一个命令,这样可以方便的启用备用按键(辅助按键),下面的 RotationViewPress 就是一个别名,当玩家按下鼠标中键或鼠标右键时会实现相同的功能:

.Bindings=(Name="RotationViewPress",Command="Button bRotationViewPress") .Bindings=(Name="MiddleMouseButton",Command="RotationViewPress") .Bindings=(Name="RightMouseButton",Command="RotationViewPress")

关于鼠标中键:

你会发现在《UDN:按键绑定》的“可映射按键”中并没有鼠标中键,其实鼠标中键的名称是 MiddleMouseButton ,它可以被正常的使用。至于为什么没有被写到UDN上,我想可能是考虑到不是所有的鼠标都有中键,才不推荐使用的。

当您按照预期设置好 DefaultInput.ini 文件之后,还需要使用 UnrealScript 为自定义按键的具体功能编写代码(也可以通过 Kismet 实现按键绑定,但显然 UnrealScript 功能更为强大),接下来重点就如何在 UnrealScript 为按键编写代码进行说明。

将按键映射到 UnrealScript 函数:

可以将一个按键直接映射到执行函数(exec function)上,通常将执行函数代码写到玩家的控制器脚本中(xxxPlayerController.uc)。例如我们希望实现当玩家向上滚动鼠标滚轮时,游戏镜头向前推。分别在 DefaultInput.ini 和 xxxPlayerController.uc 中写入:

;写入DefaultInput.ini,下面的 ZoomIn 是需要调用的执行函数名,这是一个注释行 .Bindings=(Name="MouseScrollUp",Command="ZoomIn")
//写入你的玩家控制器脚本(比如:xxxPlayerController.uc)中 //执行函数 ZoomIn ,当鼠标滚轮向上滚动时,该函数被调用 exec function ZoomIn() { local BSA_PlayerCamera Cam; if(PlayerCamera != None) { Cam= BSA_PlayerCamera(PlayerCamera); Cam.ZoomIn(); } }

将按键映射到 UnrealScript 变量:

将某个按键直接映射到某个 UnrealScript 变量上,这个可以通过 Unreal 输入系统访问的变量必须在声明时使用 input 修饰符,且仅可用于 byte 和 float 类型的变量。下面展示了如何在 UnrealScript 正确声明可被按键访问的变量,分别在 DefaultInput.ini 和 xxxInput.uc(你的输入类)中写入:

;写入 DefaultInput.ini,当鼠标左键按下时触发别名 LeftMousePress .Bindings=(Name="LeftMouseButton",Command="LeftMousePress") ;别名 LeftMousePress 执行的命令 .Bindings=(Name="LeftMousePress",Command="Button bLeftMousePress")
//在你的输入类(比如:xxxInput.uc)中写入//声明,使用 input 修饰符,是一个 byte 类型的变量 var input byte bLeftMousePress;

使用组合键:

参见《为游戏启用组合键 : Alt/Shift/Ctrl键的绑定》

本文到此结束。我自己也只是一个初学者,肯定有很多不足之处,希望大家能多多指正、多多交流。