在多个固定摄像机视角间切换

有关如何从使用静态摄像机页面修改现有脚本逻辑,以便混合关卡中多个摄像机Actor视点的指导页面。

Windows
MacOS
Linux

在此操作指南教程中,你将根据你在使用静态摄像机指南中创建的逻辑扩展,在关卡中创建额外的 重叠体积摄像机Actor,然后你将通过每个体积导航玩家角色,以便展示摄像机视角间的过渡。

更改碰撞体积的逻辑

为了适应新摄像机过渡功能,你将需要对此前的 重叠体积 逻辑进行一些调整。

选择实现方法:

Blueprints

C++

  1. 在内容浏览器中,双击 BP_BlendTriggerVolume,打开其 类默认值

    点击查看大图。

  2. 我的蓝图(My Blueprint) 选项卡中,导航至 变量(Variables) 类别,点击 + 号创建新变量。命名此变量为 CameraToFind,类型为 CameraActor,然后点击 编译(Compile)

    CameraToFind变量

  3. 点击 CameraToFind 变量旁边的 眼睛 图标,使其公开可见,这样可以编辑蓝图中每个实例的此变量。

    设置变量公开可见的眼睛图标

  4. 导航至 事件图表(Event Graph),从 重叠开始时(On Overlap Begin) 事件逻辑,删除 Get Actor Of Class 节点。

    点击查看大图。

  5. 我的蓝图(My Blueprint) 选项卡,点击并拖放 CameraToFind 变量的副本到 事件图表(Event Graph)

    点击查看大图。

  6. 连接其 输出引脚Set View Target with Blend 节点上的 新视图目标(New View Target) 输入引脚。然后,从 If Branch 节点 True 执行引脚拖移,并连接到 Set View Target with Blend 节点。

    点击查看大图。

  7. 编译并保存。

完成后的蓝图

点击查看大图。

  1. 在内容浏览器中,导航至C++类文件夹,打开 BlendTriggerVolume.h 类默认值。

    内容浏览器中的C++类

  2. 在类默认值中,删除现有 TSubClassOfAActor 声明,替换为

    protected:
    
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    ACameraActor* CameraToFind;
  3. 然后,导航至 BlendTriggerVolume.cpp 文件,在构造函数 ABlendTriggerVolume::ABlendTriggerVolume 中,声明以下内容:

    // 设置默认值
    ABlendTriggerVolume::ABlendTriggerVolume()
    {
         // 将此Actor设置为每帧调用更新函数()。  如果你不需要此特性,你可以关闭以提升性能。
        PrimaryActorTick.bCanEverTick = true;
    
        OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));
        OverlapVolume->SetupAttachment(RootComponent);
    
        CameraToFind = CreateDefaultSubobject<ACameraActor>(TEXT("CameraToFind"));
    }
  4. ABlendTriggerVolume::NotifyActorBeginOverlap 方法中,删除以下代码行:

    //包含已找到的摄像机Actor的数组
    TArray<AActor*> FoundActors;
    
     //效用函数,用关卡中的所有摄像机Actor填充数组 
    UGameplayStatics::GetAllActorsOfClass(GetWorld(), CameraToFind, FoundActors);
    
    //将玩家控制器视图设置为第一个找到的CameraActor 
    
    PlayerCharacterController->SetViewTargetWithBlend(FoundActors[0], CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);

    将已删除代码替换为:

    //将玩家控制器视图设置为CameraActorToFind变量。
                PlayerCharacterController->SetViewTargetWithBlend(CameraToFind, CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
            }
        }
    }

    在上面的声明中,我们替换了逻辑,当我们的玩家角色与体积重叠时,将过渡至类构造函数中实例化的 Camera Actor 变量。

完成后的代码

BlendTriggerVolume.h

//版权所有 1998-2021 Epic Games, Inc。保留所有权利。

pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "BlendTriggerVolume.generated.h"

