Unreal Engine开发:虚拟摄像机开发_虚拟摄像机类型与功能

虚拟摄像机类型与功能

在Unreal Engine中,虚拟摄像机是游戏开发中不可或缺的一部分,它们负责捕捉游戏世界中的视角并将其呈现给玩家。不同的游戏类型和场景需要不同类型的摄像机来实现最佳的视觉效果和游戏体验。本节将详细介绍Unreal Engine中常见的虚拟摄像机类型及其功能,并通过具体示例展示如何在项目中使用这些摄像机。

1. 基本摄像机类型

1.1 固定摄像机

固定摄像机是一种不随玩家或游戏对象移动的摄像机,通常用于过场动画或特定场景的观察。这种摄像机的位置和方向是预先设定好的,不会动态改变。

实现固定摄像机
  1. 创建固定摄像机

    在Unreal Engine中,可以通过以下步骤创建固定摄像机:

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Camera

    • 将摄像机放置在关卡中所需的位置。

  2. 设置摄像机属性

    选择创建的摄像机,在细节面板中可以设置摄像机的属性,如位置、旋转、视野等。

    
    // 设置摄像机位置和旋转
    
    CameraActor->SetActorLocation(FVector(1000.0f, 0.0f, 500.0f));
    
    CameraActor->SetActorRotation(FRotator(0.0f, -45.0f, 0.0f));
    
    
  3. 激活固定摄像机

    可以通过代码或蓝图激活固定摄像机,使玩家的视角切换到该摄像机。

    
    // 通过代码激活固定摄像机
    
    APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
    if (PlayerController)
    
    {
          
          
    
        PlayerController->SetViewTarget(CameraActor);
    
    }
    
    
    
    // 通过蓝图激活固定摄像机
    
    Set View Target with Blend
    
    

1.2 跟踪摄像机

跟踪摄像机是一种跟随玩家或游戏对象移动的摄像机,通常用于动作游戏或角色扮演游戏。这种摄像机可以根据目标对象的位置和状态动态调整其位置和方向。

实现跟踪摄像机
  1. 创建跟踪摄像机

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Pawn

    • 在Pawn中添加一个Spring Arm组件,并在其末端添加一个Camera组件。

  2. 设置Spring Arm属性

    Spring Arm组件可以控制摄像机的跟随距离和角度,使其更加灵活。

    
    // 设置Spring Arm属性
    
    SpringArm->TargetArmLength = 300.0f; // 跟随距离
    
    SpringArm->SocketOffset = FVector(0.0f, 0.0f, 100.0f); // 偏移量
    
    SpringArm->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f)); // 初始旋转
    
    
  3. 激活跟踪摄像机

    在Pawn的代码中,确保Spring Arm和Camera组件被正确设置为玩家的视角目标。

    
    // 通过代码激活跟踪摄像机
    
    APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
    if (PlayerController)
    
    {
          
          
    
        PlayerController->SetViewTargetWithBlend(this, 0.5f, EViewTargetBlendFunction::VTBlend_Cubic);
    
    }
    
    

1.3 第一人称摄像机

第一人称摄像机是一种让玩家从角色的视角看到游戏世界的摄像机,通常用于第一人称射击游戏或冒险游戏。这种摄像机的位置和方向与角色的位置和方向完全同步。

实现第一人称摄像机
  1. 创建第一人称摄像机

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Pawn

    • 在Pawn中添加一个Camera组件,并将其放置在角色头部的位置。

  2. 设置摄像机属性

    确保摄像机的位置和方向与角色的头部一致。

    
    // 设置摄像机位置
    
    Camera->SetRelativeLocation(FVector(0.0f, 0.0f, 64.0f)); // 假设角色高度为64
    
    
  3. 激活第一人称摄像机

    在Pawn的代码中,确保摄像机被正确设置为玩家的视角目标。

    
    // 通过代码激活第一人称摄像机
    
    APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
    if (PlayerController)
    
    {
          
          
    
        PlayerController->SetViewTarget(this);
    
    }
    
    

1.4 第三人称摄像机

