在开发游戏时,你可能会希望让玩家在你的等级中执行某种形式的ActorInput。例如,也许你希望玩家在靠近一个藏宝箱时能打开它,或者你希望他们能打开/关闭一盏灯,或在玩家按下按钮时以某种方式影响一些其它形式的交互对象。
为Actor设置输入能让你在一定程度上控制Actor如何及何时响应玩家的输入。
实现指南
该指南介绍了如何为ActorEnable Input或Disable Input的基本方法。通过启用 Actor 的输入,你可以让玩家按一个按钮或按键,并执行以某种方式影响 Actor 的事件(开灯或关灯、开门或关门、启动某个东西等) 。
启用/禁用输入用法部分还包括一种启用/禁用输入的方法,用Trigger Volume来确定玩家是否接近该等级的Actor。如果你想让玩家仅在接近或在Actor的范围内时才影响Actor,以便在真实场景中令人信服地影响它,这就很有用。
启用Actor输入
在本例中,我们将使用Blueprint First Person Template with Starter Content。
以下步骤将告诉你如何为Actor启用输入:
-
在StarterContent/Blueprints文件夹中打开Blueprint_Effect_Fire资源。
-
在Event Graph选项卡上,在图形中Right-click并搜索,然后添加Event Begin Play节点。
-
在图形中,Right-click搜索并添加Get Player Controller节点。
-
在图形中,Right-click搜索并添加Enable Input节点。
-
使Event Begin Play的输出针与Enable Input节点的输入针连接。
-
使Get Player Controller节点与Enable Input节点的Player Controller针连接。
这是启用Actor的输入的基本方法。
Enable Input节点要求指定Target(通常是自身——Actor本身)和Player Controller(将提供输入的玩家)。用该设置,你现在可以搜索并添加Input Event节点(如按下按键或鼠标按钮),并在按下这些按键时执行影响Actor的操作。
在上例中,Event Begin Play节点指出,当游戏开始时(假如在该等级中存在Actor),为指定的Player ControllerEnable Input。默认玩家控制器为单人游戏使用Player Index 0,如果要有多人场景,你可以通过Player Index值指定玩家。
禁用Actor输入
正如你可以启用Actor的输入一样,你也可以用Disable Input节点禁用Actor的输入。

在上例中,我们使用了启用Actor的输入的上述方法,然后添加了一个E键事件。当按下E键时,我们输出到屏幕上一些文字,然后禁用Actor的输入,使其无法再向Actor提供输入。
如同Enable Input节点一样,Disable Input节点需要指定Target和Player Controller。
启用/禁用输入用法
虽然上面提到的方法适用于启用/禁用输入,但你通常会希望有一些规则来管理何时允许Actor接收来自玩家的输入。如果我们要用上面的方法启用 Event Begin Play 的输入,并有一个开灯或关灯的按键(例如),玩家将能从全世界任何地方打开/关闭那盏灯。
我们希望能基于玩家是否靠近灯来启用/禁用输入,类似于如下:
-
在StarterContent/Blueprints文件夹中打开Blueprint_CeilingLight资源。
-
在Components面板中点击Add Component,然后搜索并添加Sphere Collision。
-
在Details面板中,将Variable Name设置为Trigger,将Z Transform设置为-180.00,并将X, Y, Z 的Scale设置为至8。
我们将启用(当玩家在里面时)或禁用(当玩家在外面时)球体的输入。
-
返回Event Graph。
-
在MyBlueprint窗口中Right-clickTrigger,然后选择Add Event -> Add OnComponentBeginOverlap。
-
再次Right-clickTrigger,然后选择Add Event -> Add OnComponentEndOverlap。
这两个事件节点应被添加到图形上。
-
拖走 Begin Overlap 节点的Other Actor针,然后搜索并添加Cast To FirstPersonCharacter节点。
在这里,我们要说的是,当名为FirstPersonCharacter的 Actor(这是项目模板的默认玩家人物)与Trigger重叠时,做点什么。
-
从End Overlap节点的Other Actor针 练出来,然后添加Cast To FirstPersonCharacter节点。
-
Right-click并添加Get Player Controller节点、Enable Input,以及Disable Input节点。
-
如下所示连接节点。
现在只能在玩家进入触发器时启用输入,并在玩家离开触发器时禁用输入。这可以防止玩家从全世界任何地方影响Actor,而使其只局限在他们位于我们创建的trigger volume内时。
-
Right-click并将E键事件和它添加至Print String节点。
-
Compile并Save,然后关闭蓝图。(如果你收到警告,忽略它并继续执行下一步。)
-
将Blueprint_CeilingLight拖进该等级,然后点击Play按钮,以在编辑器中播放。
播放时,如果你在远离灯时按E,什么都不应该发生。当你靠近灯(在触发器内)并按E时,文本Hello应出现在窗口的左上角。在本例中,我们连接了一个Print String节点,但在按下按键且玩家位于触发球内时,你可以切换光的颜色、强度,或其它设置。
输入详情
替换上例中的E键事件,并尝试使用Space Bar键事件。当你在编辑器中播放时,留意发生了什么。你可以在位于灯的触发器外时按Space Bar来跳转,但当你进入触发器并按Space Bar时,你不再跳转,而是调用Print String和文本Hello;这是由于Input Priority。
当共享输入命令时(正如这里的情况一样,我们为灯分配的跳转和输入均与Space Bar关联),优先级较低的操作被忽略。在灯蓝图内,如果你点击Space Bar键事件然后查看Details面板,你应该能看到Consume Input的选项。

如果取消选中Consume Input复选框,并再次在编辑器中播放,你现在应该能在灯的trigger volume内部和外部跳转。在灯的trigger volume内时,按Space Bar也将调用Print String节点并显示Hello文本。
另外,在Input Details窗口中有Execute when Paused(它让你能在暂停状态下按键并执行命令)和Override Parent Binding(它让你能在任何父类中删除任何约束设置)选项。