UCLASS()
class STATICCAMERAS_API ABlendTriggerVolume : public AActor
{
    GENERATED_BODY()

public:    
    // 为此Actor的属性设置默认值
    ABlendTriggerVolume();

protected:
    // 当游戏开始或重生(Spawn)时被调用
    virtual void BeginPlay() override;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    class UBoxComponent* OverlapVolume;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    ACameraActor* CameraToFind;

    UPROPERTY(EditDefaultsOnly, meta =(ClampMin = 0.0f))
    float CameraBlendTime;

    virtual void NotifyActorBeginOverlap(AActor* OtherActor);

    virtual void NotifyActorEndOverlap(AActor* OtherActor);

public:    
    // 每一帧都被调用
    virtual void Tick(float DeltaTime) override;

};

BlendTriggerVolume.cpp

//版权所有 1998-2021 Epic Games, Inc。保留所有权利。

#include "BlendTriggerVolume.h"
#include "Components/BoxComponent.h"
#include "StaticCamerasCharacter.h"
#include "Camera/CameraActor.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"

// 设置默认值
ABlendTriggerVolume::ABlendTriggerVolume()
{
     // 将此Actor设置为每帧调用更新函数()。  如果你不需要此特性,你可以关闭以提升性能。
    PrimaryActorTick.bCanEverTick = true;

    OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));
    OverlapVolume->SetupAttachment(RootComponent);

    CameraToFind = CreateDefaultSubobject<ACameraActor>(TEXT("CameraToFind"));
}

// 当游戏开始或重生(Spawn)时被调用
void ABlendTriggerVolume::BeginPlay()
{
    Super::BeginPlay();
}

void ABlendTriggerVolume::NotifyActorBeginOverlap(AActor* OtherActor)
{
    if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
    {
        if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
        {
            PlayerCharacterController->SetViewTargetWithBlend(CameraToFind, CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
        }
    }
}

void ABlendTriggerVolume::NotifyActorEndOverlap(AActor* OtherActor)
{
    if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
    {
        if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
        {
            PlayerCharacterController->SetViewTargetWithBlend(PlayerCharacterController->GetPawn(), CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
        }
    }
}

// 每一帧都被调用
void ABlendTriggerVolume::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

关卡设置

为了展示新实现的逻辑,你将需要设置额外的房间、摄像机和重叠体积到关卡中。

  1. 使用此前从使用静态摄像机操作指南创建的贴图创建额外的房间。

    点击查看大图。然后,我们复制已修改的第三人称示例贴图,以便创建两个额外的房间。

  2. 在世界大纲视图中,选择你的 BP_BlendTriggerVolume Actor,然后在 细节(Details) 面板中,导航至 默认(Defaults) 类别。打开 要查找摄像机(Camera To Find) 变量旁边的 下拉菜单

    要查找摄像机变量下拉菜单

    选择你的 BP_ExampleCameraActor

    选择摄像机Actor

  3. 从内容浏览器(Content Browser),将BP_CameraActor (BP_CameraActor2)的实例拖到场景中,然后根据新创建房间中的理想视点调整其变换坐标。

    点击查看大图。BP_Camera Actor2导航至房间角落。

  4. 内容浏览器(Content Browser) 中,将 BP_BlendTriggerVolume Actor 的另一实例拖放到世界(BP_BlendTriggerVolume2),然后导航至 细节(Details) 面板,并更改其 盒体范围(Box Extent) X、Y和Z值,适配新添加房间的大小。

    点击查看大图。

  5. 细节(Details) 面板中,导航至 默认(Defaults) 类别,并打开 要查找摄像机(Camera To Find) 变量旁边的下拉菜单。

    要查找摄像机变量下拉菜单2

    选择你的 BP_ExampleCameraActor2

    选择新摄像机Actor

  6. 导航回工具栏,并点击运行(PIE)按钮。

    在编辑器中运行按钮

最终效果

游戏启动后,玩家可以使用WASD控制角色的移动。在关卡中重叠多个BP_BlendTriggerVolumes后,摄像机视角将过渡到你已创建并放置在关卡中的BP_CameraActors。

切换摄像机 - 最终效果

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消