UE4之人物跟随移动

本文介绍如何在UE4中创建自动跟随系统。首先创建第三人称角色,并通过SimpleMovetoLocation和SimpleMovetoActor节点实现跟随效果。同时介绍了如何设置跟随距离及活动范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建地图

首先,创建第三人称模式。进入游戏后,打开如下路径后将ThirdPersonCharacter拖进几个在场景中。 
这里写图片描述

2. 你要了解

要实现自动跟随的效果需要知道以下几个节点

  1. Simple Move to Location 简单的移动位置 
    • Controller 需要移动的目标,Controller类型
    • Goal 目标,Vector类型
  2. Simple Move to Actor 简单的移动到目标角色位置 
    • Controller 需要移动的目标,Controller类型
    • Goal 目标,Actor类型
  3. Get All Actors of Class 根据类来获取演员 
    • Actor Class 需要获取的类
  4. Nav Mesh Bounds Volume 导航网格边界体积

3. 开始实现

  1. 首先,先要获取到需要跟随移动的角色,创建一个函数名为init,在程序开始时候触发,意为初始化。 
    这里写图片描述
  2. 创建一个Character类型数组变量命名为A_pet。用来保存需要跟随移动的角色,在init函数里面给变量赋值。因为有一个是玩家自己,所以需要判断一下,在这里我的代表玩家的角色叫做MainPlayer。 
    这里写图片描述
  3. 回到事件图表里面,创建Event Tick。在这里就需要使用到 Simple Move to Location 节点。首先遍历A_pet,获取到每个Actor的Controller,然后链接到 Simple Move to Location 的参数上。Goal参数需要运算,首先获取到玩家的前方位置和所在位置坐标,然后将前方位置乘上一个负数也就是在玩家背后多少距离然后加上玩家所在坐标将这个Vector的X,Y和需要移动的角色的Z(也就是Z不动)赋值给Goal。这样初步的跟随效果就已经出来了。 
    这里写图片描述
  4. 但是,play后是无法行动的,这里需要设置一个东西。回到场景视图中搜索Nav选择 Nav Mesh Bounds Volume 拖动到场景中,适当的放大,在这个范围内可以跟随移动,超过范围则不可以。 
    这里写图片描述

4. 总结一下

  1. Simple Move to Location 和 Simple Move to Actor 都可以实现简单的跟随效果,但是 Simple Move to Actor 不能控制跟随距离而 Simple Move to Location 可以。
  2. 需要使用 Nav Mesh Bounds Volume 规定范围才可以产生跟随效果。
### UE5 中角色头部跟随摄像机效果的实现 在 Unreal Engine 5 (UE5) 中,要实现角色头部随摄像机移动而转动的效果,可以通过调整 `Character` 的骨骼动画逻辑以及使用蓝图来控制旋转行为。以下是具体方法: #### 使用 Animation Blueprint 控制头部方向 通过创建自定义的动画蓝图(Animation Blueprint),可以设置一个驱动器(Driver)用于基于摄像机位置动态修改头部的方向。 1. **获取摄像机相对于角色的位置向量** 可以利用 `Get Camera Location` 和 `Get Actor Transform` 来计算摄像机与角色之间的相对位置[^1]。 2. **转换为本地空间坐标系** 将世界空间中的摄像机位置转换到角色的局部空间中,以便更方便地处理角度变化: ```cpp FVector LocalCameraLocation = UKismetMathLibrary::InverseTransformVector(GetActorTransform(), CameraLocation); ``` 3. **提取水平和垂直偏移角** 利用 `UKismetMathLibrary::FindLookAtRotation()` 函数获得从角色朝向至摄像机的目标旋转值,并从中分离出 Pitch 和 Yaw 值作为输入参数传递给动画蓝图。 ```cpp FRotator LookAtRot = UKismetMathLibrary::FindLookAtRotation(CharacterMesh->GetComponentLocation(), CameraLocation); float TargetYaw = LookAtRot.Yaw; float TargetPitch = FMath::Clamp(LookAtRot.Pitch, -45.f, 45.f); // 防止过度倾斜 ``` 4. **更新动画曲线或姿势混合权重** 动画蓝图内部应配置 Pose Blend 或 Curve Floats 接收这些数值并影响最终渲染姿态[^3]。 #### 调整 Player Controller 行为修正潜在错误 如果发现某些情况下无法正常返回碰撞面索引等问题,则需注意修复可能存在的引擎缺陷。例如,在特定版本下可能会遇到 `PlayerController.GetHitResultAtScreenPosition()` 方法未提供命中表面编号的情况[^2]。此时建议升级至最新补丁或者手动修补源码解决此类隐患。 ```blueprint // 示例伪代码展示如何组合以上步骤于单一函数内执行 function UpdateHeadDirection() { FVector CamLoc = UGameplayStatics::GetPlayerCameraManager(this).GetCameraLocation(); FVector CharPos = this.MeshComponent->GetComponentLocation(); FVector DirToCam = (CamLoc - CharPos).GetSafeNormal(); FRotator NewRot = UKismetMathLibrary::MakeRotFromX(DirToCam); MeshComponent->SetRelativeRotation(FQuat(NewRot)); } ``` 此脚本片段展示了基本原理但实际项目里还需考虑更多细节比如平滑过渡效果等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值