Skip to content

摄像机优化

除去普通行进的镜头平滑移动外,在 Dash 或者 Sprint 等的操作时候也需要有一些特殊的“运镜”,才会使得画面更灵活,力量感画面感电影感(各种感等)才能出来。

FOV 设置

FOV,即 Field of View,也就是常说的视野(单独开一篇说明这个事情吧)

FOV 越大:

  • 视野越广
  • 画面边缘透视越明显
  • 速度感越强

FOV 越小:

  • 视野越窄
  • 构图更集中
  • 压缩感更强

在默认镜头的 FOV 下,我们可以在 Dash 和 Sprint 触发的时候增加 FOV 达到提升速度感的镜头效果

具体实现 ——

  • Dash:瞬时到一个高速度, 所以直接赋值修改 FOV,并且在结束触发回调函数的时候把 FOV 改回默认大小
  • Sprint:由于是一个长时间的状态,所以在改变 FOV 的时候做一个插值平滑过渡

SpringArm

第三人称相机臂。

负责 ——

  • 让相机和角色保持距离
  • 发生碰撞时自动收缩
  • 让相机跟随角色
  • 提供 CameraLag / RotationLag

主要可以使得镜头更柔和,不那么生硬机械(作用和 Unity 中的 Cinemachine 类似

代码设计

做个数据驱动,单独把相机参数拉成一个DataAsset

不如贴出来直观 ——

C++
UCLASS()  
class SAKURA_API USakuraCameraTuningData : public UDataAsset  
{  
    GENERATED_BODY()  
  
public:  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "30.0", ClampMax = "120.0"))  
    float DefaultFOV = 80.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "30.0", ClampMax = "120.0"))  
    float SprintFOV = 88.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "0.0"))  
    float FOVInterpSpeed = 8.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Dash", meta = (ClampMin = "0.0"))  
    float DashFOVKick = 6.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Dash", meta = (ClampMin = "0.0"))  
    float DashFOVKickHoldTime = 0.08f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|SpringArm", meta = (ClampMin = "0.0"))  
    float TargetArmLength = 420.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|SpringArm")  
    FVector SocketOffset = FVector(0.0f, 55.0f, 65.0f);  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag")  
    bool bEnableCameraLag = true;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag", meta = (ClampMin = "0.0"))  
    float CameraLagSpeed = 12.0f;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag")  
    bool bEnableCameraRotationLag = true;  
  
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag", meta = (ClampMin = "0.0"))  
    float CameraRotationLagSpeed = 16.0f;  
};

SpringArm 的设置参数也一起抽离到数据资产中,方便进行配置

同时把相机调整的方法抽成一个单独的 Component, 然后把需要调整的 UCameraComponentInCameraBoom 以及调整数据 InCameraTuningData 做依赖注入,由 CharacterBeginPlay 阶段做初始化

Released under the MIT License.