第一章:项目入门

一、核心摘要

本章作为整个课程的基石,其核心任务是从零开始,利用UE 5.4的第三人称模板,搭建一个功能完备、支持多人游戏基础架构的可玩角色。内容覆盖了从项目创建、角色与摄像机设置,到实现一个包含跑、跳、蹲伏和俯卧的完整移动动画系统。同时,本章还引入了UE5最新的增强输入系统,并最终以专业的项目备份方法收尾,为后续所有复杂系统的开发奠定坚实的技术与工程化基础。

二、 本章模块详解

模块一:项目设置与管理 (Project Setup & Management)

  • 本章实现:

    1. 创建项目:
      打开UE5.4,在项目浏览器中,分类选择“游戏”,然后选择“第三人称”(Third Person)模板。

    2. 配置设置:
      确保项目类型为“蓝图”(Blueprint),为项目命名并选择存储路径(建议使用英文路径)。

    3. 整理结构:
      进入编辑器后,立即在“内容浏览器”中创建 Blueprints, Animations, Maps 等文件夹,并将模板自带的文件分类归档。

    4. 备份项目:
      在备份时,先删除项目根目录下的 IntermediateSaved 文件夹(但需保留 Saved/Config 文件夹),再对整个项目进行压缩。

    提示: 手动压缩备份是项目初期的好习惯,但在专业开发流程和团队协作中,普遍使用 版本控制系统,如 GitSVN

    • 与每次都完整复制项目不同,它们主要追踪每个文件的修改历史,可以随时回溯到任意版本,极大节省存储空间。
    • 正如手动备份时需要删除 IntermediateSaved 等文件夹,使用 Git (通过 .gitignore 文件) 或 SVN (通过 ignore 属性) 时,也需要设置忽略这些自动生成的文件夹,只对核心资产进行版本管理。
  • 正确的项目初始化可以利用模板加速开发,而规范的备份流程则是保障项目资产安全、规避风险的关键措施。

模块二:角色蓝图与摄像机 (Character Blueprint & Camera)

  • 本章实现:

    1. 定位核心蓝图,后续所有角色的逻辑开发都在 BP_ThirdPersonCharacter 这个蓝图中完成。
    2. 设置视角,通过调整角色蓝图内部的 SpringArm (弹簧臂) 和 Camera (摄像机) 这两个组件的参数,来实现第三人称视角的远近和高低。
  • 角色蓝图 本身是一个容器,其具体功能都是由独立的 组件“拼装” 而成,这使得功能的添加、修改或移除都非常灵活。它作为角色的核心控制中心,负责管理所有这些组件以及角色的状态数据。

模块三:输入系统 (Input System)

  • 本章实现:

    1. 创建输入动作(Action),创建一个名为 IA_Crouch 的资产来代表“蹲伏/俯卧”的意图。
    2. 映射物理按键(Mapping),在 IMC_Default 文件中,为 IA_Crouch 绑定键盘的 X键,并为手柄的右摇杆按下 也进行绑定。
    3. 使用触发器(Trigger),在手柄的绑定上添加“长按”(Hold)触发器,用以区分“轻按蹲伏”和“长按俯卧”。
    4. 处理输入并同步状态,在角色蓝图中,当接收到输入事件后,会修改 isProne 等状态变量。为了让这个状态变化在多人游戏中对其他玩家可见,这个 isProne 变量必须设置为“已复制”(Replicated)
  • 该模块展示了输入是功能逻辑链的起点。它不仅负责将物理操作翻译成游戏可以理解的抽象命令,更重要的是,由输入触发的状态改变(如 isProne 变量),直接引出了为了实现网络同步而必须进行的变量复制设置。

模块四:动画与移动系统 (Animation & Locomotion System)

  • 本章实现:

    1. 定义状态变量,在角色蓝图中创建布尔变量,如 isCrouchingisProne,作为控制动画的“开关”。
    2. 创建动画素材,导入俯卧等动画,并创建 Blendspace (混合空间) 资产来平滑地融合走、跑等动作。
    3. 构建状态机,在动画蓝图中打开“状态机”,添加“Crouch”、“Prone”等新状态,并使用第一步创建的布尔变量作为连线上的“切换规则”。
  • 动画蓝图负责角色所有的视觉表现。它不进行任何逻辑判断,而是持续地从角色蓝图读取状态数据(如 isCrouching 是否为真),并根据这些数据来播放对应的动画。

