Unreal Engine开发:虚拟摄像机开发_虚拟摄像机的编辑器工具与插件

虚拟摄像机的编辑器工具与插件

在Unreal Engine中,虚拟摄像机的开发和管理可以通过多种编辑器工具和插件来实现。这些工具和插件不仅提供了直观的用户界面,还允许开发者通过脚本和代码进行更高级的自定义。本节将详细介绍这些编辑器工具和插件,包括它们的功能、使用方法以及如何通过代码进行扩展和自定义。

1. 虚拟摄像机编辑器工具

Unreal Engine内置了强大的虚拟摄像机编辑器工具,这些工具可以帮助开发者快速创建和调试摄像机效果。以下是一些常用的虚拟摄像机编辑器工具:

1.1 摄像机绑定

摄像机绑定是将摄像机与游戏中的角色或其他对象进行绑定的过程,这样摄像机就可以随着绑定对象的移动而移动。Unreal Engine提供了多种方式来实现摄像机绑定,包括使用蓝图和C++代码。

1.1.1 使用蓝图进行摄像机绑定

在Unreal Engine中,你可以使用蓝图来快速实现摄像机绑定。以下是一个简单的例子,展示如何将摄像机绑定到角色上:

  1. 创建角色蓝图

    • 打开Unreal Engine,创建一个新的角色蓝图。

    • 在角色蓝图中,添加一个摄像机组件(Camera Component)。

  2. 绑定摄像机组件

    • 在角色蓝图的事件图表中,使用Set Actor Location节点将摄像机的位置设置为角色的位置。

    • 使用Add Actor Local Offset节点将摄像机的相对位置设置为角色上方一定距离。


// 事件图表中的蓝图代码

EventBeginPlay

{

    // 获取摄像机组件

    CameraComponent = Get Camera Component;



    // 设置摄像机的位置为角色位置

    CameraComponent->SetActorLocation(GetActorLocation());



    // 设置摄像机的相对位置

    FVector Offset = FVector(0, 0, 200);

    CameraComponent->AddActorLocalOffset(Offset);

}

1.1.2 使用C++进行摄像机绑定

如果你更喜欢使用C++进行开发,可以通过编写代码来实现摄像机绑定。以下是一个简单的C++示例,展示如何将摄像机绑定到角色上:

  1. 创建角色类

    • 在你的项目中创建一个新的C++类,继承自APawn
  2. 添加摄像机组件

    • 在角色类的头文件中添加一个摄像机组件。
  3. 在构造函数中初始化摄像机

    • 在角色类的构造函数中初始化摄像机组件,并设置其相对位置。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UCameraComponent* CameraComponent;

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "Camera/CameraComponent.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建摄像机组件

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));



    // 设置摄像机的相对位置

    CameraComponent->SetupAttachment(RootComponent);

    CameraComponent->SetRelativeLocation(FVector(0, 0, 200));

}

1.2 摄像机动画

Unreal Engine提供了丰富的摄像机动画工具,可以创建复杂的摄像机动画效果。这些工具包括摄像机动画序列(Camera Animation Sequence)和摄像机动画蓝图(Camera Animation Blueprint)。

1.2.1 摄像机动画序列

摄像机动画序列允许你创建和编辑摄像机的动画轨迹。以下是一个简单的例子,展示如何创建和使用摄像机动画序列:

  1. 创建摄像机动画序列

    • 在内容浏览器中,右键点击并选择Create Basic Asset -> Camera Animation Sequence

    • 选择一个摄像机组件,并将其绑定到动画序列中。

  2. 编辑摄像机动画序列

    • 双击打开摄像机动画序列,进入动画编辑器。

    • 在动画编辑器中,使用轨迹编辑器创建摄像机的移动路径和旋转路径。

  3. 在蓝图中播放摄像机动画序列

    • 在角色蓝图的事件图表中,使用Play Camera Animation节点播放摄像机动画序列。

// 事件图表中的蓝图代码

EventBeginPlay

{

    // 获取摄像机动画序列

    CameraAnimationSequence = Load Camera Animation Sequence;



    // 播放摄像机动画序列

    Play Camera Animation(CameraComponent, CameraAnimationSequence, 1.0, 1.0, false);

}

1.2.2 摄像机动画蓝图

摄像机动画蓝图允许你通过蓝图脚本创建自定义的摄像机动画效果。以下是一个简单的例子,展示如何创建一个摄像机动画蓝图并使用它:

  1. 创建摄像机动画蓝图

    • 在内容浏览器中,右键点击并选择Blueprint Class -> Camera Animation

    • 打开摄像机动画蓝图,进入蓝图编辑器。

  2. 编写摄像机动画逻辑

    • 在摄像机动画蓝图的事件图表中,编写摄像机的动画逻辑。

// 摄像机动画蓝图中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算摄像机的新位置

    FVector NewLocation = FVector(0, 0, 1000 * FMath::Sin(CurrentTime * 2 * PI));



    // 设置摄像机的新位置

    CameraComponent->SetRelativeLocation(NewLocation);

}

  1. 在角色蓝图中播放摄像机动画蓝图

    • 在角色蓝图的事件图表中,使用Play Camera Animation节点播放摄像机动画蓝图。

// 事件图表中的蓝图代码

EventBeginPlay