第三人称摄像机是一种让玩家从角色后方或侧方看到游戏世界的摄像机,通常用于动作游戏或角色扮演游戏。这种摄像机的位置和方向可以根据玩家的需求进行调整。

实现第三人称摄像机
  1. 创建第三人称摄像机

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Pawn

    • 在Pawn中添加一个Spring Arm组件,并在其末端添加一个Camera组件。

  2. 设置Spring Arm属性

    Spring Arm组件可以控制摄像机的跟随距离和角度,使其更加灵活。

    
    // 设置Spring Arm属性
    
    SpringArm->TargetArmLength = 300.0f; // 跟随距离
    
    SpringArm->SocketOffset = FVector(0.0f, 0.0f, 100.0f); // 偏移量
    
    SpringArm->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f)); // 初始旋转
    
    
  3. 激活第三人称摄像机

    在Pawn的代码中,确保Spring Arm和Camera组件被正确设置为玩家的视角目标。

    
    // 通过代码激活第三人称摄像机
    
    APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
    if (PlayerController)
    
    {
          
          
    
        PlayerController->SetViewTargetWithBlend(this, 0.5f, EViewTargetBlendFunction::VTBlend_Cubic);
    
    }
    
    

1.5 自由摄像机

自由摄像机是一种可以让玩家自由控制的摄像机,通常用于模拟飞行或探索游戏世界。这种摄像机的位置和方向完全由玩家的输入决定。

实现自由摄像机
  1. 创建自由摄像机

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Camera

    • 将摄像机放置在关卡中所需的初始位置。

  2. 设置摄像机控制

    需要在代码或蓝图中设置摄像机的输入控制,使其能够响应玩家的输入。

    
    // 设置摄像机控制
    
    void AFreeCameraPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    
    {
          
          
    
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
    
    
        PlayerInputComponent->BindAxis("MoveForward", this, &AFreeCameraPawn::MoveForward);
    
        PlayerInputComponent->BindAxis("MoveRight", this, &AFreeCameraPawn::MoveRight);
    
        PlayerInputComponent->BindAxis("Turn", this, &AFreeCameraPawn::AddControllerYawInput);
    
        PlayerInputComponent->BindAxis("LookUp", this, &AFreeCameraPawn::AddControllerPitchInput);
    
    }
    
    
    
    void AFreeCameraPawn::MoveForward(float Value)
    
    {
          
          
    
        if (Value != 0.0f)
    
        {
          
          
    
            AddMovementInput(GetActorForwardVector(), Value);
    
        }
    
    }
    
    
    
    void AFreeCameraPawn::MoveRight(float Value)
    
    {
          
          
    
        if (Value != 0.0f)
    
        {
          
          
    
            AddMovementInput(GetActorRightVector(), Value);
    
        }
    
    }
    
    
  3. 激活自由摄像机

    在Pawn的代码中,确保摄像机被正确设置为玩家的视角目标。

    
    // 通过代码激活自由摄像机
    
    APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
    if (PlayerController)
    
    {
          
          
    
        PlayerController->SetViewTargetWithBlend(this, 0.5f, EViewTargetBlendFunction::VTBlend_Cubic);
    
    }
    
    

1.6 多摄像机系统

多摄像机系统允许游戏中同时使用多个摄像机,并根据不同的场景和需求切换摄像机。这种系统通常用于复杂的场景,如多视角战斗或过场动画。

实现多摄像机系统
  1. 创建多个摄像机

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建多个摄像机Actor。

  2. 管理摄像机切换

    可以通过代码或蓝图管理摄像机的切换逻辑。

    
    // 管理摄像机切换
    
    void AMultiCameraSystem::SwitchToCamera(AActor* NewCamera)
    
    {
          
          
    
        APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
        if (PlayerController && NewCamera)
    
        {
          
          
    
            PlayerController->SetViewTargetWithBlend(NewCamera, 1.0f, EViewTargetBlendFunction::VTBlend_Cubic);
    
        }
    
    }
    
    
    
    // 通过蓝图管理摄像机切换
    
    Set View Target with Blend
    
    
  3. 触发摄像机切换

    可以通过事件、按键或其他逻辑触发摄像机的切换。

    
    // 通过按键触发摄像机切换
    
    void AMultiCameraSystem::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    
    {
          
          
    
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
    
    
        PlayerInputComponent->BindAction("SwitchCamera", IE_Pressed, this, &AMultiCameraSystem::OnSwitchCameraPressed);
    
    }
    
    
    
    void AMultiCameraSystem::OnSwitchCameraPressed()
    
    {
          
          
    
        // 切换到下一个摄像机
    
        int32 CurrentCameraIndex = Cameras.IndexOfByKey(CurrentCamera);
    
        int32 NextCameraIndex = (CurrentCameraIndex + 1) % Cameras.Num();
    
        SwitchToCamera(Cameras[NextCameraIndex]);
    
    }
    
    

