在此操作指南教程中,你将根据你在使用静态摄像机指南中创建的逻辑扩展,在关卡中创建额外的 重叠体积 和 摄像机Actor,然后你将通过每个体积导航玩家角色,以便展示摄像机视角间的过渡。
更改碰撞体积的逻辑
为了适应新摄像机过渡功能,你将需要对此前的 重叠体积 逻辑进行一些调整。
-
在内容浏览器中,双击 BP_BlendTriggerVolume,打开其 类默认值。
点击查看大图。
-
在 我的蓝图(My Blueprint) 选项卡中,导航至 变量(Variables) 类别,点击 + 号创建新变量。命名此变量为 CameraToFind,类型为 CameraActor,然后点击 编译(Compile)。
-
点击 CameraToFind 变量旁边的 眼睛 图标,使其公开可见,这样可以编辑蓝图中每个实例的此变量。
-
导航至 事件图表(Event Graph),从 重叠开始时(On Overlap Begin) 事件逻辑,删除 Get Actor Of Class 节点。
点击查看大图。
-
从 我的蓝图(My Blueprint) 选项卡,点击并拖放 CameraToFind 变量的副本到 事件图表(Event Graph)。
点击查看大图。
-
连接其 输出引脚 到 Set View Target with Blend 节点上的 新视图目标(New View Target) 输入引脚。然后,从 If Branch 节点 True 执行引脚拖移,并连接到 Set View Target with Blend 节点。
点击查看大图。
-
编译并保存。
完成后的蓝图
点击查看大图。
-
在内容浏览器中,导航至C++类文件夹,打开
BlendTriggerVolume.h
类默认值。 -
在类默认值中,删除现有 TSubClassOfAActor 声明,替换为
protected:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
ACameraActor* CameraToFind;
- 然后,导航至
BlendTriggerVolume.cpp
文件,在构造函数 ABlendTriggerVolume::ABlendTriggerVolume 中,声明以下内容:
// 设置默认值
ABlendTriggerVolume::ABlendTriggerVolume()
{
// 将此Actor设置为每帧调用更新函数()。 如果你不需要此特性,你可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));
OverlapVolume->SetupAttachment(RootComponent);
CameraToFind = CreateDefaultSubobject<ACameraActor>(TEXT("CameraToFind"));
}
- 在 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);
}
关卡设置
为了展示新实现的逻辑,你将需要设置额外的房间、摄像机和重叠体积到关卡中。
-
使用此前从使用静态摄像机操作指南创建的贴图创建额外的房间。
点击查看大图。然后,我们复制已修改的第三人称示例贴图,以便创建两个额外的房间。
-
在世界大纲视图中,选择你的 BP_BlendTriggerVolume Actor,然后在 细节(Details) 面板中,导航至 默认(Defaults) 类别。打开 要查找摄像机(Camera To Find) 变量旁边的 下拉菜单。
选择你的 BP_ExampleCameraActor。
-
从内容浏览器(Content Browser),将BP_CameraActor (BP_CameraActor2)的实例拖到场景中,然后根据新创建房间中的理想视点调整其变换坐标。
点击查看大图。BP_Camera Actor2导航至房间角落。
-
从 内容浏览器(Content Browser) 中,将 BP_BlendTriggerVolume Actor 的另一实例拖放到世界(BP_BlendTriggerVolume2),然后导航至 细节(Details) 面板,并更改其 盒体范围(Box Extent) X、Y和Z值,适配新添加房间的大小。
点击查看大图。
-
在 细节(Details) 面板中,导航至 默认(Defaults) 类别,并打开 要查找摄像机(Camera To Find) 变量旁边的下拉菜单。
选择你的 BP_ExampleCameraActor2。
-
导航回工具栏,并点击运行(PIE)按钮。
最终效果
游戏启动后,玩家可以使用WASD控制角色的移动。在关卡中重叠多个BP_BlendTriggerVolumes后,摄像机视角将过渡到你已创建并放置在关卡中的BP_CameraActors。