{

    // 获取摄像机动画蓝图

    CameraAnimationBlueprint = Load Camera Animation Blueprint;



    // 播放摄像机动画蓝图

    Play Camera Animation(CameraComponent, CameraAnimationBlueprint, 1.0, 1.0, false);

}

1.3 摄像机蓝图类

Unreal Engine允许开发者创建自定义的摄像机蓝图类,以实现更复杂的摄像机效果。这些蓝图类可以继承自ACameraActorACameraPawn,并添加自定义的逻辑和组件。

1.3.1 创建自定义摄像机蓝图类
  1. 创建摄像机蓝图类

    • 在内容浏览器中,右键点击并选择Blueprint Class -> Camera Actor

    • 打开摄像机蓝图类,进入蓝图编辑器。

  2. 添加自定义组件

    • 在摄像机蓝图类中,添加你需要的组件,例如Spring Arm ComponentPost Process Volume等。
  3. 编写自定义逻辑

    • 在事件图表中,编写摄像机的自定义逻辑。

// 摄像机蓝图类中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算摄像机的新位置

    FVector NewLocation = FVector(0, 0, 1000 * FMath::Sin(CurrentTime * 2 * PI));



    // 设置摄像机的新位置

    CameraComponent->SetRelativeLocation(NewLocation);

}

1.4 摄像机插件

Unreal Engine还提供了一些第三方插件,这些插件可以扩展虚拟摄像机的功能,例如实现高级的摄像机跟随效果、摄像机抖动效果等。以下是一些常用的摄像机插件及其使用方法:

1.4.1 Cinematics Camera插件

Cinematics Camera插件提供了一套强大的摄像机动画和编辑工具,适合制作电影级的摄像机效果。

  1. 安装插件

    • 打开Unreal Engine的插件管理器,搜索并安装Cinematics Camera插件。
  2. 创建Cinematics Camera

    • 在内容浏览器中,右键点击并选择Create Basic Asset -> Cinematics Camera

    • 打开Cinematics Camera,进入编辑器。

  3. 编辑Cinematics Camera

    • 在Cinematics Camera编辑器中,使用轨迹编辑器创建摄像机的移动和旋转路径。
  4. 在蓝图中使用Cinematics Camera

    • 在角色蓝图的事件图表中,使用Play Cinematics Camera节点播放Cinematics Camera。

// 事件图表中的蓝图代码

EventBeginPlay

{

    // 获取Cinematics Camera

    CinematicsCamera = Load Cinematics Camera;



    // 播放Cinematics Camera

    Play Cinematics Camera(CinematicsCamera, 1.0, 1.0, false);

}

1.4.2 Cinematic Camera插件

Cinematic Camera插件提供了一套专业的摄像机控制工具,包括摄像机跟随、摄像机抖动、摄像机模糊等效果。

  1. 安装插件

    • 打开Unreal Engine的插件管理器,搜索并安装Cinematic Camera插件。
  2. 创建Cinematic Camera

    • 在内容浏览器中,右键点击并选择Blueprint Class -> Cinematic Camera

    • 打开Cinematic Camera蓝图,进入编辑器。

  3. 添加自定义效果

    • 在Cinematic Camera蓝图中,添加你需要的效果组件,例如Camera ShakeDepth of Field等。
  4. 编写自定义逻辑

    • 在事件图表中,编写摄像机的自定义逻辑。

// Cinematic Camera蓝图中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算摄像机的新位置

    FVector NewLocation = FVector(0, 0, 1000 * FMath::Sin(CurrentTime * 2 * PI));



    // 设置摄像机的新位置

    CameraComponent->SetRelativeLocation(NewLocation);

}

1.5 摄像机跟随

在动作游戏中,摄像机跟随是常见的需求。Unreal Engine提供了多种方式来实现摄像机跟随,包括使用蓝图和C++代码。

1.5.1 使用蓝图实现摄像机跟随

以下是一个简单的例子,展示如何使用蓝图实现摄像机跟随:

  1. 创建角色蓝图

    • 打开Unreal Engine,创建一个新的角色蓝图。

    • 在角色蓝图中,添加一个摄像机组件(Camera Component)和一个弹簧臂组件(Spring Arm Component)。

  2. 设置弹簧臂组件

    • 在弹簧臂组件的属性中,设置其目标臂长度(Target Arm Length)和目标偏移(Target Offset)。
  3. 编写摄像机跟随逻辑

    • 在角色蓝图的事件图表中,编写摄像机的跟随逻辑。

// 事件图表中的蓝图代码

EventTick

{

    // 获取角色的位置

    FVector CharacterLocation = GetActorLocation();



    // 设置弹簧臂组件的目标位置

    SpringArmComponent->SetWorldLocation(CharacterLocation);

}

1.5.2 使用C++实现摄像机跟随

以下是一个简单的C++示例,展示如何实现摄像机跟随:

  1. 创建角色类

    • 在你的项目中创建一个新的C++类,继承自APawn
  2. 添加摄像机组件和弹簧臂组件

    • 在角色类的头文件中添加摄像机组件和弹簧臂组件。
  3. 在构造函数中初始化组件

    • 在角色类的构造函数中初始化摄像机组件和弹簧臂组件,并设置其属性。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UCameraComponent* CameraComponent;



    // 弹簧臂组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    USpringArmComponent* SpringArmComponent;

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "Camera/CameraComponent.h"