1.7 摄像机抖动效果

摄像机抖动效果可以增加游戏的紧张感和真实感,通常用于爆炸、撞击或角色受伤等场景。

实现摄像机抖动效果
  1. 创建摄像机抖动效果

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的CameraShake类。

  2. 设置摄像机抖动参数

    在CameraShake类中设置抖动的参数,如幅度、频率和持续时间。

    
    // 设置摄像机抖动参数
    
    UCameraShakeBase* MyCameraShake = NewObject<UCameraShakeBase>(this, MyCameraShakeClass);
    
    MyCameraShake->OscillationDuration = 2.0f; // 抖动持续时间
    
    MyCameraShake->OscillationBlendInTime = 0.5f; // 抖动开始时的混合时间
    
    MyCameraShake->OscillationBlendOutTime = 1.0f; // 抖动结束时的混合时间
    
    MyCameraShake->PlayShake(this);
    
    
  3. 应用摄像机抖动

    通过代码或蓝图在特定事件中应用摄像机抖动效果。

    
    // 通过代码应用摄像机抖动
    
    void AMyPawn::ApplyCameraShake()
    
    {
          
          
    
        APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
        if (PlayerController)
    
        {
          
          
    
            UCameraShakeBase* MyCameraShake = NewObject<UCameraShakeBase>(this, MyCameraShakeClass);
    
            PlayerController->PlayerCameraManager->StartCameraShake(MyCameraShake);
    
        }
    
    }
    
    
    
    // 通过蓝图应用摄像机抖动
    
    Start Camera Shake
    
    

1.8 摄像机FOV效果

摄像机视野(Field of View, FOV)效果可以改变摄像机的视野范围,通常用于变化游戏镜头的焦距,如瞄准、奔跑或特定场景的观察。

实现摄像机FOV效果
  1. 创建摄像机FOV效果

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的CameraShake类,专门用于FOV效果。

  2. 设置FOV效果参数

    在CameraShake类中设置FOV变化的参数,如目标FOV、变化时间和变化方式。

    
    // 设置FOV效果参数
    
    UCameraShakeBase* MyFOVShake = NewObject<UCameraShakeBase>(this, MyFOVShakeClass);
    
    MyFOVShake->FOVDuration = 1.0f; // FOV变化持续时间
    
    MyFOVShake->FOVBlendInTime = 0.5f; // FOV变化开始时的混合时间
    
    MyFOVShake->FOVBlendOutTime = 0.5f; // FOV变化结束时的混合时间
    
    MyFOVShake->PlayShake(this);
    
    
  3. 应用摄像机FOV效果

    通过代码或蓝图在特定事件中应用摄像机FOV效果。

    
    // 通过代码应用摄像机FOV效果
    
    void AMyPawn::ApplyFOVShake(float TargetFOV)
    
    {
          
          
    
        APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
        if (PlayerController)
    
        {
          
          
    
            UCameraShakeBase* MyFOVShake = NewObject<UCameraShakeBase>(this, MyFOVShakeClass);
    
            MyFOVShake->TargetFOV = TargetFOV;
    
            PlayerController->PlayerCameraManager->StartCameraShake(MyFOVShake);
    
        }
    
    }
    
    
    
    // 通过蓝图应用摄像机FOV效果
    
    Start Camera Shake
    
    

1.9 摄像机跟随路径

摄像机跟随路径可以使摄像机沿着预设的路径移动,通常用于过场动画或特定场景的观察。这种路径可以是线性的,也可以是曲线的。

