美文网首页
游戏控制的摄像机

游戏控制的摄像机

作者: wjundong | 来源:发表于2021-07-19 18:53 被阅读0次

了解如何激活和切换不同的视角

创建 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.

相关文章

网友评论

      本文标题:游戏控制的摄像机

      本文链接:https://www.haomeiwen.com/subject/pjmapltx.html