#include "Camera/SpringArmComponent.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建弹簧臂组件

    SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComponent"));



    // 设置弹簧臂组件的属性

    SpringArmComponent->SetupAttachment(RootComponent);

    SpringArmComponent->TargetArmLength = 400.0f;

    SpringArmComponent->SocketOffset = FVector(0, 0, 200);



    // 创建摄像机组件

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));



    // 将摄像机组件绑定到弹簧臂组件

    CameraComponent->SetupAttachment(SpringArmComponent);

}

1.6 摄像机抖动

摄像机抖动可以增加游戏的真实感和紧张感。Unreal Engine提供了Camera Shake类来实现摄像机抖动效果。

1.6.1 使用蓝图实现摄像机抖动

以下是一个简单的例子,展示如何使用蓝图实现摄像机抖动:

  1. 创建摄像机抖动蓝图

    • 在内容浏览器中,右键点击并选择Blueprint Class -> Camera Shake

    • 打开摄像机抖动蓝图,进入编辑器。

  2. 编写摄像机抖动逻辑

    • 在摄像机抖动蓝图的事件图表中,编写抖动逻辑。

// 摄像机抖动蓝图中的蓝图代码

EventStartShake

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算抖动的偏移

    FVector ShakeOffset = FVector(FMath::FRandRange(-10, 10), FMath::FRandRange(-10, 10), FMath::FRandRange(-10, 10));



    // 设置摄像机的抖动偏移

    CameraComponent->AddCameraWorldOffset(ShakeOffset);

}

  1. 在角色蓝图中播放摄像机抖动

    • 在角色蓝图的事件图表中,使用Play Camera Shake节点播放摄像机抖动。

// 事件图表中的蓝图代码

EventBeginPlay

{

    // 获取摄像机抖动蓝图

    CameraShakeBlueprint = Load Camera Shake Blueprint;



    // 播放摄像机抖动

    Play Camera Shake(CameraShakeBlueprint, 1.0, 1.0, false);

}

1.6.2 使用C++实现摄像机抖动

以下是一个简单的C++示例,展示如何实现摄像机抖动:

  1. 创建摄像机抖动类

    • 在你的项目中创建一个新的C++类,继承自UCameraShakeBase
  2. 编写抖动逻辑

    • 在摄像机抖动类的源文件中,编写抖动逻辑。

// MyCameraShake.h

#pragma once



#include "CoreMinimal.h"

#include "Camera/CameraShakeBase.h"

#include "MyCameraShake.generated.h"



UCLASS()

class MYGAME_API UMyCameraShake : public UCameraShakeBase

{
    
    

    GENERATED_BODY()



public:

    // 摄像机抖动类的构造函数

    UMyCameraShake();



    // 摄像机抖动的更新逻辑

    virtual void ReceivePlayShake(float Scale) override;

};



// MyCameraShake.cpp

#include "MyCameraShake.h"

#include "Camera/CameraComponent.h"



UMyCameraShake::UMyCameraShake()

{
    
    

    // 设置抖动的频率和幅度

    ShakeFracture = 0.5f;

    ShakeAmplitude = 10.0f;

}



void UMyCameraShake::ReceivePlayShake(float Scale)

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetDeltaSeconds();



    // 计算抖动的偏移

    FVector ShakeOffset = FVector(FMath::FRandRange(-ShakeAmplitude, ShakeAmplitude) * Scale,

                                  FMath::FRandRange(-ShakeAmplitude, ShakeAmplitude) * Scale,

                                  FMath::FRandRange(-ShakeAmplitude, ShakeAmplitude) * Scale);



    // 应用抖动偏移

    AddCameraOffset(ShakeOffset);

}

  1. 在角色类中播放摄像机抖动

    • 在角色类的事件图表中,使用Play Camera Shake节点播放自定义的摄像机抖动。

// MyCharacter.cpp

#include "MyCharacter.h"

#include "MyCameraShake.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建自定义的摄像机抖动

    MyCameraShake = CreateDefaultSubobject<UMyCameraShake>(TEXT("MyCameraShake"));

}



void AMyCharacter::BeginPlay()

{
    
    

    Super::BeginPlay();



    // 播放摄像机抖动

    GetWorld()->GetFirstPlayerController()->PlayerCameraManager->StartCameraShake(MyCameraShake, 1.0f);

}

1.7 摄像机模糊

摄像机模糊可以模拟相机的景深效果,增加游戏的视觉效果。Unreal Engine提供了多种方式来实现摄像机模糊,包括使用蓝图和C++代码。以下我们将详细探讨如何使用这两种方法实现摄像机模糊效果。

1.7.1 使用蓝图实现摄像机模糊
  1. 创建摄像机模糊蓝图

    • 在内容浏览器中,右键点击并选择Blueprint Class -> Post Process Volume

    • 打开摄像机模糊蓝图,进入编辑器。

  2. 设置景深效果

    • 在摄像机模糊蓝图的属性中,设置景深效果的参数,例如Depth of Field

    • Post Process VolumeDetails面板中,找到Settings部分,点击Add Post Processing Blendable,选择New Post Process Blendable

    • 选择Depth of Field,设置其参数,例如Focus DistanceFocal RegionNear Blur SizeFar Blur Size等。

  3. 将摄像机模糊应用到场景中

    • 在场景中放置一个Post Process Volume,并将其设置为Unbounded,这样它可以影响整个场景。

    • Post Process VolumeDetails面板中,选择你刚刚创建的摄像机模糊蓝图。

  4. 在角色蓝图中控制摄像机模糊

    • 在角色蓝图的事件图表中,使用Set Post Process Parameter节点动态控制景深效果。