实现摄像机跟随路径
  1. 创建路径点

    • 打开Unreal Engine编辑器。

    • 在关卡中创建多个路径点(Spline Points)。

  2. 创建路径

    • 在内容浏览器中创建一个新的Spline组件。

    • 将路径点添加到Spline组件中,并设置路径的形状。

  3. 设置摄像机跟随路径

    通过代码或蓝图设置摄像机跟随路径的逻辑。

    
    // 设置摄像机跟随路径
    
    void APathFollowingCamera::FollowPath()
    
    {
          
          
    
        if (SplineComponent && CameraActor)
    
        {
          
          
    
            FTransform Transform;
    
            float Time = 0.0f;
    
            float TimeToReach = 5.0f; // 路径跟随时间
    
    
    
            while (Time <= TimeToReach)
    
            {
          
          
    
                Transform = SplineComponent->GetTransformAtDistance(Time * SplineComponent->GetSplineLength() / TimeToReach, ESplineCoordinateSpace::World);
    
                CameraActor->SetActorLocation(Transform.GetLocation());
    
                CameraActor->SetActorRotation(Transform.GetRotation().Rotator());
    
    
    
                Time += GetWorld()->GetDeltaSeconds();
    
                FTimerHandle TimerHandle;
    
                GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &APathFollowingCamera::FollowPath, 0.01f, false);
    
            }
    
        }
    
    }
    
    
    
    // 通过蓝图设置摄像机跟随路径
    
    For Each Spline Point
    
    Set Camera Location and Rotation
    
    

1.10 摄像机平滑过渡

摄像机平滑过渡可以使摄像机在切换目标时更加自然,通常用于避免突然的视角变化给玩家带来不适感。

实现摄像机平滑过渡
  1. 设置平滑过渡属性

    在代码或蓝图中设置平滑过渡的属性,如过渡时间和过渡方式。

    
    // 设置平滑过渡属性
    
    void ASmoothCameraSystem::SwitchToCamera(AActor* NewCamera, float TransitionTime)
    
    {
          
          
    
        APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
        if (PlayerController && NewCamera)
    
        {
          
          
    
            PlayerController->SetViewTargetWithBlend(NewCamera, TransitionTime, EViewTargetBlendFunction::VTBlend_Cubic);
    
        }
    
    }
    
    
  2. 应用平滑过渡

    通过代码或蓝图在摄像机切换时应用平滑过渡效果。

    
    // 通过代码应用平滑过渡
    
    void AMyPawn::OnSwitchCameraPressed()
    
    {
          
          
    
        APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
    
        if (PlayerController)
    
        {
          
          
    
            AActor* NewCamera = GetNextCamera(); // 获取下一个摄像机
    
            if (NewCamera)
    
            {
          
          
    
                PlayerController->SetViewTargetWithBlend(NewCamera, 1.0f, EViewTargetBlendFunction::VTBlend_Cubic);
    
            }
    
        }
    
    }
    
    
    
    // 通过蓝图应用平滑过渡
    
    Set View Target with Blend
    
    

1.11 摄像机投影效果

摄像机投影效果可以改变摄像机的投影方式,如透视投影或正交投影。不同的投影方式可以产生不同的视觉效果,适用于不同的游戏场景。例如,透视投影适用于大多数3D游戏,而正交投影则常用于2D游戏或特定的3D场景,如建筑内部的俯视图。

