T03 --- 蓝图操作指南
文档版本 : 1.0
创建日期 : 2026-07-17
关联任务 : T03(角色基类与移动系统)
关联设计文档 :
plans/P0-T03-Design.md目标读者: UE 蓝图新手,需要详细的步骤指导
一、前置准备
1.1 环境检查清单
在开始创建蓝图资产之前,请确认以下条件已满足:
| # | 检查项 | 验证方法 | 预期结果 |
|---|---|---|---|
| 1 | UE 编辑器已启动 | 打开 XiYou 项目 | 编辑器界面正常显示 |
| 2 | C++ 代码已编译 | Live Coding 或 VS2022 编译 | 编译成功,无 Error |
| 3 | MCP Server 已运行 | 控制台输入 ModelContextProtocol.StartServer |
控制台输出 Server 启动信息 |
| 4 | NavMesh 已配置 | 测试地图中放置 NavMeshBoundsVolume | 绿色区域覆盖可行走地面 |
| 5 | PlayerStart 已放置 | 测试地图中放置 PlayerStart | 角色生成位置正确 |
1.2 启动 MCP Server
MCP(Model Context Protocol)Server 允许 AI 通过工具调用直接操控 UE 编辑器,自动创建和配置资产。
✅ 当前状态:已启用 --- 项目已升级到 UE5.8,MCP 插件已在
XiYou.uproject中启用。
前置条件:启用 MCP 插件
Unreal MCP 是 UE 官方插件(UE5.8 起内置,位于 Engine/Plugins/Experimental/ 目录)。需在 XiYou.uproject 的 Plugins 数组中启用以下两个插件:
| 插件名 | 作用 | 必需 |
|---|---|---|
ModelContextProtocol |
MCP Server 核心和传输层 | ✅ 必需 |
AllToolsets |
编辑器操作工具集聚合插件 | ✅ 必需 |
⚠️ 重要 :仅启用
ModelContextProtocol而不启用AllToolsets,服务器能启动但不会暴露任何工具,AI 无法操控编辑器。
当前项目已在 XiYou.uproject 中配置了这两个插件条目。
MCP 插件可用性分析
| UE 版本 | MCP 插件状态 | 说明 |
|---|---|---|
| UE5.6 | ❌ 未内置 | 搜索 Engine/Plugins 目录无此插件 |
| UE5.7 | ❌ 未内置 | 已验证:搜索 Engine/Plugins 无此插件 |
| UE5.8 | ✅ 已内置 | 位于 Engine/Plugins/Experimental/ModelContextProtocol |
启动步骤:
- 在 UE 编辑器中,按
~键打开控制台 - 输入
ModelContextProtocol.StartServer并回车 - 控制台应输出类似
MCP Server started on port 8000的信息 - 确认 AI Agent(如 Roo)已连接到 MCP Server
提示:如果控制台提示命令不存在,请按以下步骤排查:
- 确认
XiYou.uproject的Plugins数组中包含ModelContextProtocol和AllToolsets两个条目- 关闭 UE 编辑器,重新打开项目(插件变更需要重启编辑器生效)
- 编辑器菜单 → Edit → Plugins,搜索
ModelContextProtocol,确认已勾选 Enabled- 如果端口 8000 被占用,控制台运行
ModelContextProtocol.StartServer 8001指定其他端口
1.3 确认 C++ 编译
T03 的蓝图资产依赖以下 C++ 类,必须先编译通过:
| C++ 类 | 蓝图资产依赖 |
|---|---|
AXiYouPlayerCharacter |
BP_XiYouPlayerCharacter 的父类 |
UXiYouInputConfig |
DA_XiYouInputConfig 的父类 |
UXiYouInputComponent |
PlayerController 输入绑定 |
编译方法(二选一):
- 方法 A(Live Coding) :UE 编辑器右下角点击 Live Coding 图标,或按
Ctrl+Alt+F11 - 方法 B(VS2022) :打开
XiYou.sln,选择Development Editor配置,生成解决方案
二、资产创建顺序
按依赖关系排列,必须按以下顺序创建:
#mermaid-svg-5IfF7FmNfLgOYXZa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5IfF7FmNfLgOYXZa .error-icon{fill:#552222;}#mermaid-svg-5IfF7FmNfLgOYXZa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5IfF7FmNfLgOYXZa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5IfF7FmNfLgOYXZa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5IfF7FmNfLgOYXZa .marker.cross{stroke:#333333;}#mermaid-svg-5IfF7FmNfLgOYXZa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5IfF7FmNfLgOYXZa p{margin:0;}#mermaid-svg-5IfF7FmNfLgOYXZa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster-label text{fill:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster-label span{color:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster-label span p{background-color:transparent;}#mermaid-svg-5IfF7FmNfLgOYXZa .label text,#mermaid-svg-5IfF7FmNfLgOYXZa span{fill:#333;color:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa .node rect,#mermaid-svg-5IfF7FmNfLgOYXZa .node circle,#mermaid-svg-5IfF7FmNfLgOYXZa .node ellipse,#mermaid-svg-5IfF7FmNfLgOYXZa .node polygon,#mermaid-svg-5IfF7FmNfLgOYXZa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5IfF7FmNfLgOYXZa .rough-node .label text,#mermaid-svg-5IfF7FmNfLgOYXZa .node .label text,#mermaid-svg-5IfF7FmNfLgOYXZa .image-shape .label,#mermaid-svg-5IfF7FmNfLgOYXZa .icon-shape .label{text-anchor:middle;}#mermaid-svg-5IfF7FmNfLgOYXZa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5IfF7FmNfLgOYXZa .rough-node .label,#mermaid-svg-5IfF7FmNfLgOYXZa .node .label,#mermaid-svg-5IfF7FmNfLgOYXZa .image-shape .label,#mermaid-svg-5IfF7FmNfLgOYXZa .icon-shape .label{text-align:center;}#mermaid-svg-5IfF7FmNfLgOYXZa .node.clickable{cursor:pointer;}#mermaid-svg-5IfF7FmNfLgOYXZa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5IfF7FmNfLgOYXZa .arrowheadPath{fill:#333333;}#mermaid-svg-5IfF7FmNfLgOYXZa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5IfF7FmNfLgOYXZa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5IfF7FmNfLgOYXZa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5IfF7FmNfLgOYXZa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5IfF7FmNfLgOYXZa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5IfF7FmNfLgOYXZa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster text{fill:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa .cluster span{color:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5IfF7FmNfLgOYXZa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5IfF7FmNfLgOYXZa rect.text{fill:none;stroke-width:0;}#mermaid-svg-5IfF7FmNfLgOYXZa .icon-shape,#mermaid-svg-5IfF7FmNfLgOYXZa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5IfF7FmNfLgOYXZa .icon-shape p,#mermaid-svg-5IfF7FmNfLgOYXZa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5IfF7FmNfLgOYXZa .icon-shape .label rect,#mermaid-svg-5IfF7FmNfLgOYXZa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5IfF7FmNfLgOYXZa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5IfF7FmNfLgOYXZa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5IfF7FmNfLgOYXZa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. IA_Move
3. IMC_PC
2. IA_ClickMove
4. DA_XiYouInputConfig
5. ABP_XiYouCharacter
6. BP_XiYouPlayerCharacter
7. 配置 BP 属性
8. 验证测试
| 顺序 | 资产名 | 类型 | 依赖 |
|---|---|---|---|
| 1 | IA_Move |
InputAction | 无 |
| 2 | IA_ClickMove |
InputAction | 无 |
| 3 | IMC_PC |
InputMappingContext | IA_Move, IA_ClickMove |
| 4 | DA_XiYouInputConfig |
DataAsset (UXiYouInputConfig) | IA_Move, IA_ClickMove |
| 5 | ABP_XiYouCharacter |
AnimBlueprint | 骨骼 + 动画资产 |
| 6 | BP_XiYouPlayerCharacter |
Blueprint (AXiYouPlayerCharacter) | ABP_XiYouCharacter, DA_XiYouInputConfig |
三、资产创建详细步骤
3.1 创建 IA_Move(移动输入动作)
资产路径 :Content/Input/IA_Move
资产类型 :InputAction
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Input→Input Action - 命名为
IA_Move - 双击打开
IA_Move编辑器 - 设置以下属性:
| 属性 | 值 | 说明 |
|---|---|---|
| Value Type | Axis2D (Vector2D) |
2D 轴输入,支持 WASD |
| Triggers | 默认(Down) | 按下即触发 |
- 保存资产(
Ctrl+S)
通过 MCP 让 AI 创建
你可以对 AI 说:
"请在 UE 编辑器中创建一个 InputAction 资产,路径为
/Game/Input/IA_Move,Value Type 设置为 Axis2D (Vector2D)。"
AI 会通过 MCP 工具自动完成创建和配置。
验证
- Content Browser 中
Content/Input/IA_Move资产存在 - 双击打开,Value Type 显示为
Axis2D (Vector2D)
3.2 创建 IA_ClickMove(点击移动输入动作)
资产路径 :Content/Input/IA_ClickMove
资产类型 :InputAction
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Input→Input Action - 命名为
IA_ClickMove - 双击打开
IA_ClickMove编辑器 - 设置以下属性:
| 属性 | 值 | 说明 |
|---|---|---|
| Value Type | Digital (bool) |
布尔值,按下/松开 |
| Triggers | 默认(Down) | 按下即触发 |
- 保存资产(
Ctrl+S)
通过 MCP 让 AI 创建
"请创建一个 InputAction 资产,路径为
/Game/Input/IA_ClickMove,Value Type 设置为 Digital (bool)。"
验证
- Content Browser 中
Content/Input/IA_ClickMove资产存在 - 双击打开,Value Type 显示为
Digital (bool)
3.3 创建 IMC_PC(PC 端输入映射上下文)
资产路径 :Content/Input/IMC_PC
资产类型 :InputMappingContext
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Input→Input Mapping Context - 命名为
IMC_PC - 双击打开
IMC_PC编辑器 - 点击
+添加映射条目
配置 IA_Move 映射(4个键位):
| # | InputAction | 键位 | Modifier | 说明 |
|---|---|---|---|---|
| 1 | IA_Move |
W |
无 | 前进(2D Y=+1) |
| 2 | IA_Move |
S |
Negate |
后退(2D Y=-1) |
| 3 | IA_Move |
A |
Negate |
左移(2D X=-1) |
| 4 | IA_Move |
D |
无 | 右移(2D X=+1) |
具体操作(以 W 键为例):
- 在 Mappings 列表中点击
+添加新条目 - 将
IA_Move从 Content Browser 拖入 Action 栏 - 在下方 Key 栏点击,然后按下键盘
W键 - W 键映射完成
配置 S 键(需要 Negate Modifier):
- 添加新条目,Action 设为
IA_Move - Key 设为
S - 在 Modifier 栏点击
+,选择Negate - 这样 S 键的 Y 值为 -1(后退)
配置 A 键(需要 Negate Modifier):
- 添加新条目,Action 设为
IA_Move - Key 设为
A - 添加
NegateModifier - A 键的 X 值为 -1(左移)
配置 D 键:
- 添加新条目,Action 设为
IA_Move - Key 设为
D - 无需 Modifier(X 值为 +1,右移)
配置 IA_ClickMove 映射:
| # | InputAction | 键位 | Modifier | 说明 |
|---|---|---|---|---|
| 5 | IA_ClickMove |
LeftMouseButton |
无 | 左键点击移动 |
-
添加新条目,Action 设为
IA_ClickMove -
Key 设为
LeftMouseButton -
保存资产(
Ctrl+S)
通过 MCP 让 AI 创建
"请创建一个 InputMappingContext 资产,路径为
/Game/Input/IMC_PC。然后添加以下映射:IA_Move 映射到 W(无 Modifier)、S(Negate)、A(Negate)、D(无 Modifier);IA_ClickMove 映射到 LeftMouseButton。"
注意:MCP 可以创建资产和设置基本属性,但 InputMappingContext 的键位映射配置可能需要手动完成(拖拽 InputAction、设置 Key、添加 Modifier)。如果 MCP 无法完成,请手动操作。
验证
- Content Browser 中
Content/Input/IMC_PC资产存在 - 双击打开,Mappings 列表显示 5 个条目
- 每个条目的 Action 和 Key 正确对应
3.4 创建 DA_XiYouInputConfig(输入配置数据资产)
资产路径 :Content/Input/DA_XiYouInputConfig
资产类型 :DataAsset(基于 UXiYouInputConfig)
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Miscellaneous→Data Asset - 在弹出的 "Pick Class" 窗口中,搜索并选择
XiYouInputConfig - 命名为
DA_XiYouInputConfig - 双击打开编辑器
- 在
Native Input Actions数组中添加 2 个条目:
Native Input Actions 配置:
| # | InputAction | InputTag | 说明 |
|---|---|---|---|
| 1 | IA_Move |
InputTag.Move |
WASD 移动 |
| 2 | IA_ClickMove |
InputTag.ClickMove |
左键点击移动 |
具体操作:
- 找到
Native Input Actions属性 - 点击
+添加 2 个元素 - 第 1 个元素:
Input Action:从 Content Browser 拖入IA_MoveInput Tag:从标签下拉菜单中选择InputTag.Move
- 第 2 个元素:
Input Action:从 Content Browser 拖入IA_ClickMoveInput Tag:从标签下拉菜单中选择InputTag.ClickMove
注意 :
InputTag.Move和InputTag.ClickMove标签已通过 C++ 原生定义 (XiYouGameplayTags.h/XiYouGameplayTags.cpp),C++ 代码编译后自动注册到 Gameplay Tags 系统。如果下拉菜单中看不到标签,请确认:
- C++ 代码已成功编译(
XiYouGameplayTags.cpp中使用UE_DEFINE_GAMEPLAY_TAG_COMMENT定义了InputTag.Move和InputTag.ClickMove)- UE 编辑器已重启或标签已刷新
Ability Input Actions数组留空(T04+ 使用)- 保存资产(
Ctrl+S)
通过 MCP 让 AI 创建
"请创建一个 DataAsset,路径为
/Game/Input/DA_XiYouInputConfig,基于类 UXiYouInputConfig。然后在 NativeInputActions 数组中添加两个条目:第一个 InputAction 设为 IA_Move,InputTag 设为 InputTag.Move;第二个 InputAction 设为 IA_ClickMove,InputTag 设为 InputTag.ClickMove。"
验证
- Content Browser 中
Content/Input/DA_XiYouInputConfig资产存在 - 双击打开,Native Input Actions 显示 2 个条目
- 每个条目的 InputAction 和 InputTag 正确对应
- Ability Input Actions 为空
3.5 创建 ABP_XiYouCharacter(动画蓝图)
资产路径 :Content/Animations/ABP_XiYouCharacter
资产类型 :Anim Blueprint
前置:获取动画资产
T03 使用 Lyra 项目或 Fab 免费动画资产(UE5 Mannequin 骨骼)。需要以下动画:
| 动画 | 用途 | 来源建议 |
|---|---|---|
| Idle | 待机呼吸 | Lyra MM_Idle / Fab 免费 Idle |
| Walk | 慢走 | Lyra MM_Walk / Fab 免费 Walk |
| Run | 快跑 | Lyra MM_Run / Fab 免费 Run |
获取方式(三选一):
- 方式 A:从 Lyra 示例项目迁移动画资产到 XiYou 项目
- 方式 B :从 Fab(
fab.com)下载免费 Mannequin 动画包 - 方式 C :使用 UE5 引擎自带的
ThirdPerson模板动画资产
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Animation→Anim Blueprint - 在弹出的窗口中:
- Target Skeleton :选择 UE5 Mannequin 骨骼(如
SKM_Mannequin_Skeleton) - Parent Class :选择
UAnimInstance(或自定义的UXiYouAnimInstance,T03 用默认即可)
- Target Skeleton :选择 UE5 Mannequin 骨骼(如
- 命名为
ABP_XiYouCharacter - 双击打开 AnimBP 编辑器
创建速度变量:
- 在左侧
Class Settings中,添加一个新变量 - 变量名:
Speed - 变量类型:
Float - 勾选
Instance Editable(可选)
配置 Event Graph(更新速度):
-
打开
Event Graph -
找到
Event Blueprint Update Animation节点 -
连接以下逻辑:
Event Blueprint Update Animation
→ TryGetPawnOwner → IsValid?
→ True → GetVelocity → VectorLength → Set Speed
→ False → (无操作)
具体节点连接:
- 从
Event Blueprint Update Animation拉出执行线 - 调用
Try Get Pawn Owner节点 - 调用
Is Valid节点检查 Pawn 是否有效 - 如果有效,调用
Get Velocity节点 - 调用
Vector Length节点获取速度大小 - 使用
Set节点将值写入Speed变量
创建状态机:
- 在 AnimGraph 中,右键 →
Add State Machine - 命名为
Locomotion - 双击进入状态机
创建三个状态:
| 状态名 | 动画资产 | 转换条件(进入) |
|---|---|---|
Idle |
Idle AnimSequence | Speed <= 10 |
Walk |
Walk AnimSequence | Speed > 10 && Speed <= 200 |
Run |
Run AnimSequence | Speed > 200 |
具体操作:
- 在状态机中右键 →
Add State,命名为Idle - 双击
Idle状态,拖入Play Anim Sequence节点 - 在
Play Anim Sequence节点的 Sequence 属性中指定 Idle 动画资产 - 重复上述步骤创建
Walk和Run状态
配置转换规则:
-
从
Idle拉线到Walk,双击转换规则 -
添加条件:
Speed > 10(使用>比较节点) -
从
Idle拉线到Run,条件:Speed > 200 -
从
Walk拉线到Idle,条件:Speed <= 10 -
从
Walk拉线到Run,条件:Speed > 200 -
从
Run拉线到Walk,条件:Speed <= 200 -
从
Run拉线到Idle,条件:Speed <= 10 -
保存资产(
Ctrl+S)
通过 MCP 让 AI 协助
"请创建一个 AnimBlueprint 资产,路径为
/Game/Animations/ABP_XiYouCharacter,基于 UE5 Mannequin 骨骼,父类为 UAnimInstance。"
注意 :AnimBP 的状态机搭建、节点连线等操作 必须手动完成,MCP 无法自动连线。AI 可以创建资产和设置变量,但状态机逻辑需要你在编辑器中手动搭建。
验证
- Content Browser 中
Content/Animations/ABP_XiYouCharacter资产存在 - 双击打开,Event Graph 中有速度更新逻辑
- AnimGraph 中有
Locomotion状态机 - 状态机包含
Idle、Walk、Run三个状态 - 每个状态有对应的
Play Anim Sequence节点 - 转换规则正确配置
3.6 创建 BP_XiYouPlayerCharacter(玩家角色蓝图)
资产路径 :Content/Blueprints/BP_XiYouPlayerCharacter
资产类型 :Blueprint(基于 AXiYouPlayerCharacter)
手动创建步骤
- 在 Content Browser 中,右键空白处
- 选择
Blueprint Class - 在 "Pick Parent Class" 窗口中,搜索
XiYouPlayerCharacter - 选择
AXiYouPlayerCharacter作为父类 - 命名为
BP_XiYouPlayerCharacter - 双击打开蓝图编辑器
配置组件:
| 组件 | 配置项 | 值 |
|---|---|---|
| Mesh (SkeletalMesh) | Skeletal Mesh Asset | UE5 Mannequin(SKM_Mannequin) |
| Mesh (SkeletalMesh) | Anim Class | ABP_XiYouCharacter |
| Mesh (SkeletalMesh) | 位置/旋转 | 调整使模型面向正确方向 |
| CapsuleComponent | Capsule Half Height | 90(默认) |
| CapsuleComponent | Capsule Radius | 34(默认) |
具体操作:
-
配置 Mesh:
- 在 Components 面板选择
Mesh - 在 Details 面板找到
Skeletal Mesh属性 - 从 Content Browser 拖入
SKM_Mannequin(或你使用的骨骼网格体) - 找到
Anim Class属性 - 从下拉菜单选择
ABP_XiYouCharacter
- 在 Components 面板选择
-
调整 Mesh 位置:
- 选择
Mesh组件 - 调整
Location为(0, 0, -90)(使脚底对齐 Capsule 底部) - 调整
Rotation为(0, -90, 0)(使模型面向 +X 方向) - 具体值取决于骨骼朝向,确保角色面朝 +X
- 选择
配置类默认值:
| 属性 | 配置项 | 值 |
|---|---|---|
| AnimClass | 动画蓝图类 | ABP_XiYouCharacter(已通过 Mesh Anim Class 设置) |
注意 :
InputConfig属性在 PlayerController 上设置,不在角色蓝图上。角色蓝图主要配置 Mesh 和 AnimClass。
- 保存资产(
Ctrl+S)
通过 MCP 让 AI 创建
"请创建一个 Blueprint 资产,路径为
/Game/Blueprints/BP_XiYouPlayerCharacter,父类为 AXiYouPlayerCharacter。然后设置 Mesh 组件的 Skeletal Mesh 为 SKM_Mannequin,Anim Class 为 ABP_XiYouCharacter。"
验证
- Content Browser 中
Content/Blueprints/BP_XiYouPlayerCharacter资产存在 - 双击打开,Mesh 组件有 Skeletal Mesh 和 Anim Class
- 视口中角色模型正确显示,面向 +X 方向
3.7 配置 PlayerController 的 InputConfig
操作目标 :在 PlayerController 的蓝图或编辑器中设置 InputConfig 引用。
方法 A:通过 GameMode 蓝图(推荐)
如果 GameMode 使用蓝图配置:
- 创建或打开 GameMode 蓝图(如
BP_XiYouGameMode) - 在 Details 面板找到
Input Config属性 - 从 Content Browser 拖入
DA_XiYouInputConfig
方法 B:通过 C++ 代码设置
在 XiYouPlayerController.cpp 的构造函数中添加:
cpp
// 构造函数中加载 InputConfig 资产
static ConstructorHelpers::FObjectFinder<UXiYouInputConfig> InputConfigFinder(
TEXT("/Game/Input/DA_XiYouInputConfig.DA_XiYouInputConfig"));
if (InputConfigFinder.Succeeded())
{
InputConfig = InputConfigFinder.Object;
}
注意 :
ConstructorHelpers只在构造函数中使用。如果资产路径变更,需同步修改代码。
方法 C:通过编辑器实例设置
- 在 World Settings 中找到 GameMode Override
- 展开 PlayerController Class 的默认值
- 设置
Input Config为DA_XiYouInputConfig
验证
- 运行 PIE,控制台无
InputConfig is null警告 - 按 WASD 角色能移动
- 左键点击地面角色能寻路
四、MCP 工具使用指南
4.1 MCP 能做什么 / 不能做什么
| 操作 | MCP 可自动完成 | 说明 |
|---|---|---|
| 创建资产 | ✅ | 创建 InputAction、IMC、DataAsset、Blueprint 等 |
| 设置资产属性 | ✅ | 设置 Value Type、引用其他资产等 |
| 编译蓝图 | ✅ | 触发蓝图编译 |
| Live Coding | ✅ | 触发 C++ Live Coding 重新编译 |
| 拖拽连线 | ❌ | 蓝图节点连线必须手动 |
| 状态机搭建 | ❌ | AnimBP 状态机必须手动搭建 |
| IMC 键位映射 | ⚠️ 部分 | 可创建 IMC,但键位映射配置可能需要手动 |
4.2 常用 MCP 指令示例
以下是你可以对 AI 说的指令示例:
创建资产
请创建以下资产:
1. InputAction: /Game/Input/IA_Move (Value Type: Axis2D)
2. InputAction: /Game/Input/IA_ClickMove (Value Type: Digital)
3. InputMappingContext: /Game/Input/IMC_PC
4. DataAsset: /Game/Input/DA_XiYouInputConfig (基于 UXiYouInputConfig)
设置属性
请设置 DA_XiYouInputConfig 的 NativeInputActions 数组:
- 第0个元素: InputAction = IA_Move, InputTag = InputTag.Move
- 第1个元素: InputAction = IA_ClickMove, InputTag = InputTag.ClickMove
创建蓝图
请创建 Blueprint: /Game/Blueprints/BP_XiYouPlayerCharacter
父类: AXiYouPlayerCharacter
设置 Mesh 组件的 Anim Class 为 ABP_XiYouCharacter
编译
请触发 Live Coding 重新编译 C++ 代码。
请编译蓝图 BP_XiYouPlayerCharacter。
4.3 MCP 协作工作流
推荐的 AI 协作流程:
- AI 创建资产:让 AI 通过 MCP 创建所有可自动创建的资产
- 手动配置:你手动完成 MCP 无法完成的操作(IMC 键位映射、AnimBP 状态机连线)
- AI 验证:让 AI 通过 MCP 检查资产是否存在、属性是否正确
- AI 编译:让 AI 触发编译
- 你测试:运行 PIE 验证功能
五、验证清单
5.1 逐资产验证
IA_Move 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Input/IA_Move |
✅ |
| 2 | Value Type = Axis2D (Vector2D) | ✅ |
IA_ClickMove 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Input/IA_ClickMove |
✅ |
| 2 | Value Type = Digital (bool) | ✅ |
IMC_PC 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Input/IMC_PC |
✅ |
| 2 | Mappings 包含 5 个条目 | ✅ |
| 3 | IA_Move → W(无 Modifier) | ✅ |
| 4 | IA_Move → S(Negate Modifier) | ✅ |
| 5 | IA_Move → A(Negate Modifier) | ✅ |
| 6 | IA_Move → D(无 Modifier) | ✅ |
| 7 | IA_ClickMove → LeftMouseButton | ✅ |
DA_XiYouInputConfig 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Input/DA_XiYouInputConfig |
✅ |
| 2 | NativeInputActions 包含 2 个条目 | ✅ |
| 3 | 条目0: InputAction=IA_Move, InputTag=InputTag.Move | ✅ |
| 4 | 条目1: InputAction=IA_ClickMove, InputTag=InputTag.ClickMove | ✅ |
| 5 | AbilityInputActions 为空 | ✅ |
ABP_XiYouCharacter 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Animations/ABP_XiYouCharacter |
✅ |
| 2 | Event Graph 有速度更新逻辑 | ✅ |
| 3 | AnimGraph 有 Locomotion 状态机 | ✅ |
| 4 | 状态机包含 Idle/Walk/Run 三个状态 | ✅ |
| 5 | 每个状态有 Play Anim Sequence 节点 | ✅ |
| 6 | 转换规则正确 | ✅ |
BP_XiYouPlayerCharacter 验证
| # | 验证项 | 预期结果 |
|---|---|---|
| 1 | 资产存在于 Content/Blueprints/BP_XiYouPlayerCharacter |
✅ |
| 2 | 父类为 AXiYouPlayerCharacter | ✅ |
| 3 | Mesh 组件有 Skeletal Mesh | ✅ |
| 4 | Mesh 组件 Anim Class = ABP_XiYouCharacter | ✅ |
| 5 | 模型面向 +X 方向 | ✅ |
5.2 整体集成验证
| # | 验证项 | 操作方法 | 预期结果 |
|---|---|---|---|
| 1 | 角色生成 | PIE 启动 | 场景中生成角色,摄像机跟随 |
| 2 | WASD 移动 | 按 W/A/S/D | 角色向世界坐标对应方向移动 |
| 3 | 角色朝向 | 移动时观察 | 角色自动面向移动方向 |
| 4 | 左键点击移动 | 左键点击地面 | 角色寻路到目标点 |
| 5 | 不可达处理 | 点击墙壁/NavMesh 外 | 角色不移动,无报错 |
| 6 | 移动中改向 | 移动中再次点击 | 角色改变目标点 |
| 7 | WASD 取消寻路 | 点击移动后按 WASD | 取消寻路,切换手动移动 |
| 8 | 动画-Idle | 角色静止 | 播放 Idle 动画 |
| 9 | 动画-Walk | 角色慢走 | 播放 Walk 动画 |
| 10 | 动画-Run | 角色快跑 | 播放 Run 动画 |
| 11 | 摄像机缩放 | 鼠标滚轮 | 摄像机缩放正常(T02 功能) |
5.3 DS 多人验证(可选)
| # | 验证项 | 操作方法 | 预期结果 |
|---|---|---|---|
| 1 | 启动 DS | 运行 Dedicated Server | 服务器正常启动 |
| 2 | 客户端连接 | 2 个客户端连接 | 角色正常生成 |
| 3 | 移动同步 | 客户端1 移动 | 客户端2 看到角色移动 |
| 4 | 点击移动同步 | 客户端1 点击移动 | 客户端2 看到角色寻路 |
| 5 | 无严重抖动 | 观察模拟代理 | 移动平滑,无明显抖动 |
六、常见问题与解决方案
Q1: GameplayTag 下拉菜单中看不到 InputTag.Move
原因:C++ 代码未编译或编辑器未刷新。
解决方案:
- 确认 C++ 代码已成功编译(
XiYouGameplayTags.cpp中使用UE_DEFINE_GAMEPLAY_TAG_COMMENT定义了 Tag) - 重启 UE 编辑器
- 或在控制台输入
GameplayTags.RefreshTags刷新标签
说明 :InputTag.Move 和 InputTag.ClickMove 已通过 C++ 原生定义(
UE_DECLARE_GAMEPLAY_TAG_EXTERN+UE_DEFINE_GAMEPLAY_TAG_COMMENT),无需在DefaultGameplayTags.ini中手动注册。INI 文件仅用于补充 GameplayCue 等不需要 C++ 直接引用的辅助 Tag。
Q2: 按 WASD 角色不移动
排查步骤:
- 检查
IMC_PC是否正确配置了键位映射 - 检查
DA_XiYouInputConfig中 NativeInputActions 是否正确 - 检查 PlayerController 的
InputConfig是否已设置 - 检查
SetupInputComponent()中BindNativeAction是否成功 - 控制台输入
showdebug input查看输入状态
Q3: 左键点击角色不移动
排查步骤:
- 确认地图中有
NavMeshBoundsVolume且覆盖可行走区域 - 按
P键查看 NavMesh(绿色区域为可行走) - 检查点击位置是否在 NavMesh 范围内
- 检查
HandleClickMove()中的 NavMesh 可达性检查是否通过
Q4: 动画不切换
排查步骤:
- 检查
ABP_XiYouCharacter的 Event Graph 中速度更新逻辑 - 确认
Speed变量值在移动时变化(使用Print String调试) - 检查状态机转换条件是否正确
- 确认
BP_XiYouPlayerCharacter的 Mesh Anim Class 已设置
Q5: MCP 命令无响应
排查步骤:
- 确认控制台已执行
ModelContextProtocol.StartServer - 确认 AI Agent 已连接到 MCP Server
- 检查 UE 编辑器输出日志是否有 MCP 相关错误
- 尝试重启 MCP Server
Q6: 编译后蓝图找不到 C++ 类
原因:Live Coding 未完全刷新类信息。
解决方案:
- 关闭 UE 编辑器
- 在 VS2022 中重新生成解决方案
- 重新打开 UE 编辑器
- 确认 C++ 类在蓝图 Pick Class 窗口中可见
七、资产路径速查表
| 资产名 | 路径 | 类型 | 父类/基类 |
|---|---|---|---|
| IA_Move | /Game/Input/IA_Move |
InputAction | --- |
| IA_ClickMove | /Game/Input/IA_ClickMove |
InputAction | --- |
| IMC_PC | /Game/Input/IMC_PC |
InputMappingContext | --- |
| DA_XiYouInputConfig | /Game/Input/DA_XiYouInputConfig |
DataAsset | UXiYouInputConfig |
| ABP_XiYouCharacter | /Game/Animations/ABP_XiYouCharacter |
AnimBlueprint | UAnimInstance |
| BP_XiYouPlayerCharacter | /Game/Blueprints/BP_XiYouPlayerCharacter |
Blueprint | AXiYouPlayerCharacter |
八、AI 协作示例对话
以下是你与 AI 协作创建蓝图资产的示例对话流程:
第一轮:创建 InputAction 资产
你:请帮我在 UE 编辑器中创建两个 InputAction 资产:
/Game/Input/IA_Move,Value Type 设为 Axis2D (Vector2D)/Game/Input/IA_ClickMove,Value Type 设为 Digital (bool)
AI:好的,我通过 MCP 工具为你创建这两个资产...(执行 MCP 工具调用)...两个 InputAction 资产已创建完成。
第二轮:创建 IMC_PC
你 :请创建 InputMappingContext 资产 /Game/Input/IMC_PC。
AI:IMC_PC 资产已创建。但键位映射需要你手动配置,请按以下步骤操作:
- 双击打开 IMC_PC
- 添加 5 个映射条目...
(给出详细步骤)
第三轮:创建 DataAsset
你 :请创建 DataAsset /Game/Input/DA_XiYouInputConfig,基于 UXiYouInputConfig 类。然后配置 NativeInputActions。
AI:DA_XiYouInputConfig 已创建。NativeInputActions 已配置为两个条目...(执行 MCP 工具)...请验证配置是否正确。
第四轮:创建 AnimBP
你 :请创建 AnimBlueprint /Game/Animations/ABP_XiYouCharacter。
AI:ABP_XiYouCharacter 资产已创建。但状态机搭建需要你手动完成,请参考蓝图操作指南 §3.5 的步骤...
第五轮:创建角色蓝图
你 :请创建 Blueprint /Game/Blueprints/BP_XiYouPlayerCharacter,父类为 AXiYouPlayerCharacter。
AI:BP_XiYouPlayerCharacter 已创建。Mesh 和 Anim Class 已设置...请验证角色是否正确显示。
第六轮:编译验证
你:请触发 Live Coding 重新编译,然后帮我验证所有资产。
AI:Live Coding 已触发,编译成功。我通过 MCP 检查了所有资产...验证结果如下...全部通过。