// 事件图表中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算新的焦点距离

    float NewFocusDistance = 1000 * FMath::Sin(CurrentTime * 2 * PI);



    // 设置景深效果的焦点距离

    PostProcessVolume->SetParameter('DepthOfFieldFocusDistance', NewFocusDistance);

}

1.7.2 使用C++实现摄像机模糊

如果你更喜欢使用C++进行开发,可以通过编写代码来实现摄像机模糊效果。以下是一个简单的C++示例,展示如何将景深效果应用到摄像机上:

  1. 创建角色类

    • 在你的项目中创建一个新的C++类,继承自APawn
  2. 添加后处理体积组件

    • 在角色类的头文件中添加一个后处理体积组件。
  3. 在构造函数中初始化组件

    • 在角色类的构造函数中初始化后处理体积组件,并设置其景深效果参数。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UCameraComponent* CameraComponent;



    // 后处理体积组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UPostProcessComponent* PostProcessComponent;



    // 摄像机模糊的更新逻辑

    void UpdateCameraBlur();

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "Camera/CameraComponent.h"

#include "Components/PostProcessComponent.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建后处理体积组件

    PostProcessComponent = CreateDefaultSubobject<UPostProcessComponent>(TEXT("PostProcessComponent"));



    // 创建摄像机组件

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));



    // 将后处理体积组件绑定到摄像机组件

    PostProcessComponent->SetupAttachment(CameraComponent);



    // 设置后处理体积组件的景深效果

    PostProcessSettings DepthOfFieldSettings;

    DepthOfFieldSettings.bOverride_DepthOfFieldFocalDistance = true;

    DepthOfFieldSettings.DepthOfFieldFocalDistance = 1000.0f;

    PostProcessComponent->Settings = DepthOfFieldSettings;

}



void AMyCharacter::UpdateCameraBlur()

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetTimeSeconds();



    // 计算新的焦点距离

    float NewFocusDistance = 1000 * FMath::Sin(CurrentTime * 2 * PI);



    // 设置景深效果的焦点距离

    PostProcessComponent->Settings.bOverride_DepthOfFieldFocalDistance = true;

    PostProcessComponent->Settings.DepthOfFieldFocalDistance = NewFocusDistance;

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新摄像机模糊

    UpdateCameraBlur();

}

1.8 摄像机切换

在多人游戏中,摄像机切换是一个常见的需求,例如从第一人称切换到第三人称,或者在多个摄像机之间切换。Unreal Engine提供了多种方式来实现摄像机切换,包括使用蓝图和C++代码。

1.8.1 使用蓝图实现摄像机切换
  1. 创建多个摄像机组件

    • 在角色蓝图中,添加多个摄像机组件,例如FirstPersonCameraThirdPersonCamera
  2. 编写摄像机切换逻辑

    • 在角色蓝图的事件图表中,使用Set Active节点来切换不同的摄像机组件。

// 事件图表中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 检查是否需要切换摄像机

    if (CurrentTime > 5.0)

    {

        // 切换到第一人称摄像机

        FirstPersonCamera->SetActive(true);

        ThirdPersonCamera->SetActive(false);

    }

    else

    {

        // 切换到第三人称摄像机

        FirstPersonCamera->SetActive(false);

        ThirdPersonCamera->SetActive(true);

    }

}

  1. 在角色蓝图中初始化摄像机

    • 在角色蓝图的构造事件中,初始化多个摄像机组件,并设置默认激活的摄像机。

// 构造事件中的蓝图代码

EventConstruction

{

    // 创建第一人称摄像机

    FirstPersonCamera = New Camera Component;

    FirstPersonCamera->SetupAttachment(RootComponent);

    FirstPersonCamera->SetRelativeLocation(FVector(0, 0, 64));



    // 创建第三人称摄像机

    ThirdPersonCamera = New Camera Component;

    ThirdPersonCamera->SetupAttachment(RootComponent);

    ThirdPersonCamera->SetRelativeLocation(FVector(0, -300, 120));



    // 设置默认激活的摄像机

    FirstPersonCamera->SetActive(true);

    ThirdPersonCamera->SetActive(false);

}

1.8.2 使用C++实现摄像机切换
  1. 创建角色类

    • 在你的项目中创建一个新的C++类,继承自APawn
  2. 添加多个摄像机组件

    • 在角色类的头文件中添加多个摄像机组件。
  3. 在构造函数中初始化组件

    • 在角色类的构造函数中初始化多个摄像机组件,并设置默认激活的摄像机。
  4. 编写摄像机切换逻辑

    • 在角色类的源文件中,编写切换摄像机的逻辑。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 第一人称摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UCameraComponent* FirstPersonCamera;



    // 第三人称摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UCameraComponent* ThirdPersonCamera;



    // 摄像机切换的更新逻辑

    void UpdateCameraSwitch(float DeltaTime);



    // 当前激活的摄像机

    UCameraComponent* ActiveCamera;

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "Camera/CameraComponent.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建第一人称摄像机

    FirstPersonCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));

    FirstPersonCamera->SetupAttachment(RootComponent);

    FirstPersonCamera->SetRelativeLocation(FVector(0, 0, 64));



    // 创建第三人称摄像机

    ThirdPersonCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("ThirdPersonCamera"));

    ThirdPersonCamera->SetupAttachment(RootComponent);

    ThirdPersonCamera->SetRelativeLocation(FVector(0, -300, 120));



    // 设置默认激活的摄像机

    ActiveCamera = FirstPersonCamera;

    FirstPersonCamera->Activate();

    ThirdPersonCamera->Deactivate();

}



