视野转动功能介绍
我们之前的初始化已经设置了摄像机手臂和摄像机是跟随我们的Controller旋转的,那么我们视野转动的思路就是旋转我们的Controller,从而间接控制我们的摄像机手臂和摄像机进行旋转,完成视野转动的功能。最主要的就是如何合适的旋转我们的Controller,而第三人称模板给我们展示了两种旋转的方法,同样,我们要声明以下轴映射:

我们先设置ThirdProjectCharacter.cpp中的构造函数:
// 让模型不跟随Controller旋转
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll = false;
// // Character自身会以鼠标的位置为正方向旋转,并且可以平滑的移动过去
GetCharacterMovement()->bOrientRotationToMovement = true;
// 这个是平滑过渡过去的速率
GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f);
第一种方法的转动,我们直接绑定ThirdProjectCharacter.cpp中的输入函数:
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
没错,简单粗暴的方法,我们直接绑定父类Pawn的AddControllerYawInput和AddControllerPitchInput方法即可,这里我们只看其中一个的源码,我们直接看AddControllerYawInput的源代码,在Pawn下
void APawn::AddControllerYawInput(float Val){
if (Val != 0.f && Controller && Controller->IsLocalPlayerController()){
// 获得控制器
APlayerController* const PC = CastChecked<APlayerController>(Controller);
// 更改控制器的Yaw值
PC->AddYawInput(Val);
}
}
然后我们再看AddYawInput的源码,在PlayerController下
void APlayerController::AddYawInput(float Val){
// 如果输入没有没锁住,增加当前的Yaw值,增加量为传入的val
RotationInput.Yaw += !IsLookInputIgnored() ? Val * InputYawScale : 0.f;
}
这种方法就是这样一步一步的修改Controller的旋转值,通过轴映射返回的参数。
现在我们看第二种方法,在ThirdProjectCharacter.h中,我们声明以下内容
public:
// 两个方向上的旋转速率
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
float BaseTurnRate;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
float BaseLookUpRate;
protected:
// 左右看的函数
void TurnAtRate(float Rate);
// 上下看的函数
void LookUpAtRate(float Rate);
在ThirdProjectCharacter.cpp中,我们定义以下内容
在构造函数下初始化两个旋转速率参数
BaseTurnRate = 45.f;
BaseLookUpRate = 45.f;
void AThirdProjectCharacter::TurnAtRate(float Rate){
// 进行旋转,这种方式我们传入了旋转的速率,乘于我们传入的值然后再乘于我们的时间
AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds());
}
void AThirdProjectCharacter::LookUpAtRate(float Rate){
// 同上
AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds());
}
然后我们再进行绑定
PlayerInputComponent->BindAxis("TurnRate", this, &AThirdProjectCharacter::TurnAtRate);
PlayerInputComponent->BindAxis("LookUpRate", this, &AThirdProjectCharacter::LookUpAtRate);
这种方式没有上面第一种的那么粗暴,我们传入了旋转的速率和世界的时间,对我们鼠标的控制是比较友好的,不会速率可控,而对于手柄而言,我们简单粗暴的传入摇杆返回的值即可,太快的话不易控制,而AddControllerYawInput方法我们上面已经解析过,这里不再解析。