实现摄像机投影效果
  1. 创建摄像机组件

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中右键点击,选择Add New -> Actor -> Camera

    • 将摄像机组件添加到所需的Pawn或Actor中。

  2. 设置投影方式

    在代码或蓝图中设置摄像机的投影方式。Unreal Engine支持多种投影模式,包括透视投影和正交投影。

    
    // 设置透视投影
    
    Camera->SetProjectionMode(ECameraProjectionMode::Perspective);
    
    Camera->SetFieldOfView(90.0f); // 设置视野范围
    
    
    
    // 设置正交投影
    
    Camera->SetProjectionMode(ECameraProjectionMode::Orthographic);
    
    Camera->SetOrthoWidth(1000.0f); // 设置正交投影的宽度
    
    
  3. 应用投影效果

    通过代码或蓝图在特定场景中应用摄像机的投影效果。例如,可以在玩家进入某个房间时切换到正交投影,或者在特定的过场动画中使用透视投影。

    
    // 通过代码应用投影效果
    
    void AMyPawn::ApplyPerspectiveProjection()
    
    {
          
          
    
        Camera->SetProjectionMode(ECameraProjectionMode::Perspective);
    
        Camera->SetFieldOfView(90.0f);
    
    }
    
    
    
    void AMyPawn::ApplyOrthographicProjection()
    
    {
          
          
    
        Camera->SetProjectionMode(ECameraProjectionMode::Orthographic);
    
        Camera->SetOrthoWidth(1000.0f);
    
    }
    
    
    
    // 通过蓝图应用投影效果
    
    Set Projection Mode (Perspective or Orthographic)
    
    Set Field of View (for Perspective)
    
    Set Ortho Width (for Orthographic)
    
    

1.12 摄像机镜头模糊

摄像机镜头模糊效果可以模拟真实世界的镜头模糊,通常用于突出重点或创造特定的视觉氛围。这种效果在过场动画或特定的游戏场景中非常有用,如角色对焦、背景虚化等。

实现摄像机镜头模糊
  1. 创建镜头模糊效果

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的Post Process Volume

    • 将Post Process Volume放置在关卡中所需的位置。

  2. 设置镜头模糊参数

    在Post Process Volume中设置镜头模糊的参数,如模糊强度、焦点距离和背景模糊范围。

    
    // 设置镜头模糊参数
    
    UPostProcessComponent* PostProcessComponent = NewObject<UPostProcessComponent>(this);
    
    PostProcessComponent->SetupAttachment(RootComponent);
    
    
    
    FPostProcessSettings Settings;
    
    Settings.bOverride_DepthOfFieldFstop = true;
    
    Settings.DepthOfFieldFstop = 1.0f; // 模糊强度
    
    Settings.bOverride_DepthOfFieldFocalDistance = true;
    
    Settings.DepthOfFieldFocalDistance = 1000.0f; // 焦点距离
    
    Settings.bOverride_DepthOfFieldBlurRadius = true;
    
    Settings.DepthOfFieldBlurRadius = 10.0f; // 背景模糊范围
    
    
    
    PostProcessComponent->Settings = Settings;
    
    
  3. 应用镜头模糊效果

    通过代码或蓝图在特定事件中应用镜头模糊效果。例如,当玩家进入一个特定区域时,可以启用镜头模糊效果。

    
    // 通过代码应用镜头模糊效果
    
    void AMyPawn::ApplyLensBlur()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFstop = true;
    
            PostProcessComponent->Settings.DepthOfFieldFstop = 1.0f;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFocalDistance = true;
    
            PostProcessComponent->Settings.DepthOfFieldFocalDistance = 1000.0f;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldBlurRadius = true;
    
            PostProcessComponent->Settings.DepthOfFieldBlurRadius = 10.0f;
    
        }
    
    }
    
    
    
    void AMyPawn::RemoveLensBlur()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFstop = false;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFocalDistance = false;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldBlurRadius = false;
    
        }
    
    }
    
    
    
    // 通过蓝图应用镜头模糊效果
    
    Set Post Process Volume Settings
    
    

1.13 摄像机运动模糊

摄像机运动模糊效果可以模拟快速移动时的模糊效果,增加游戏的真实感和动感。这种效果在高速动作场景或车辆驾驶中非常有用。