void AMyCharacter::UpdateCameraSwitch(float DeltaTime)

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetTimeSeconds();



    // 检查是否需要切换摄像机

    if (CurrentTime > 5.0 && ActiveCamera == FirstPersonCamera)

    {
    
    

        // 切换到第三人称摄像机

        FirstPersonCamera->Deactivate();

        ThirdPersonCamera->Activate();

        ActiveCamera = ThirdPersonCamera;

    }

    else if (CurrentTime < 5.0 && ActiveCamera == ThirdPersonCamera)

    {
    
    

        // 切换回第一人称摄像机

        ThirdPersonCamera->Deactivate();

        FirstPersonCamera->Activate();

        ActiveCamera = FirstPersonCamera;

    }

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新摄像机切换

    UpdateCameraSwitch(DeltaTime);

}

1.9 摄像机自定义扩展

通过代码,你可以对虚拟摄像机进行更高级的自定义和扩展。以下是一些常见的自定义扩展示例,包括自定义摄像机控制、摄像机遮挡检测和摄像机平滑过渡。

1.9.1 自定义摄像机控制
  1. 创建自定义摄像机控制类

    • 在你的项目中创建一个新的C++类,继承自UCameraComponent
  2. 编写自定义控制逻辑

    • 在自定义摄像机控制类的源文件中,编写控制逻辑。

// MyCustomCamera.h

#pragma once



#include "CoreMinimal.h"

#include "Camera/CameraComponent.h"

#include "MyCustomCamera.generated.h"



UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

class MYGAME_API UMyCustomCamera : public UCameraComponent

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    UMyCustomCamera();



    // 自定义摄像机控制逻辑

    void CustomControl(float DeltaTime);



    // 摄像机的焦点距离

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")

    float FocusDistance;



    // 摄像机的平滑过渡时间

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")

    float SmoothTransitionTime;

};



// MyCustomCamera.cpp

#include "MyCustomCamera.h"



UMyCustomCamera::UMyCustomCamera()

{
    
    

    // 默认设置

    FocusDistance = 1000.0f;

    SmoothTransitionTime = 0.25f;

}



void UMyCustomCamera::CustomControl(float DeltaTime)

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetTimeSeconds();



    // 计算新的焦点距离

    float NewFocusDistance = 1000 * FMath::Sin(CurrentTime * 2 * PI);



    // 平滑过渡到新的焦点距离

    FocusDistance = FMath::FInterpTo(FocusDistance, NewFocusDistance, DeltaTime, 1.0 / SmoothTransitionTime);



    // 设置景深效果的焦点距离

    PostProcessSettings.bOverride_DepthOfFieldFocalDistance = true;

    PostProcessSettings.DepthOfFieldFocalDistance = FocusDistance;

    SetPostProcessSettings(PostProcessSettings);

}

  1. 在角色类中使用自定义摄像机控制

    • 在角色类中,使用自定义的摄像机控制类。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCustomCamera.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 自定义摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UMyCustomCamera* CustomCameraComponent;

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "MyCustomCamera.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建自定义摄像机组件

    CustomCameraComponent = CreateDefaultSubobject<UMyCustomCamera>(TEXT("CustomCameraComponent"));



    // 将自定义摄像机组件绑定到根组件

    CustomCameraComponent->SetupAttachment(RootComponent);

    CustomCameraComponent->SetRelativeLocation(FVector(0, 0, 200));

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新自定义摄像机控制

    CustomCameraComponent->CustomControl(DeltaTime);

}

1.9.2 摄像机遮挡检测
  1. 创建自定义摄像机控制类

    • 在你的项目中创建一个新的C++类,继承自UCameraComponent
  2. 编写遮挡检测逻辑

    • 在自定义摄像机控制类的源文件中,编写遮挡检测逻辑。

// MyCustomCamera.h

#pragma once



#include "CoreMinimal.h"

#include "Camera/CameraComponent.h"

#include "MyCustomCamera.generated.h"



UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

class MYGAME_API UMyCustomCamera : public UCameraComponent

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    UMyCustomCamera();



    // 遮挡检测逻辑

    void OcclusionCheck(float DeltaTime);



    // 摄像机的遮挡检测距离

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")

    float OcclusionCheckDistance;

};



// MyCustomCamera.cpp

#include "MyCustomCamera.h"

#include "GameFramework/Actor.h"

#include "DrawDebugHelpers.h"



UMyCustomCamera::UMyCustomCamera()

{
    
    

    // 默认设置

    OcclusionCheckDistance = 500.0f;

}



void UMyCustomCamera::OcclusionCheck(float DeltaTime)

