“奇怪,这blog不支持md格式吗”
## 第1步:设置玩家Pawn
创建一个蓝图类,继承自 Pawn,在游戏模式(Game Mode)中,将这个Pawn设置为默认
在组件面板中,添加一个 Spring Arm 组件
在组件面板中,添加一个 Camera 组件,并将它拖拽到 Spring Arm 组件上,使其成为子级
## 第2步:设置增强输入(Enhanced Input)
创建输入动作 (Input Action)
在内容浏览器中右键 -> 输入 -> 输入动作(Input Action)。
命名为 IA_Zoom。
打开它,将 Value Type 设置为 Axis1D (float)。这表示它会提供一个浮点数值。
创建输入映射上下文 (Input Mapping Context)
在内容浏览器中右键 -> 输入 -> 输入映射上下文(Input Mapping Context)。
命名为 IMC_Default。
打开它,点击 Mappings 旁边的 + 号。
在新增的条目中,选择我们刚刚创建的 IA_Zoom。
点击旁边的小键盘图标,在搜索框中输入 Mouse Wheel,选择 Mouse Wheel Axis。
将IMC应用到玩家
打开玩家控制器(Player Controller)蓝图,或者如果你没有自定义的,可以在Pawn蓝图的 BeginPlay 事件中完成。
在 Event BeginPlay 事件后,添加以下节点,将 IMC_Default 应用到玩家身上。
## 第3步:在Pawn蓝图中实现缩放逻辑(拉近拉远视角)
打开Pawn蓝图的事件图表。
创建三个浮点型变量来控制缩放:
ZoomSpeed (缩放速度,例如:50.0)
MinZoomLength (最小臂长,例如:300.0)
MaxZoomLength (最大臂长,例如:2000.0)
将它们设置为“可编辑实例”,这样就可以在编辑器里直接调整。
在事件图表中右键,搜索并添加 IA_Zoom 事件节点。
实现以下蓝图逻辑:
逻辑分解:
IA_Zoom (Triggered): 当鼠标滚轮滚动时,这个事件会被触发。
Action Value: 这是鼠标滚轮的值。向上滚动是 1.0,向下是 -1.0。
Get Spring Arm: 获取我们要控制的弹簧臂组件。
Get Target Arm Length: 获取当前弹簧臂的长度。
乘法 (float): Action Value * ZoomSpeed 计算出本次滚动应该改变多少长度。
减法 (float): 当前长度 - 改变的长度。我们用减法是因为向上滚动(值为正)时,我们希望臂长变短(拉近镜头)。
Clamp (float): 这是关键!它会将计算出的新长度限制在 MinZoomLength 和 MaxZoomLength 之间,确保不会超出范围。
Set Target Arm Length: 将最终被限制过的值设置回弹簧臂,完成缩放。
## 第4步:创建新的输入动作 IA_Move(水平移动)
1. 在内容浏览器中,右键 -> 输入 (Input) -> 输入动作 (Input Action)。
2. 命名为 IA_Move。
3. 双击打开它,在 Details 面板中,将 Value Type 设置为 Axis2D (Vector 2D)。这表示它会同时处理两个方向的输入(X轴和Y轴)。
## 第5步:更新输入映射上下文 IMC_Default
1. 打开之前创建的 IMC_Default 文件。
2. 在 Mappings 列表中,点击 + 号添加一个新的映射。
3. 在新增的条目中,选择我们刚刚创建的 IA_Move。
4. 现在,我们需要为 IA_Move 添加四个按键映射:W, S, A, D。
添加 'W' 键 (向前):
点击 IA_Move 旁边的小 + 号,添加一个按键。
选择键盘图标,搜索并选择 W 键。
在 W 键的设置中,添加一个 Modifier -> Swizzle Input Axis Values。这个修饰符可以将一维的按键输入(按下/松开)转换到二维向量的特定轴上。默认情况下,它会映射到Y轴,这正是我们想要的(在UE中,Y轴通常代表“前进”方向)。
添加 'S' 键 (向后):
再次为 IA_Move 添加一个按键,选择 S 键。
为 S 键添加一个 Modifier -> Negate。这会将输入值取反(从 1.0 变为 -1.0),实现向后移动。
再为 S 键添加第二个 Modifier -> Swizzle Input Axis Values。确保Negate在Swizzle之上,这样是先取反再映射到Y轴。
添加 'D' 键 (向右):
为 IA_Move 添加一个按键,选择 D 键。
D 键默认就会映射到X轴的正方向,所以它不需要任何Modifier。
添加 'A' 键 (向左):
为 IA_Move 添加一个按键,选择 A 键。
为 A 键添加一个 Modifier -> Negate。这会将X轴的输入值取反,实现向左移动。
## 第6步:在Pawn蓝图中实现移动逻辑
现在我们回到Pawn蓝图的 事件图表 (Event Graph)。
1. 创建移动速度变量:
在 My Blueprint 面板中,创建一个新的浮点型变量,命名为 MoveSpeed。
编译蓝图后,给它一个默认值,比如 1000.0。
2. 添加 IA_Move 事件节点:
在事件图表的空白处右键,搜索并添加 IA_Move 事件节点。
注意:这个事件会在按键被按住期间持续触发 (Triggered),这正是我们想要的平滑移动效果。
3. 实现移动蓝图逻辑:
我们需要在每一帧(Tick)都根据输入来移动Pawn,所以最好将移动逻辑放在 Event Tick 中,并通过 IA_Move 事件来更新一个代表移动方向的变量。
创建一个新变量: 在 My Blueprint 面板中,创建一个 Vector 2D 类型的变量,命名为 MoveInput。这个变量将存储 W/A/S/D 的输入状态。
逻辑A: 更新 MoveInput 变量
从 IA_Move 的 Triggered 执行引脚连接到一个 Set MoveInput 节点,将 Action Value (这是一个Vector 2D) 存入我们的变量。
从 IA_Move 的 Completed 执行引脚(当所有相关按键都松开时触发)也连接到一个 Set MoveInput 节点,但这次将值设置为 (0, 0),以停止移动。
逻辑B: 在 Event Tick 中执行移动
找到 Event Tick 节点。
从 Event Tick 拖出,添加 Add Actor World Offset 节点。这个节点可以直接移动Actor,并且会自动处理碰撞(如果开启了碰撞)。
接下来是关键:计算每帧的移动偏移量 (Delta Location)。
计算偏移量的详细步骤:
1. Get MoveInput: 获取我们存储的二维移动输入。
2. Get Control Rotation: 获取玩家控制器的旋转。这代表了玩家的视角方向。我们只关心水平旋转(Yaw)。
3. Break Rotator: 将旋转分解为 Roll, Pitch, Yaw。
4. Make Rotator: 只使用 Yaw 值,重新创建一个只包含水平旋转的 Rotator。这确保我们移动时不会因为相机俯仰而向上或向下飞。
5. Get Forward Vector: 从这个纯水平的旋转中获取“前”方向向量。
6. Get Right Vector: 从这个纯水平的旋转中获取“右”方向向量。
7. 拆分 MoveInput: 使用 Break Vector 2D 节点,将 MoveInput 分为 X 和 Y。
8. 计算最终方向:
§ Forward Vector * MoveInput.Y -> 计算前后方向的移动分量。
§ Right Vector * MoveInput.X -> 计算左右方向的移动分量。
§ 将这两个向量相加,得到最终的移动方向向量。
9. 标准化 (Normalize): 对合成的方向向量进行标准化,确保斜向移动的速度和直线移动的速度一致。
10. 乘以速度和时间:
§ 将标准化后的方向向量乘以 MoveSpeed。
§ 再乘以 Event Tick 提供的 Delta Seconds。这确保移动速度与帧率无关,在任何电脑上都一样快。(我的demo中没用此步骤)
11. 连接到 Add Actor World Offset: 将最终计算出的偏移量连接到 Delta Location 引脚。
## 第7步:创建新的输入动作
1. 创建 IA_Look (用于鼠标移动)
在内容浏览器中,右键 -> 输入 (Input) -> 输入动作 (Input Action)。
命名为 IA_Look。
打开它,将 Value Type 设置为 Axis2D (Vector 2D)。
2. 创建 IA_RotateCamera (用于鼠标右键)
再次创建一个新的输入动作。
命名为 IA_RotateCamera。
这个动作使用默认的 Value Type Digital (bool) 即可,因为它只关心按下(true)和松开(false)。
## 第8步:更新输入映射上下文 IMC_Default
1. 打开IMC_Default 文件。
2. 添加 IA_RotateCamera 映射:
点击 Mappings 列表旁的 + 号,添加一个新映射。
选择 IA_RotateCamera。
点击键盘图标,选择 Right Mouse Button。
3. 添加 IA_Look 映射 (关键步骤):
再次点击 + 号,添加另一个新映射。
选择 IA_Look。
点击键盘图标,搜索并选择 Mouse XY 2D-Axis。这个代表鼠标在X和Y轴上的移动。
最重要的部分:为这个映射添加一个 触发器 (Trigger)。
在 IA_Look 映射条目的 Triggers 数组旁,点击 + 号。
在下拉菜单中选择 Chorded Action。
Chorded Action 触发器的作用是:只有当另一个指定的动作(Chord Action)被触发时,当前这个动作(在这里是IA_Look)才会被激活。
在 Chorded Action 的设置中,将 Chord Action 属性设置为我们刚刚创建的 IA_RotateCamera。
这个设置意味着:只有当 IA_RotateCamera(即鼠标右键)被按住时,IA_Look(鼠标移动)的输入才会被发送到我们的蓝图。这完美地实现了“按住右键移动鼠标才旋转”的需求。
## 第9步:在Pawn蓝图中仅实现水平旋转逻辑
1. 添加 IA_Look 事件节点:
○ 在事件图表的空白处右键,搜索并添加 IA_Look 事件节点。
2. 实现旋转蓝图逻辑:
○ 从 IA_Look 事件节点的 Action Value (这是一个Vector 2D) 拖出一条线。
○ 使用 Break Vector 2D 节点来分离出X和Y的值。
○ 我们只关心 X 值,因为它代表鼠标的水平移动。
○ 将 X 值乘以 LookSpeed 变量,以控制旋转速度。
○ 将最终的结果连接到 Add Controller Yaw Input 节点的 Val 输入引脚。
注意:
Pawn蓝图, 在右侧的 Details 面板中,搜索 Use Controller Rotation Yaw,要记得勾选(默认应该是不勾选的把)