虚幻引擎应用实例分享(七):设置基本输入与交互

作者:Dluck
2023-09-22
3 1 0

前言

由 Epic Games 推出的虚幻系列引擎,因其高效、全能、易获取、所见即所得等特性受到广大游戏开发者欢迎,市面上也不乏从入门到深度分析的教程。本系列主要面向虚幻引擎的初学者以及有一定实践经验的虚幻引擎游戏开发者,分享能够立即运用在自己项目中的实践技巧。本教程综合了个人的学习笔记、官方文档以及个人心得,水平不足之处,望读者反馈和指正。

本文是 UE 应用实例分享系列专栏的第七篇。

交互性:输入响应

交互性是游戏有别于其他艺术媒介的最大特点。而交互性的核心就在于,游戏可以根据玩家的外部输入做出响应:点击左键可以射出子弹;按下空格键可以跳跃;按下 Q 键对敌人施放技能;点击 UI 按钮打开一个菜单,等等。本文将介绍如何在虚幻引擎中配置角色来响应来自鼠标和键盘的输入,并使用一个第三人称射击游戏模板来展示如何控制人物移动。

文章基于 UE4.27.2,UE5 已经采用了增强输入(Enhanced Input) 替代原本的输入系统,后续我们再介绍。

UE 的输入系统

PlayerController

A PlayerController is the interface between the Pawn and the human player controlling it. The PlayerController essentially represents the human player's will.

我们先介绍 Controller 的概念。PlayerController(简称 PC)是虚幻引擎的 Gameplay 框架中非常重要的一部分,PC 对象本身代表着玩家角色,是现实玩家和虚拟世界角色间的桥梁。单人游戏中,PC 可以代表本地主机的一名玩家,拥有自己的输入映射,自己的 Viewport。而网络游戏中,PC 也可以代表网线另一端的其它玩家。PC 可以用于处理摄像机管理/玩家输入/HUD 显示/关卡切换/语音聊天等功能。简言之,它的重要性犹如你手中的游戏手柄(Controller)——在游戏机上,没有手柄就无法玩游戏。


PlayerInput

接下来介绍 PlayerInput 的概念。PlayerInput 是之前提到的 PlayerController 类中的一个 UObject,仅在客户端生成。在 PlayerInput 中,定义了 ActionMappings 和 AxisMappings。

  • ActionMappings:将按键和一个 Action 进行映射,然后将 Action 与游戏内的逻辑进行绑定。当按键被按下时,Action 会类似一个委托事件一样被触发。
  • AxisMappings:将鼠标、摇杆或者键盘输入映射成一个 Axis,再将 Axis 绑定到某个游戏逻辑上。和 Action 不同,Axis 提供了一个 Float 输出,会被持续的检测。一般用来实现人物移动,或者需要平稳过渡的游戏行为。

动手配置我们的角色

为方便讲解,我们直接使用虚幻引擎自带的第三人称射击游戏模板作为参考。打开 UE4,选择 Third Person 模板创建新项目。

PS:如果想使用蓝图来控制输入,那么下一步可以选择创建蓝图项目,否则选 C++,这样自动生成的项目代码逻辑会在 C++ 文件中。


配置 Axis/Actions

在项目设置中,我们可以为基本的输入输出进行按键绑定,这是虚幻引擎最基本的输入绑定方式。原理是将 Action 名称和具体的按键进行一对多映射,通过调用和 Action 同名的事件就可以进行输入及交互了。

  1. 打开 ProjectSettings > Enging > Input > Bindings(项目设置)。这里分为了 Axis/Actions 两种类型:Action 代表按下一次就响应一次,比如键盘/手柄的按键;Axis 则代表轴输入,比如手柄扳机键、鼠标的平移速度等。针对 Action,我们只需要检测是否按下;而 Axis 还会提供一个 Float 值供游戏逻辑使用,比如在主机上,我们控制的角色会随着摇杆的偏移量增加而减少移动速度。

  1. 随后,我们在蓝图节点空白处右键,添加一个 Input Action 事件,可以看到刚刚添加的 Action Events - Jump。

  1. 添加事件后,即可帮助我们执行响应这个操作的逻辑。


如果你使用 C++

同样的,在 C++ 中进行按键绑定是更常见的作法。一般情况下,我们需要重写 SetupPlayerInputComponent 函数来设置绑定,引擎会在适当的时机调用它。

  1. 找到角色(Character)蓝图,点击右上角的父类(Parent Class)进入角色类的 C++ 代码中。

  1. 找到负责按键输入绑定的函数(SetupPlayerInputComponent):
// 声明
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// 定义
void AInputDemoCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
        // Set up gameplay key bindings
        check(PlayerInputComponent);
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

        // ...
}
  1. 使用类似上述代码格式添加绑定:"Jump" 处应当填写对应的 Action 名称;IE_Pressed 代表按下的时候触发;反之,IE_Released 代表松开时会触发;最后补充一个函数的地址作为绑定时候调用的函数。

如果我们使用轴(Axis)输入绑定,被绑定的函数需要传入一个浮点类型的参数,参考如下。其余情况则不需要传入额外的参数。

void AInputDemoCharacter::MoveRight(float Value);

处理输入的优先级

虚幻引擎使用了 PlayerInput 来处理玩家输入,而挂在 Actor 上的 InputComponent 负责处理输入后 Actor 需要做的事情。

当不同的对象都绑定了同样的按键时,PlayerInput 通过一个输入组件(InputComponent)的栈来确定优先级。除打开了输入响应的 Actor 外,默认的响应顺序为:PlayerController -> Leve Blueprint -> Pawn。对于同样的对象,后绑定的对象会优先处理输入,而输入一旦被处理,就不会再传递到后续的 InputComponent 中。



图片:如无特别说明,文中图片均为作者自制
*本文内容系作者独立观点,不代表 indienova 立场。未经授权允许,请勿转载。

近期点赞的会员

 分享这篇文章

Dluck 

Gamer / Developer 

您可能还会对这些文章感兴趣

参与此文章的讨论

暂无关于此文章的评论。

您需要登录或者注册后才能发表评论

登录/注册