模块五:多人游戏基础 (Multiplayer Foundation)

  • 本章实现: 在编辑器顶部“播放”按钮旁的下拉菜单中,将“玩家数量”设置为2或更多,并将“网络模式”选择为“作为监听服务器运行”(Play as Listen Server)。

  • 模块作用: 提供一个内置的、无需打包即可模拟网络环境的测试平台。这使得开发者可以从项目初期就方便地测试功能在服务器和客户端上的表现。

三、核心工作流

下图清晰地展示了本章中各个核心模块之间标准的数据与指令流转过程。
其中,从“角色蓝图”到“动画蓝图”的状态数据传递 是关键一步。其实现方式是:在动画蓝图的事件图表中,通过 Try Get Pawn Owner 节点获取其拥有者(即角色本身),然后将其 类型转换(Cast To) 为我们自己的角色蓝图(如 BP_ThirdPersonCharacter),成功后就可以直接访问并读取其中的 isCrouching 等变量了。

graph LR
    subgraph A [输入系统]
        A1(物理按键被按下<br>如玩家按下C键);
    end
    subgraph B [角色蓝图]
        B1(接收输入动作<br>如“执行蹲伏”) --> B2(更新内部状态数据<br>设置 isCrouching = true);
    end
    subgraph C [动画蓝图]
        C1(读取状态数据<br>检测到 isCrouching 为 true) --> C2(切换动画状态机) --> C3(播放对应的蹲伏动画);
    end
    A1 -- 转化为输入动作 --> B1;
    B2 -- 状态数据传递 --> C1;

四、核心技术点与难点

本章涉及了构建现代多人游戏角色的多个关键技术,并解决了一些典型问题。

  • 关键技术点:

    • 增强输入系统 (Enhanced Input System): 全面使用了该系统,包括创建输入动作、映射上下文,并利用触发器(Triggers)实现了复杂的输入行为(如长按和短按的区别)。

    • 动画蓝图与状态机: 深入应用了动画蓝图的状态机,通过变量绑定和转换规则来驱动复杂的 locomotion 状态切换。

    • 蓝图接口通信: 掌握了使用蓝图接口在两个独立的蓝图类之间进行安全、解耦的数据通信方法。

    • 基础网络复制: 实践了客户端到服务器的RPC调用 (Run on Server) 和复制变量 (Replicated) 的基本工作流程,这是所有多人游戏功能的基础。

  • 难点与解决方案:

    • 难点1: 客户端擅自修改速度导致服务器校正“拉扯”

      • 问题: 在未实现RPC时,客户端单独修改行走速度,但服务器仍然维持旧速度,导致服务器强制将客户端位置拉回,产生视觉上的抖动和“拉扯感”。

      • 解决方案: 创建了一个 Run on Server 的RPC (CrouchOnServer)。当客户端需要改变姿态时,它会先在本地预测性地执行,然后通过RPC通知服务器。服务器接收到请求后,权威地改变该玩家的速度和状态,并将这个状态通过复制变量同步给所有其他客户端。

    • 难点2: 引擎在修改已使用的蓝图接口时崩溃

      • 问题: 当尝试为一个已在动画蓝图中被调用的蓝图接口函数添加新的输出参数时,引擎会发生崩溃。

      • 解决方案: 采用了一个有效的规避方法:首先在动画蓝图的事件图中,暂时断开对该接口函数的调用节点,编译并保存。然后回到蓝图接口,安全地添加新的输出参数,再次编译保存。最后,再回到动画蓝图,重新连接接口调用节点并处理新的输出引脚。

    • 难点3: 有限手柄按键的复用

      • 问题: 手柄按键有限,如何用一个按键实现“短按蹲伏,长按卧倒”?

      • 解决方案: 巧妙利用了增强输入系统的触发器功能。在输入映射中,为“蹲伏”绑定了默认的 Pressed 触发器,为“卧倒”绑定了 Hold and Release 触发器,并设置了1秒的持有时间阈值,从而在同一个物理按键上实现了两种不同的逻辑响应。