视野转动功能介绍


  我们之前的初始化已经设置了摄像机手臂和摄像机是跟随我们的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方法我们上面已经解析过,这里不再解析。