实现摄像机运动模糊
  1. 创建运动模糊效果

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的Post Process Volume

    • 将Post Process Volume放置在关卡中所需的位置。

  2. 设置运动模糊参数

    在Post Process Volume中设置运动模糊的参数,如模糊强度和模糊类型。

    
    // 设置运动模糊参数
    
    UPostProcessComponent* PostProcessComponent = NewObject<UPostProcessComponent>(this);
    
    PostProcessComponent->SetupAttachment(RootComponent);
    
    
    
    FPostProcessSettings Settings;
    
    Settings.bOverride_MotionBlurAmount = true;
    
    Settings.MotionBlurAmount = 0.5f; // 模糊强度
    
    Settings.bOverride_MotionBlurMax = true;
    
    Settings.MotionBlurMax = 1.0f; // 最大模糊强度
    
    
    
    PostProcessComponent->Settings = Settings;
    
    
  3. 应用运动模糊效果

    通过代码或蓝图在特定事件中应用运动模糊效果。例如,当角色奔跑或车辆高速行驶时,可以启用运动模糊效果。

    
    // 通过代码应用运动模糊效果
    
    void AMyPawn::ApplyMotionBlur()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_MotionBlurAmount = true;
    
            PostProcessComponent->Settings.MotionBlurAmount = 0.5f;
    
            PostProcessComponent->Settings.bOverride_MotionBlurMax = true;
    
            PostProcessComponent->Settings.MotionBlurMax = 1.0f;
    
        }
    
    }
    
    
    
    void AMyPawn::RemoveMotionBlur()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_MotionBlurAmount = false;
    
            PostProcessComponent->Settings.bOverride_MotionBlurMax = false;
    
        }
    
    }
    
    
    
    // 通过蓝图应用运动模糊效果
    
    Set Post Process Volume Settings
    
    

1.14 摄像机遮挡检测

摄像机遮挡检测可以确保摄像机在移动时不会被场景中的物体遮挡,从而提高玩家的可视性和游戏体验。这种检测通常用于第三人称视角或自由摄像机。

实现摄像机遮挡检测
  1. 创建摄像机遮挡检测

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的Line TraceSphere Trace

  2. 设置遮挡检测参数

    在代码或蓝图中设置遮挡检测的参数,如检测范围和检测频率。

    
    // 设置遮挡检测参数
    
    void AThirdPersonCamera::SetupCameraObstructionDetection()
    
    {
          
          
    
        LineTraceParams.bTraceComplex = true;
    
        LineTraceParams.AddIgnoredActor(GetOwner());
    
    }
    
    
  3. 应用遮挡检测

    通过代码或蓝图在摄像机移动时进行遮挡检测,并根据检测结果调整摄像机的位置或角度。

    
    // 通过代码应用遮挡检测
    
    void AThirdPersonCamera::UpdateCameraPosition()
    
    {
          
          
    
        FVector CameraLocation = SpringArm->GetComponentLocation();
    
        FVector TargetLocation = Character->GetActorLocation() + Character->GetActorForwardVector() * 100.0f + FVector(0.0f, 0.0f, 64.0f);
    
    
    
        FHitResult HitResult;
    
        bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, CameraLocation, TargetLocation, ECC_Visibility, LineTraceParams);
    
    
    
        if (bHit)
    
        {
          
          
    
            // 调整摄像机位置或角度
    
            SpringArm->TargetArmLength = 150.0f; // 减小跟随距离
    
            SpringArm->SetRelativeRotation(FRotator(-30.0f, 0.0f, 0.0f)); // 调整初始旋转
    
        }
    
        else
    
        {
          
          
    
            SpringArm->TargetArmLength = 300.0f; // 恢复正常跟随距离
    
            SpringArm->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f)); // 恢复正常初始旋转
    
        }
    
    }
    
    
    
    // 通过蓝图应用遮挡检测
    
    Line Trace By Channel
    
    If Hit, Adjust Camera Position or Rotation
    
    

1.15 摄像机后处理效果

摄像机后处理效果可以对摄像机捕捉到的画面进行额外的处理,如颜色校正、景深、镜头光晕等。这些效果可以增强游戏的视觉体验,营造特定的氛围。