{
    
    

    // 获取摄像机和角色的位置

    FVector CameraLocation = GetComponentLocation();

    FVector CharacterLocation = GetOwner()->GetActorLocation();



    // 计算摄像机和角色之间的方向

    FVector Direction = CharacterLocation - CameraLocation;

    Direction.Normalize();



    // 进行射线检测

    FHitResult HitResult;

    bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, CameraLocation, CharacterLocation, ECC_Visibility);



    // 绘制调试线

    DrawDebugLine(GetWorld(), CameraLocation, CharacterLocation, bHit ? FColor::Red : FColor::Green, false, -1, 0, 2.0f);



    // 如果检测到遮挡,调整摄像机的位置

    if (bHit)

    {
    
    

        FVector NewCameraLocation = CameraLocation + Direction * OcclusionCheckDistance;

        SetWorldLocation(NewCameraLocation);

    }

}

  1. 在角色类中使用自定义摄像机控制

    • 在角色类中,使用自定义的摄像机控制类。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCustomCamera.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 自定义摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UMyCustomCamera* CustomCameraComponent;

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "MyCustomCamera.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建自定义摄像机组件

    CustomCameraComponent = CreateDefaultSubobject<UMyCustomCamera>(TEXT("CustomCameraComponent"));



    // 将自定义摄像机组件绑定到根组件

    CustomCameraComponent->SetupAttachment(RootComponent);

    CustomCameraComponent->SetRelativeLocation(FVector(0, 0, 200));

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新自定义摄像机控制

    CustomCameraComponent->OcclusionCheck(DeltaTime);

}

1.9.3 摄像机平滑过渡
  1. 创建自定义摄像机控制类

    • 在你的项目中创建一个新的C++类,继承自UCameraComponent
  2. 编写平滑过渡逻辑

    • 在自定义摄像机控制类的源文件中,编写平滑过渡逻辑。

// MyCustomCamera.h

#pragma once



#include "CoreMinimal.h"

#include "Camera/CameraComponent.h"

#include "MyCustomCamera.generated.h"



UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

class MYGAME_API UMyCustomCamera : public UCameraComponent

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    UMyCustomCamera();



    // 摄像机平滑过渡逻辑

    void SmoothTransition(FVector TargetLocation, float DeltaTime);



    // 摄像机的平滑过渡时间

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")

    float SmoothTransitionTime;

};



// MyCustomCamera.cpp

#include "MyCustomCamera.h"

#include "GameFramework/Actor.h"



UMyCustomCamera::UMyCustomCamera()

{
    
    

    // 默认设置

    SmoothTransitionTime = 0.25f;

}



void UMyCustomCamera::SmoothTransition(FVector TargetLocation, float DeltaTime)

