拓冰建站拓冰建站
首页 / 资讯中心 / 正文

UE5第三人称摄像机平滑跟随系统:5分钟蓝图实现《原神》式手感

1. 项目概述为什么《原神》式视角控制值得研究在虚幻引擎5UE5里做角色移动和摄像机控制几乎是每个项目起步时都会遇到的“第一道坎”。很多新手包括几年前的我都是从引擎自带的第三人称模板开始但很快就会发现模板里的摄像机虽然能用但离“舒服”和“有质感”还差得远。它要么僵硬地跟在角色背后要么在快速转向时产生令人头晕的镜头抖动更别提去适配手机上的触摸操作了。这时候像《原神》这样的游戏就成了绝佳的参考。它的摄像机控制手感非常出色镜头始终平滑地跟随角色旋转时带有自然的延迟和弹性不会让玩家感到突兀在复杂地形比如爬山、钻洞时镜头能智能地避免穿模始终给玩家一个清晰的视野更重要的是它在手机和PC上都能提供一致且流畅的操作体验。这种“高品质的默认体验”正是我们作为开发者应该追求的目标。这个项目的核心就是拆解并复现这种高品质的摄像机跟随逻辑。我们不依赖复杂的C模块而是完全使用UE5的蓝图可视化编程系统来实现。蓝图的可视化特性让我们能清晰地看到数据流动和逻辑判断非常适合学习和理解摄像机控制背后的原理。通过大约5分钟的核心蓝图搭建你就能获得一个手感扎实、可扩展性强的摄像机系统基础无论是用于你的独立游戏项目还是作为深入理解UE5动画和摄像机系统的练习都极具价值。2. 核心设计思路从“硬跟随”到“弹性附着”在动手连节点之前我们必须先想清楚目标。一个糟糕的摄像机系统其问题根源往往在于设计思路。UE5默认的第三人称模板采用的是比较基础的“弹簧臂Spring Arm 摄像机Camera”组件架构。弹簧臂负责处理碰撞检测防止镜头穿墙这是它的强项。但模板中摄像机的位置更新是每帧直接、完全地跟随弹簧臂末端我们称之为“硬跟随”。这会导致几个问题镜头抖动Jitter当角色高速移动或突然转向时由于每帧位置计算和渲染的微小时间差“硬跟随”会放大这种差异产生肉眼可见的抖动。转向生硬镜头旋转没有过渡瞬间完成缺乏真实世界中摄像机因惯性而产生的延迟感操作反馈不柔和。缺乏环境响应镜头在遇到障碍物被弹簧臂推近后当障碍物消失时会“啪”一下瞬间弹回原位置非常突兀。我们的设计思路就是要引入“弹性”和“延迟”的概念将“硬跟随”升级为“弹性附着”。具体来说我们关注三个核心参数的平滑处理位置Location摄像机目标点即理想的、无遮挡的跟随位置不应被直接设为当前位置而应该以一个平滑的速度如通过插值向目标点移动。旋转Rotation镜头的左右Yaw和上下Pitch旋转同样需要平滑过渡。特别是Yaw旋转应该有一个轻微的延迟让镜头“滞后”于角色的瞬间转向模拟出摄像机的物理惯性。距离Arm Length即弹簧臂的长度。当发生碰撞时臂长缩短以拉近镜头当碰撞解除时臂长应平滑地恢复原长而不是瞬间恢复。我们将使用蓝图中最常用的平滑工具——线性插值Lerp和插值到Interp To节点族来实现这些效果。Lerp适合在两个固定值之间按比例取值而Interp To则更强大它基于当前值、目标值和每帧最大变化量Delta来计算平滑过渡是处理跟随逻辑的利器。3. 基础组件搭建与参数解析让我们打开UE5从一个空白的“第三人称游戏”模板开始或者直接创建一个新的角色蓝图如BP_MyCharacter。我们将在这个角色蓝图中构建我们的摄像机系统。3.1 组件层级与初始化首先检查或创建以下组件层级结构在角色蓝图的“组件”面板中BP_MyCharacter (根组件) ├── CapsuleComponent (碰撞体) ├── SkeletalMesh (角色模型) ├── SpringArmComponent (弹簧臂) │ └── CameraComponent (摄像机) └── ... (其他组件如Arrow等)SpringArmComponent的关键参数设置在细节面板中Target Arm Length: 这是弹簧臂的理想长度即无碰撞时摄像机离角色根部的距离。对于《原神》式的过肩视角建议设置在400 - 600之间。我们先设为500.0。Socket Offset: 弹簧臂末端的局部偏移。为了让镜头不在正背后而是在肩膀上方我们通常需要设置一个X和Z方向的偏移。例如(50.0, 0.0, 70.0)可以让镜头偏右并抬高。Probe Size: 碰撞检测球体的半径。默认为12.0通常够用。如果镜头经常在细小的物体间卡住可以适当调小。Do Collision Test:必须勾选。这是弹簧臂的核心功能自动检测碰撞并缩短臂长。Camera Lag: 这是一个内置的简单延迟功能但我们不建议在此处启用。因为它控制的是整个弹簧臂的延迟会影响碰撞检测的响应。我们将实现更精细、独立的延迟控制。CameraComponent的参数摄像机本身的参数相对简单主要确保其附着在弹簧臂末端即可。视场角Field Of View可以根据项目风格调整默认90.0是一个通用值。3.2 创建控制变量为了实现平滑跟随我们需要在蓝图中创建一些变量来存储“当前值”和“目标值”并在每帧更新它们。在角色蓝图的“我的蓝图”面板中创建以下变量TargetArmLength(Float) 用于平滑过渡的目标弹簧臂长度。默认值设为与SpringArm组件的Target Arm Length一致如500.0。CurrentArmLength(Float) 用于平滑过渡的当前弹簧臂长度。默认值也设为500.0。CameraLagSpeed(Float) 摄像机位置和旋转的平滑跟随速度。值越大跟随越快延迟感越小值越小跟随越慢延迟感越强。这是一个非常主观的参数建议初始值设为10.0之后在游戏中实时调整感受。bUseCameraLag(Bool) 一个布尔开关方便我们在编辑器中随时开启或关闭平滑延迟效果用于调试和对比。默认True。注意为什么要把臂长单独拿出来做平滑因为弹簧臂组件自带的Camera Lag虽然能处理位置延迟但它是在碰撞检测之后应用的。这意味着当镜头因碰撞缩回后延迟效果可能会让镜头恢复得更慢甚至产生奇怪的抖动。我们手动控制CurrentArmLength向TargetArmLength平滑过渡可以确保镜头缩回和恢复的速率都是可控且一致的逻辑更清晰。4. 核心蓝图实现平滑延迟与视角控制现在进入最关键的蓝图部分。我们将主要在角色蓝图的“事件图表”Event Graph中工作。4.1 事件驱动与每帧更新首先我们需要一个驱动每帧更新的入口。在事件图表中右键搜索并添加Event Tick节点。这个事件每帧都会执行。从Event Tick节点的Delta Seconds引脚拉出引线这个浮点数代表了上一帧到这一帧的时间间隔以秒为单位。所有基于时间的平滑运算都必须使用这个值这样才能保证在不同帧率下有一致的表现。接下来我们需要获取玩家控制器的旋转输入这决定了镜头如何旋转。添加一个Get Player Controller节点然后从其引出Get Control Rotation节点。这个旋转值就是玩家通过鼠标或手柄摇杆希望摄像机朝向的目标旋转。4.2 实现平滑旋转跟随这是实现“手感”的核心。我们不直接将控制器的旋转设置给弹簧臂而是进行平滑插值。获取当前弹簧臂旋转从SpringArmComponent引用拉出引线添加Get World Rotation节点。这是弹簧臂组件当前的旋转值。使用插值Interp To右键搜索Interp To具体来说是RInterp To用于旋转插值。它有以下几个关键输入Current: 连接Get World Rotation。Target: 连接Get Control Rotation。Delta Time: 连接Event Tick的Delta Seconds。Interp Speed: 连接我们之前创建的变量CameraLagSpeed。条件判断从bUseCameraLag变量拉出引线添加一个Branch分支节点。将Interp To的结果连接到Branch的Condition为True时的输出引脚。将Get Control Rotation直接连接到Branch的Condition为False时的输出引脚。这样当关闭延迟时镜头会立刻对齐控制器旋转。设置旋转将Branch节点的输出经过平滑或不经平滑的旋转值连接到SpringArmComponent的Set World Rotation节点。这段蓝图的意义每帧我们都计算弹簧臂当前旋转向目标控制器旋转平滑过渡后的新旋转值。Interp Speed控制了过渡的速率。当角色突然转向时镜头会以柔和的速度“跟上”玩家的输入而不是瞬间跳转从而消除了生硬感。4.3 实现弹簧臂长度的平滑恢复弹簧臂的碰撞检测是自动的但碰撞解除后臂长的恢复是瞬间的。我们要让它也平滑起来。获取目标与当前臂长从SpringArmComponent拉出引线添加Get Target Arm Length节点。这个值就是弹簧臂根据当前碰撞情况实时计算出的理想长度可能因为撞墙而小于我们设定的500。将它设置给我们创建的TargetArmLength变量使用Set TargetArmLength节点。同时获取CurrentArmLength变量的值。长度插值使用Float Interp To节点浮点数插值。Current: 连接Get CurrentArmLength。Target: 连接Get TargetArmLength注意这里的目标是弹簧臂实时计算出的值不是我们设定的固定值500。Delta Time: 连接Delta Seconds。Interp Speed: 可以再创建一个变量如ArmLengthInterpSpeed来控制或者直接使用一个较大的固定值如15.0因为臂长恢复通常希望比旋转跟随更快一些。更新并应用将Float Interp To的结果设置回CurrentArmLength变量。然后将这个CurrentArmLength的值通过Set Target Arm Length节点设置给SpringArmComponent。重要提示这里有一个关键的顺序逻辑。弹簧臂每帧自己会先根据物理碰撞更新它的内部Target Arm Length。然后我们在Tick事件中读取这个最新的、可能因碰撞而变化的值作为我们平滑插值的目标。我们再根据这个目标平滑地更新CurrentArmLength并最终将这个平滑后的值设回去。这样就实现了“碰撞瞬间响应恢复平滑过渡”的效果。4.4 整合与调试将上述所有逻辑连接到Event Tick事件之后你的蓝图主体部分应该已经形成一条清晰的数据流每帧获取输入和状态经过平滑计算再应用到组件上。现在点击编译并运行。你应该能立刻感受到与默认模板的不同移动鼠标旋转视角时镜头有了柔和的延迟。让角色面向墙壁奔跑镜头会平滑拉近离开墙壁时镜头会平滑拉远没有“弹跳”感。你可以尝试在游戏运行时打开“世界场景设置”中的“实时”参数编辑直接修改CameraLagSpeed变量的值感受不同数值带来的手感差异。通常8.0 - 15.0是比较舒适的区间。5. 高级优化与问题排查基础功能实现后我们会遇到一些实际问题和可以优化的点。以下是几个常见的“坑”及其解决方案。5.1 解决镜头穿模与碰撞抖动问题描述在墙角或复杂模型处镜头可能会轻微抖动或者偶尔穿透模型。原因分析Probe Size检测球大小和碰撞通道设置不当。默认的Visibility或Camera通道可能与场景中某些物体的碰撞预设不匹配。解决方案在SpringArmComponent的细节面板找到“碰撞”分类。将“碰撞通道”从默认的Visibility更改为Camera。这是一个专用的碰撞通道你需要确保场景中所有希望阻挡摄像机的物体如墙壁、家具的碰撞体都在Camera通道上被设置为“阻挡Block”。适当调整Probe Size。如果场景中有很多狭窄缝隙较大的检测球可能会在缝隙两边来回碰撞导致抖动可以尝试稍微调小如10.0。但不要太小否则会降低检测可靠性。5.2 处理上下视角极限Pitch Clamp问题描述玩家可以无限地抬头看天或低头看地可能导致镜头穿入角色身体或看到不合理的视角。解决方案在设置旋转之前对Pitch上下旋转角度进行限制。在平滑旋转计算之后、设置旋转之前获取目标旋转的Pitch值使用Break Rotator节点分解旋转体。使用Clamp (Float)节点限制Pitch角度。一个常见的舒适范围是-70.0向下看到10.0向上看度之间。这个范围可以防止镜头过低穿模也避免了过高看到角色头顶的“上帝视角”。将限制后的Pitch值与原始的Yaw、Roll重新组合成旋转体Make Rotator再传递给Set World Rotation。5.3 适配移动端双指触摸旋转问题描述如何在手机屏幕上实现类似鼠标拖拽的视角旋转解决方案利用UE5的触摸输入事件和向量计算。在角色蓝图的事件图表中添加InputTouch事件节点如InputTouch Move。当触摸点数量Finger Index为2时认为是双指旋转操作。计算当前帧与上一帧两个触摸点中心点的位移向量。将这个位移向量的X和Y分量映射到角色控制器的Add Yaw Input和Add Pitch Input上。通常需要乘以一个灵敏度系数如0.5并将Y轴取反因为屏幕坐标与游戏世界坐标Y轴方向相反。通过这种方式双指在屏幕上的滑动就被转换成了摄像机旋转的输入与我们为PC端写的旋转逻辑完美兼容。5.4 性能考量与调试技巧性能我们的逻辑主要在Event Tick中运行计算量很小几次插值运算对性能影响微乎其微。确保不要在Tick中进行复杂的射线检测或循环即可。调试可以创建两个调试用Text Render组件分别显示TargetArmLength和CurrentArmLength的实时数值直观观察平滑过程。使用Print String节点在控制台输出关键变量的值但注意发布前移除。最有效的调试方式是在游戏运行中实时修改变量。UE5编辑器的“实时”编辑功能是调试手感类参数的神器。6. 实操心得与扩展方向经过多次项目的实践我总结出几个让摄像机系统更稳健的心得心得一参数化是一切的基础。不要将任何速度、限制值、偏移量硬编码在蓝图连线里。一定要做成蓝图变量或暴露给蓝图实例的可编辑变量。这样美术、策划甚至你自己在后续调整手感时无需重新编译蓝图在场景中选中角色实例就可以直接调整效率极高。心得二区分“跟随延迟”和“输入响应”。我们上面实现的是“镜头跟随目标的延迟”。但玩家对“输入”的感知应该是即时的。也就是说当我移动鼠标时虽然镜头平滑跟上但角色的朝向或准心如果有的反馈应该尽可能快。这需要将控制器的旋转输入同时应用到角色模型的旋转或武器的朝向上确保操作反馈不滞后。心得三为特殊状态设计混合Blend。一个完整的角色可能有奔跑、步行、瞄准、攀爬、死亡等多种状态。不同状态下理想的摄像机参数臂长、偏移、延迟速度是不同的。不要试图用一套参数满足所有状态。你应该设计一个状态机当状态切换时使用Timeline或Interp To将摄像机的各项参数TargetArmLength,SocketOffset,CameraLagSpeed等平滑地过渡到新状态对应的预设值。例如进入瞄准状态时镜头应在0.2秒内平滑拉近到角色肩后死亡时镜头可能固定并切换到观察者模式。这个5分钟搭建的基础系统已经能为你80%的第三人称项目提供优秀的摄像机基础。它的价值在于提供了一个清晰、可扩展的框架。你可以在此基础上轻松地添加镜头震动、碰撞时的淡出效果、对话时的镜头运镜等高级功能。理解了这个框架中的数据流输入 - 平滑处理 - 应用输出你就掌握了在虚幻引擎中控制任何需要平滑跟随的事物的核心方法。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门