实现摄像机后处理效果
  1. 创建后处理体积

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的Post Process Volume

    • 将Post Process Volume放置在关卡中所需的位置。

  2. 设置后处理参数

    在Post Process Volume中设置各种后处理效果的参数,如颜色校正、景深、镜头光晕等。

    
    // 设置后处理参数
    
    UPostProcessComponent* PostProcessComponent = NewObject<UPostProcessComponent>(this);
    
    PostProcessComponent->SetupAttachment(RootComponent);
    
    
    
    FPostProcessSettings Settings;
    
    Settings.bOverride_ColorGradingIntensity = true;
    
    Settings.ColorGradingIntensity = 0.8f; // 颜色校正强度
    
    Settings.bOverride_DepthOfFieldFstop = true;
    
    Settings.DepthOfFieldFstop = 1.0f; // 景深强度
    
    Settings.bOverride_LensFlareIntensity = true;
    
    Settings.LensFlareIntensity = 0.5f; // 镜头光晕强度
    
    
    
    PostProcessComponent->Settings = Settings;
    
    
  3. 应用后处理效果

    通过代码或蓝图在特定场景中应用后处理效果。例如,当玩家进入一个特定区域时,可以启用颜色校正效果。

    
    // 通过代码应用后处理效果
    
    void AMyPawn::ApplyPostProcessEffects()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_ColorGradingIntensity = true;
    
            PostProcessComponent->Settings.ColorGradingIntensity = 0.8f;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFstop = true;
    
            PostProcessComponent->Settings.DepthOfFieldFstop = 1.0f;
    
            PostProcessComponent->Settings.bOverride_LensFlareIntensity = true;
    
            PostProcessComponent->Settings.LensFlareIntensity = 0.5f;
    
        }
    
    }
    
    
    
    void AMyPawn::RemovePostProcessEffects()
    
    {
          
          
    
        if (PostProcessComponent)
    
        {
          
          
    
            PostProcessComponent->Settings.bOverride_ColorGradingIntensity = false;
    
            PostProcessComponent->Settings.bOverride_DepthOfFieldFstop = false;
    
            PostProcessComponent->Settings.bOverride_LensFlareIntensity = false;
    
        }
    
    }
    
    
    
    // 通过蓝图应用后处理效果
    
    Set Post Process Volume Settings
    
    

1.16 摄像机碰撞检测

摄像机碰撞检测可以确保摄像机在移动时不会穿透场景中的物体,从而提高玩家的体验。这种检测通常用于跟踪摄像机或自由摄像机。

实现摄像机碰撞检测
  1. 创建摄像机碰撞检测

    • 打开Unreal Engine编辑器。

    • 在内容浏览器中创建一个新的Collision组件,并将其附加到摄像机组件上。

  2. 设置碰撞检测参数

    在代码或蓝图中设置碰撞检测的参数,如碰撞类型和响应方式。

    
    // 设置碰撞检测参数
    
    void AThirdPersonCamera::SetupCameraCollisionDetection()
    
    {
          
          
    
        CameraCollision->SetCollisionProfileName("Camera");
    
        CameraCollision->OnComponentBeginOverlap.AddDynamic(this, &AThirdPersonCamera::OnCameraCollision);
    
    }
    
    
  3. 应用碰撞检测

    通过代码或蓝图在摄像机移动时进行碰撞检测,并根据检测结果调整摄像机的位置或角度。

    
    // 通过代码应用碰撞检测
    
    void AThirdPersonCamera::OnCameraCollision(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
    
    {
          
          
    
        if (OtherActor != GetOwner())
    
        {
          
          
    
            // 调整摄像机位置或角度
    
            SpringArm->TargetArmLength = 150.0f; // 减小跟随距离
    
            SpringArm->SetRelativeRotation(FRotator(-30.0f, 0.0f, 0.0f)); // 调整初始旋转
    
        }
    
    }
    
    
    
    // 通过蓝图应用碰撞检测
    
    On Component Begin Overlap
    
    If Collision, Adjust Camera Position or Rotation
    
    

总结

通过上述详细的介绍,我们可以看到Unreal Engine提供了多种虚拟摄像机类型和功能,以满足不同游戏类型和场景的需求。无论是固定摄像机、跟踪摄像机、第一人称摄像机、第三人称摄像机,还是自由摄像机、多摄像机系统,每种摄像机都有其独特的应用场景和实现方法。此外,摄像机的抖动效果、FOV效果、跟随路径、平滑过渡、遮挡检测、后处理效果和碰撞检测等高级功能,可以进一步增强游戏的视觉效果和玩家体验。在实际开发中,根据游戏的具体需求选择合适的摄像机类型和功能,将有助于创建更加丰富和引人入胜的游戏世界。
在这里插入图片描述