了解如何激活和切换不同的视角
创建 Actor 子类
创建 Actor 子类, 命名为 CameraDirector
. 我们需要创建一个 C++ 类来控制摄像机视图, 这里选择该类为 Actor 子类, 因为 Actor 是可在场景中放置的最基本对象类型, 这样我们可以把这个相机控制器拖到场景中. 然后让它来控制场景中的各个相机对象.
创建相机变量指针
在类的 public 中加入两个相机变量指针, 用来指向场景中的相机变量:
UPROPERTY(EditAnywhere)
AActor* CameraOne;
UPROPERTY(EditAnywhere)
AActor* CameraTwo;
float TimeToNextCameraChange;
UPROPERTY 宏使得变量对编辑器可见。这样, 当我们启动游戏或在将来的工作会话中重新载入关卡或项目时,实例化对象的这些变量中设置的值将不会被重置
EditAnywhere 关键字允许我们直接在编辑器中设置 CameraOne 和 CameraTwo 所指向的对象.
因为相机类也继承自 Actor , 因此指针类型可以设置为 AActor.
添加头文件
为了实现体现相机控制效果, 我们需要获取玩家的视图, 因此需要包含 GameplayStatics.h
头文件. 添加:
#include "Kismet/GameplayStatics.h"
在 Tick 函数中实现相机控制
// 两个相机切换时间
const float TimeBetweenCameraChanges = 2.0f;
// 平滑混合的时间
const float SmoothBlendTime = 0.75f;
// 切换时间倒计时
TimeToNextCameraChange -= DeltaTime;
// 到了切换时间
if (TimeToNextCameraChange <= 0.0f)
{
// 重新加载切换时间
TimeToNextCameraChange += TimeBetweenCameraChanges;
// 查找处理本地玩家控制的 actor
APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
if (OurPlayerController)
{
if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
{
// 立即切换到摄像机1。
OurPlayerController->SetViewTarget(CameraOne);
}
else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
{
// 平滑地混合到摄像机2。
OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
}
}
}
在 Tick 函数中, 当 2s 的倒计时结束后, 重新设置倒计时为 2s, 然后通过 GetPlayerController 函数实时获取玩家控制器, 利用玩家控制器获取玩家视图所对应的相机, 用它来判断如何切换相机, 如果当前是相机1的视图, 就平滑切换到相机 2, 如果当前是相机 2, 则直接切换到相机 1.
应用该类
编译代码, 并在编辑器中放置两个 相机 Actor
, 然后放置 CameraDirector, 在细节中设置 CameraOne 和 CameraTwo 指针变量, 将其指向刚刚放置两个 相机 Actor
.
网友评论