{
    
    

   ### 1.9.3 摄像机平滑过渡



在许多游戏中,摄像机的平滑过渡可以提升用户体验,使场景切换更加自然。Unreal Engine 提供了多种方式来实现摄像机平滑过渡,包括使用蓝图和C++代码。以下我们将详细探讨如何使用这两种方法实现摄像机平滑过渡。



#### 1.9.3.1 使用蓝图实现摄像机平滑过渡



1. **创建多个摄像机组件**- 在角色蓝图中,添加多个摄像机组件,例如`FirstPersonCamera`和`ThirdPersonCamera`。



2. **编写平滑过渡逻辑**- 在角色蓝图的事件图表中,使用`Set Active`节点和`Interp To`节点来实现平滑过渡。



```blueprint

// 事件图表中的蓝图代码

EventTick

{
    
    

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 检查是否需要切换摄像机

    if (CurrentTime > 5.0)

    {
    
    

        // 切换到第三人称摄像机

        FirstPersonCamera->SetActive(false);

        ThirdPersonCamera->SetRelativeLocation(InterpTo(ThirdPersonCamera->GetRelativeLocation(), FVector(0, -300, 120), DeltaTime, 2.0));

        ThirdPersonCamera->SetActive(true);

    }

    else if (CurrentTime < 5.0)

    {
    
    

        // 切换回第一人称摄像机

        ThirdPersonCamera->SetActive(false);

        FirstPersonCamera->SetRelativeLocation(InterpTo(FirstPersonCamera->GetRelativeLocation(), FVector(0, 0, 64), DeltaTime, 2.0));

        FirstPersonCamera->SetActive(true);

    }

}

  1. 在角色蓝图中初始化摄像机

    • 在角色蓝图的构造事件中,初始化多个摄像机组件,并设置默认激活的摄像机。

// 构造事件中的蓝图代码

EventConstruction

{

    // 创建第一人称摄像机

    FirstPersonCamera = New Camera Component;

    FirstPersonCamera->SetupAttachment(RootComponent);

    FirstPersonCamera->SetRelativeLocation(FVector(0, 0, 64));



    // 创建第三人称摄像机

    ThirdPersonCamera = New Camera Component;

    ThirdPersonCamera->SetupAttachment(RootComponent);

    ThirdPersonCamera->SetRelativeLocation(FVector(0, -300, 120));



    // 设置默认激活的摄像机

    FirstPersonCamera->SetActive(true);

    ThirdPersonCamera->SetActive(false);

}

1.9.3.2 使用C++实现摄像机平滑过渡
  1. 创建自定义摄像机控制类

    • 在你的项目中创建一个新的C++类,继承自UCameraComponent
  2. 编写平滑过渡逻辑

    • 在自定义摄像机控制类的源文件中,编写平滑过渡逻辑。

// MyCustomCamera.h

#pragma once



#include "CoreMinimal.h"

#include "Camera/CameraComponent.h"

#include "MyCustomCamera.generated.h"



UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

class MYGAME_API UMyCustomCamera : public UCameraComponent

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    UMyCustomCamera();



    // 摄像机平滑过渡逻辑

    void SmoothTransition(FVector TargetLocation, float DeltaTime);



    // 摄像机的平滑过渡时间

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera")

    float SmoothTransitionTime;



    // 摄像机的目标位置

    UPROPERTY(Transient)

    FVector TargetLocation;



    // 摄像机的当前过渡进度

    UPROPERTY(Transient)

    float TransitionProgress;

};



// MyCustomCamera.cpp

#include "MyCustomCamera.h"

#include "GameFramework/Actor.h"



UMyCustomCamera::UMyCustomCamera()

{
    
    

    // 默认设置

    SmoothTransitionTime = 0.25f;

    TransitionProgress = 0.0f;

}



void UMyCustomCamera::SmoothTransition(FVector TargetLocation, float DeltaTime)

{
    
    

    // 更新目标位置

    this->TargetLocation = TargetLocation;



    // 更新过渡进度

    TransitionProgress += DeltaTime / SmoothTransitionTime;

    TransitionProgress = FMath::Clamp(TransitionProgress, 0.0f, 1.0f);



    // 计算新的摄像机位置

    FVector NewLocation = FMath::Lerp(GetRelativeLocation(), TargetLocation, TransitionProgress);



    // 设置新的摄像机位置

    SetRelativeLocation(NewLocation);

}

  1. 在角色类中使用自定义摄像机控制

    • 在角色类中,使用自定义的摄像机控制类,并在需要时调用平滑过渡方法。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCustomCamera.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 自定义摄像机组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UMyCustomCamera* CustomCameraComponent;



    // 第一人称摄像机的位置

    UPROPERTY(Transient)

    FVector FirstPersonCameraLocation;



    // 第三人称摄像机的位置

    UPROPERTY(Transient)

    FVector ThirdPersonCameraLocation;



    // 摄像机平滑过渡的更新逻辑

    void UpdateCameraSwitch(float DeltaTime);

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "MyCustomCamera.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建自定义摄像机组件

    CustomCameraComponent = CreateDefaultSubobject<UMyCustomCamera>(TEXT("CustomCameraComponent"));



    // 将自定义摄像机组件绑定到根组件

    CustomCameraComponent->SetupAttachment(RootComponent);



    // 设置第一人称和第三人称摄像机的位置

    FirstPersonCameraLocation = FVector(0, 0, 64);

    ThirdPersonCameraLocation = FVector(0, -300, 120);



    // 设置默认的摄像机位置

    CustomCameraComponent->SetRelativeLocation(FirstPersonCameraLocation);

}



void AMyCharacter::UpdateCameraSwitch(float DeltaTime)

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetTimeSeconds();



    // 检查是否需要切换摄像机

    if (CurrentTime > 5.0 && CustomCameraComponent->GetRelativeLocation() == FirstPersonCameraLocation)

    {
    
    

        // 切换到第三人称摄像机

        CustomCameraComponent->SmoothTransition(ThirdPersonCameraLocation, DeltaTime);

    }

    else if (CurrentTime < 5.0 && CustomCameraComponent->GetRelativeLocation() == ThirdPersonCameraLocation)

    {
    
    

        // 切换回第一人称摄像机

        CustomCameraComponent->SmoothTransition(FirstPersonCameraLocation, DeltaTime);

    }

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新摄像机切换

    UpdateCameraSwitch(DeltaTime);

}

1.10 摄像机的高级功能

除了上述的基本功能,Unreal Engine 还提供了一些高级功能,帮助开发者实现更复杂和逼真的摄像机效果。以下是一些高级功能的介绍和使用方法:

1.10.1 摄像机的动态模糊

动态模糊可以模拟快速移动时的模糊效果,增加游戏的真实感。Unreal Engine 通过后处理体积(Post Process Volume)和摄像机组件(Camera Component)提供了动态模糊功能。

  1. 创建后处理体积组件

    • 在角色蓝图中,添加一个后处理体积组件(Post Process Volume)。
  2. 设置动态模糊参数

    • 在后处理体积组件的属性中,设置动态模糊的参数,例如Motion Blur

    • Post Process VolumeDetails面板中,找到Settings部分,点击Add Post Processing Blendable,选择New Post Process Blendable

    • 选择Motion Blur,设置其参数,例如IntensityResolution等。

  3. 在角色蓝图中动态控制动态模糊

    • 在角色蓝图的事件图表中,使用Set Post Process Parameter节点动态控制动态模糊效果。

// 事件图表中的蓝图代码

EventTick

{

    // 获取当前时间

    float CurrentTime = Get World Delta Seconds();



    // 计算新的动态模糊强度

    float NewMotionBlurIntensity = 0.5 * FMath::Sin(CurrentTime * 2 * PI);



    // 设置动态模糊强度

    PostProcessVolume->SetParameter('MotionBlurIntensity', NewMotionBlurIntensity);

}

1.10.2 摄像机的运动控制

在某些游戏中,摄像机的运动控制需要更加精细和自定义。Unreal Engine 提供了多种方式来实现复杂的摄像机运动控制,包括使用Character Movement组件和自定义控制逻辑。

  1. 创建角色蓝图

    • 打开Unreal Engine,创建一个新的角色蓝图。

    • 在角色蓝图中,添加一个摄像机组件(Camera Component)和一个弹簧臂组件(Spring Arm Component)。

  2. 编写摄像机运动控制逻辑

    • 在角色蓝图的事件图表中,编写摄像机的运动控制逻辑。

// 事件图表中的蓝图代码

EventTick

{

    // 获取角色的移动速度

    FVector CharacterVelocity = GetCharacterMovement()->Velocity;



    // 计算新的摄像机位置

    FVector NewCameraLocation = GetActorLocation() + CharacterVelocity * 0.1;



    // 设置新的摄像机位置

    SpringArmComponent->SetWorldLocation(NewCameraLocation);

}

  1. 在角色蓝图中初始化组件

    • 在角色蓝图的构造事件中,初始化摄像机组件和弹簧臂组件。

// 构造事件中的蓝图代码

EventConstruction

{

    // 创建摄像机组件

    CameraComponent = New Camera Component;

    CameraComponent->SetupAttachment(SpringArmComponent);



    // 创建弹簧臂组件

    SpringArmComponent = New Spring Arm Component;

    SpringArmComponent->SetupAttachment(RootComponent);

    SpringArmComponent->TargetArmLength = 400.0f;

    SpringArmComponent->SocketOffset = FVector(0, 0, 200);

}

1.10.3 摄像机的自定义后处理效果

Unreal Engine 支持多种自定义后处理效果,例如色调映射、颜色分级和景深等。通过编写自定义的后处理体积和摄像机组件,可以实现这些效果。

  1. 创建自定义后处理体积类

    • 在你的项目中创建一个新的C++类,继承自UPostProcessVolume
  2. 编写自定义后处理逻辑

    • 在自定义后处理体积类的源文件中,编写自定义后处理逻辑。

// MyCustomPostProcessVolume.h

#pragma once



#include "CoreMinimal.h"

#include "Components/PostProcessVolume.h"

#include "MyCustomPostProcessVolume.generated.h"



UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

class MYGAME_API UMyCustomPostProcessVolume : public UPostProcessVolume

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    UMyCustomPostProcessVolume();



    // 自定义后处理效果

    void CustomPostProcessEffect(float DeltaTime);



    // 后处理效果的参数

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Post Process")

    float CustomEffectIntensity;



    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Post Process")

    float CustomEffectDuration;

};



// MyCustomPostProcessVolume.cpp

#include "MyCustomPostProcessVolume.h"

#include "Engine/World.h"



UMyCustomPostProcessVolume::UMyCustomPostProcessVolume()

{
    
    

    // 默认设置

    CustomEffectIntensity = 1.0f;

    CustomEffectDuration = 5.0f;

}



void UMyCustomPostProcessVolume::CustomPostProcessEffect(float DeltaTime)

{
    
    

    // 获取当前时间

    float CurrentTime = GetWorld()->GetTimeSeconds();



    // 计算新的后处理效果强度

    float NewEffectIntensity = FMath::Sin(CurrentTime * 2 * PI) * CustomEffectIntensity;



    // 应用新的后处理效果强度

    Settings.bOverride_MotionBlurIntensity = true;

    Settings.MotionBlurIntensity = NewEffectIntensity;

}

  1. 在角色类中使用自定义后处理体积

    • 在角色类中,使用自定义的后处理体积类,并在需要时调用自定义后处理效果方法。

// MyCharacter.h

#pragma once



#include "CoreMinimal.h"

#include "GameFramework/Pawn.h"

#include "MyCustomPostProcessVolume.h"

#include "MyCharacter.generated.h"



UCLASS()

class MYGAME_API AMyCharacter : public APawn

{
    
    

    GENERATED_BODY()



public:

    // 构造函数

    AMyCharacter();



protected:

    // 自定义后处理体积组件

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))

    UMyCustomPostProcessVolume* CustomPostProcessVolume;



    // 后处理效果的更新逻辑

    void UpdatePostProcessEffect(float DeltaTime);

};



// MyCharacter.cpp

#include "MyCharacter.h"

#include "MyCustomPostProcessVolume.h"



AMyCharacter::AMyCharacter()

{
    
    

    // 创建自定义后处理体积组件

    CustomPostProcessVolume = CreateDefaultSubobject<UMyCustomPostProcessVolume>(TEXT("CustomPostProcessVolume"));



    // 将后处理体积组件绑定到根组件

    CustomPostProcessVolume->SetupAttachment(RootComponent);

}



void AMyCharacter::UpdatePostProcessEffect(float DeltaTime)

{
    
    

    // 更新自定义后处理效果

    CustomPostProcessVolume->CustomPostProcessEffect(DeltaTime);

}



void AMyCharacter::Tick(float DeltaTime)

{
    
    

    Super::Tick(DeltaTime);



    // 更新后处理效果

    UpdatePostProcessEffect(DeltaTime);

}

1.11 总结

通过Unreal Engine提供的多种编辑器工具和插件,开发者可以快速创建和调试虚拟摄像机效果。无论是使用蓝图进行快速开发,还是通过C++代码进行高级自定义,Unreal Engine都提供了丰富的功能和灵活的扩展性。本文档详细介绍了虚拟摄像机的绑定、动画、跟随、抖动、模糊、切换和高级功能的实现方法。希望这些内容能帮助你在项目中实现更加逼真和互动的摄像机效果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chenlz2007/article/details/147017188
今日推荐