UE4之跟随移动

该博客介绍了在UE4中实现角色自动跟随的方法,包括创建地图、理解Simple Move to Location和Simple Move to Actor节点,以及如何通过Nav Mesh Bounds Volume设定跟随范围。通过初始化函数和Event Tick事件实现角色的动态跟随,并总结了两种跟随方式的区别。

提示

当前文档使用版本为4.16.

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,在程序开始时候触发,意为初始化。
<think>我们正在使用Unreal Engine实现相机跟随角色移动的功能。根据引用[2]和引用[4],我们可以知道在Unreal Engine中,虚拟摄像机是控制视角的关键,并且引用[4]中提到了通过Input_Look方法处理相机旋转,以及设置相机的俯仰角度限制。但是,用户现在需要的是相机跟随角色移动,即当角色移动时,相机跟随角色一起移动,同时可能还需要保持一定的相对位置(比如第三人称视角)。 实现相机跟随角色移动的常见方法: 1. 使用Spring Arm组件:这是Unreal Engine中实现相机跟随的常用方法。Spring Arm组件可以附加到角色上,然后相机附加到Spring Arm上。Spring Arm可以处理相机与角色之间的碰撞(避免相机穿墙),并且可以设置相机与角色之间的距离、角度等。 2. 使用Camera组件:直接使用Camera组件,并将其附加到角色上,但这样可能无法处理碰撞,所以通常配合Spring Arm使用。 步骤: 1. 在角色蓝图(或Pawn蓝图)中添加一个Spring Arm组件(通常命名为SpringArm)。 2. 设置Spring Arm组件的属性,例如目标臂长(Target Arm Length)、相对位置(Relative Location)和旋转(Relative Rotation)等。 3. 在Spring Arm组件下添加一个Camera组件(作为Spring Arm的子组件)。 4. 调整Spring Arm的位置,使其在角色身后一定距离和高度,并调整相机的角度。 5. 设置Spring Arm组件的碰撞检测,避免相机穿过墙壁等障碍物(通过设置“DoCollisionTest”属性为true)。 另外,引用[4]中提到了角色移动和相机旋转,因此我们还需要处理相机旋转(跟随角色旋转或者独立旋转)。通常,在第三人称游戏中,我们希望相机可以围绕角色旋转(通过鼠标或摇杆控制)。这可以通过旋转Spring Arm组件来实现。 具体实现步骤(蓝图): 1. 打开角色蓝图(例如ThirdPersonCharacter)。 2. 在组件面板中,添加一个“Spring Arm”组件(如果还没有的话)。 3. 将Spring Arm组件的位置调整到角色胶囊体上方(例如Relative Location为(0,0,70))。 4. 在Spring Arm组件下添加一个“Camera”组件。 5. 设置Spring Arm组件的属性: - Target Arm Length: 设置一个初始值(例如300),这是相机距离角色的距离。 - 勾选“Camera Settings”下的“Use Pawn Control Rotation”,这样Spring Arm的旋转会跟随控制器的旋转(通过输入控制)。 6. 设置Camera组件的位置为(0,0,0),旋转为(0,0,0),因为它会继承Spring Arm的位置和旋转。 7. 在角色蓝图中,设置“Auto Possess Player”为“Player 0”,这样角色会自动被玩家控制。 8. 在输入绑定中,绑定轴映射(例如Turn和LookUp)到控制器的旋转(在角色蓝图中已经默认处理了,或者可以自己处理)。 注意:如果希望相机不随角色旋转而旋转(即角色朝向移动方向,而相机独立旋转),则需要在角色移动时,将移动方向转换为相机方向。引用[4]中提到了角色移动和相机旋转的分离。 另一种方法(C++): 如果使用C++,可以在角色类中创建组件并设置它们的关系。 以下是C++代码示例(在角色类的构造函数中): ```cpp // 创建弹簧臂组件 USpringArmComponent* SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm")); SpringArm->SetupAttachment(RootComponent); // 附加到根组件 SpringArm->TargetArmLength = 300.0f; // 设置臂长 SpringArm->bUsePawnControlRotation = true; // 使用控制器的旋转来控制弹簧臂 // 创建相机组件 UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera")); Camera->SetupAttachment(SpringArm, USpringArmComponent::SocketName); // 附加到弹簧臂的末端 ``` 在角色移动时,我们不需要额外处理相机的移动,因为相机已经是角色的子组件(通过弹簧臂),所以会跟随角色移动。 关于相机旋转: 在角色类中,我们通常会在SetupPlayerInputComponent方法中绑定输入: ```cpp void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput); // ... 其他输入绑定,如移动 } ``` 这样,当玩家输入鼠标X轴(Turn)时,控制器会旋转,而由于我们设置了弹簧臂的bUsePawnControlRotation为true,弹簧臂会跟随控制器的旋转,从而带动相机旋转。 总结: 使用Spring Arm组件配合Camera组件是实现相机跟随角色移动的常用且高效的方法。通过调整Spring Arm的参数,我们可以实现不同距离和角度的跟随,同时还能处理碰撞避免相机穿墙。 相关问题: 1. 如何调整相机跟随的平滑度? 2. 当相机遇到障碍物时,如何避免相机突然跳动? 3. 如何实现相机在跟随角色时的不同视角(如第一人称和第三人称切换)?</think>### Unreal Engine 相机跟随角色移动的实现方法 在Unreal Engine中实现相机跟随角色移动,主要通过以下步骤完成(结合蓝图和C++): #### 核心实现步骤 1. **创建弹簧臂组件(SpringArmComponent)** 在角色蓝图或Pawn类中添加`SpringArmComponent`,作为相机与角色之间的缓冲层: ```cpp // C++示例(角色类构造函数中) SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm")); SpringArm->SetupAttachment(RootComponent); SpringArm->TargetArmLength = 500.0f; // 相机距离 SpringArm->bUsePawnControlRotation = true; // 跟随控制器旋转 ``` 2. **附加相机组件** 将相机附加到弹簧臂末端: ```cpp Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera")); Camera->SetupAttachment(SpringArm, USpringArmComponent::SocketName); ``` 3. **配置碰撞检测** 启用弹簧臂的碰撞检测避免穿墙: ```cpp SpringArm->bDoCollisionTest = true; // 自动检测障碍物 SpringArm->ProbeSize = 15.0f; // 碰撞检测半径 ``` 4. **绑定输入控制** 在角色输入映射中绑定移动和视角控制: ```cpp // 输入绑定 PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight); PlayerInputComponent->BindAxis("Turn", this, &AMyCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AMyCharacter::AddControllerPitchInput); ``` 5. **实现角色移动逻辑** 处理移动输入(示例为前后移动): ```cpp void AMyCharacter::MoveForward(float Value) { if (Controller && Value != 0.0f) { const FRotator Rotation = Controller->GetControlRotation(); const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } } ``` #### 关键优化技巧 1. **相机平滑过渡** 在弹簧臂组件中启用`CameraLag`实现平滑跟随: ```cpp SpringArm->bEnableCameraLag = true; SpringArm->CameraLagSpeed = 5.0f; // 滞后系数 ``` 2. **视角限制** 防止相机俯仰角度过度(如引用[4]所述): ```cpp // 在AddControllerPitchInput中限制角度 void AMyCharacter::AddControllerPitchInput(float Value) { const float ClampedPitch = FMath::Clamp(GetControlRotation().Pitch + Value, -70.0f, 70.0f); GetController()->SetControlRotation(FRotator(ClampedPitch, ...)); } ``` 3. **碰撞优化** 配置碰撞通道避免不必要检测: ```cpp SpringArm->CollisionChannel = ECC_Camera; // 专用相机通道 ``` #### 蓝图替代方案 1. 创建`BP_Character`蓝图 2. 添加`Spring Arm`组件并设置目标臂长 3. 添加`Camera`作为弹簧臂的子组件 4. 在`事件图表`中绑定轴映射: ```plaintext [输入轴 MoveForward] -> [添加移动输入(GetActorForwardVector * 值)] [输入轴 LookUp] -> [添加控制器俯仰输入(值)] ``` > **最佳实践**:建议使用弹簧臂组件而非直接附加相机,它提供自动碰撞处理、滞后平滑等关键功能。对于复杂场景(如载具切换),可通过`SetViewTargetWithBlend`实现镜头过渡[^3]。 --- ### 相关问题 1. **如何实现相机碰撞时自动拉近视角?** (弹簧臂的`TargetArmLength`如何根据碰撞动态调整) 2. **第三人称相机和第一人称相机如何切换?** (相机位置切换的平滑过渡实现方法) 3. **多玩家场景中相机跟随如何避免互相干扰?** (网络同步视角的实现原理) 4. **如何为相机添加震动、镜头特效等高级功能?** (CameraShake和后期处理的应用场景)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值