UE5官方文档(第一人称射击游戏教程)解读 第六章

发布时间:2026/5/22 1:29:19

UE5官方文档(第一人称射击游戏教程)解读 第六章 休息一天后又开始写教程了这次来到了我们的第三个大文档。配置角色移动Coder 03 Configure Character Movement with C in Unreal Engine | Unreal Engine 5.7 Documentation | Epic Developer Community在前面我们成功熟悉了创建c类(角色类游戏模式类……)顺带了解了游戏输入的一系列流程键位绑定键位设置……但是由于分离式设计我们虽然完成了键位设置输入映射上下文IMC键位状态设置输入动作IA还有一部分没有完成。我们之前说过玩家输入分为几个部分首先是电脑收到设备信号比如按下鼠标发出信号然后则是电脑系统把信号发送给程序最后是程序根据自己设定好的做出反馈。第一个部分和第二个部分肯定不归引擎管但是第三个就是我们要写好的。而我们在之前的学习里面漏掉了什么呢漏掉了“反馈”想一想就算我们写了一个反馈函数用于指挥以正确方式按下按键后程序应该做出什么反应它独立在那里也不行毕竟我们在开发中会有很多个这样的函数跳跃视角移动角色本体移动……为了保证调用正确我们需要把输入动作InputAction和对应的函数绑定起来为什么不说IMC和IA需要额外写因为我们在设置IMC的时候就指定了具体的IA呀。题外话既然程序的本质是一大串指令集那么函数就是里面一小部分整体的指令集。在看懂我写的这些解释后大家应该对本章学习什么有了数。学习关联输入与移动在蓝图中可视化输入还是按照我们约定俗成的每个小部分都跟着官方文档做一遍然后再来看我。我在之前说过蓝图类的本质还是代码只不过你不用详细地去学习编程编程语法只需要了解各个节点的作用和使用逻辑就能够使用连连看的方法“写”代码。既然蓝图类的本质还是代码那用代码的理解方式会更直观而且我们说过学习我们这个解读教程需要代码基础。我们打开这个项目模板自带的角色类蓝图后就是这个样子。这个界面叫做事件图表我们能看见一堆红的蓝的还有连的线。这个红的是什么呢我们可以从下面这个来详细解释。可以看见这个一整块大的部分在左上角有个“camera input”的注释没错这个是注释有需要的可以去官方文档找蓝图写注释的教程我们说过第一人称射击游戏的摄像机是模拟人眼睛位置的所以写在角色类里面也不奇怪毕竟需要角色的位置。请看这个红红的框“EnhancedInputAction IA_Look”它是什么意思呢这个东西叫做事件节点event而蓝色的东西叫做函数function。函数很好理解你点开蓝色部分里面就会出现类似函数实现的流程但是事件节点就让人很难理解。请试想以下玩家角色被子弹击中时需要做出哪些功能或许是击中音效击中特效角色倒下动画被击杀时屏幕色调变化我们按照分离思想先把他们分开写好写成函数一函数二……然后我们写到一个大函数里面包括起来然后进行一个总的调用。但是这是不是太麻烦了如果是部分特殊角色死亡我们还需要粘贴复制一遍然后修改这部分代码。但这还不是最麻烦的。假设我们在游戏里面有个场景。这个场景是断电的有灯有冰箱有电视。我们此时拉开电闸灯亮了冰箱开始工作会有轻微的嗡嗡电流声电视上面的待机灯亮了。如果我们在代码里面这样写函数一灯亮代码函数二冰箱工作代码函数三电视待机灯亮了然后写假如if电闸拉开那么就调用函数一函数二函数三。可是以后我想写越来越多的电器通电工作怎么办往if里面猛猛加函数吗万一漏掉怎么办所以我们转换思维转换为“因果关系”这些电器工作有个前提是——电闸通了而电器这些工作可以统一抽象为——电闸通后“我”指电器自己该做的事情。那么我们的事件节点的本质就是如此。我们可以在电闸通了后发送一个总的信号然后有接收此信号功能的电器就会统一调用自己那里对应的函数。我们把发送这个信号的过程叫做广播。非常形象就像一堆刺客等待着刺杀人的信号每个刺客都有自己的手段虽然都叫刺杀但是过程却不一样这就是委托当刺客酒馆发布目标信号的时候广播能借这个委托的刺客们就开始使用自己的手段做事了。那么回到我们最开始我们说的这个红色的事件节点和后面蓝色节点的结合体本质上是玩家输入了xxx后就开始执行xxx功能从名字大致可以看出是鼠标动了动执行了视角变换也可以理解为是摄像机各项数据变化视角变化的量是以鼠标移动量为基础。这一块很难所以我留下的作业是请大家分析猜测事件图标中每一块的功能。理解跳跃输入逻辑理解移动输入逻辑这两个都自己看文档学习也是我们之前留下来的作业。使用PlayerController指定玩家输入还是先自己看一遍文档总结。在之前我们说过ActorPawnCharacter它们之间的继承关系和差异。Pawn和Character比起Actor能够获取玩家输入并做出反馈而我们输入的原始信号是需要PlayerController先获取然后处理再传递给Pawn和Character。那以此类推我们写输入相关的东西肯定避不开PlayerController毕竟输入都没了怎么做反馈。这一小节的末尾会提到编程子系统然后编程子系统会涉及到输入子系统可以深入拓展一下为什么输入会和编程子系统绑定我在此提出一个有趣的问题我们按下鼠标键或者键盘键不松手的时候设备是持续发送一个按键按下信号还是说按下时发送一个按下的信号松手的时候发送一个松手的信号不论真实情况是前者还是后者为什么要这样做设置你的角色类添加增强输入系统还是先自己看一下官方文档然后动手实操一遍接着我们来解释代码。注意此后所有涉及到代码的部分我会给出一整份的代码解释因为我觉得代码运作是一个整体不能分开单独解释所以有需要就自己找对应部分。首先我们说一下这个build.cs文件是干嘛的。这个文件叫做“模块构建文件”你可以理解为这个文件名字前面那半截就是对应发挥作用的模块。什么又叫做模块呢请想一下我们做一个程序可以分为图像音效交互网络三个部分如果我们全写成一堆里面有bug就不好排除是哪里出了问题但是我们如果模块化去写模块一图像模块二音效……这样就方便我们分模块锁定bug当然最大的作用还是分模块维护。可是里面还有些特殊情况比如图像模块和音效模块会依赖交互模块而交互模块又依赖网络模块我们希望在开发图像模块和音效模块的时候不会误用到完全无关的网络模块那么这个时候就会引入模块管理机制即定义模块能用哪些模块自己又能被其他哪些模块使用。所以我们在UE5的这个模块构建文件本质上就是说我们需要用哪些模块这个设计也便于我们管理不引入不需要的代码。请回想我们的增强输入其实是一个插件插件是一个模块或者多个模块的集合就在此体现我们既然想要使用那就需要引入。作业模块在编译后会成为什么// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include CoreMinimal.h #include GameFramework/Character.h //下面都是额外引入的输入功能相关代码 #include EnhancedInputComponent.h #include EnhancedInputSubsystems.h #include InputActionValue.h //因为我们需要做输入功能所以需要InputActionValueInputComponentInputSubsystem类从头文件引入 #include AdventureCharacter.generated.h //我之前说过生成文件必须位于末尾 class UInputMappingContext; class UInputAction; class UInputComponent; //前向声明我们肯定要使用IMC,IA,Inputcomponent类 //但是这里明明有了对应头文件所以是冗余的作业使用前向声明的好处以及必要性还有原理。为什么我说这里的前向声明是冗余的这个问题很重要因为后面会一直使用。说个题外话我们在写了这些代码后会标红说打不开源文件找不到定义之类的可能是你没在之前编译模块构建文件所以相当于你现在还没引入模块所以也用不了模块对应的东西你现在一块编译就好了。好了我们本次的学习到此为止因为后面是非常大一整个部分。

相关新闻