UE4学习笔记[2]Game-Controlled Cameras/游戏控制的摄像机

第一步:在场景中放置摄像机
如果你是 虚幻引擎4 (UE4)Unreal Engine 4的新手,你可需要先阅读我们的编程快速入门教程。对于本教程,我们假设你熟悉以下操作:创建项目,向项目添加C++代码,编译代码,以及在UE4中向 Actor 添加 组件(Components)

英文官方文档

中文官方文档

1.1我们将从创建一个新的基本代码项目开始,名为"HowTo_AutoCamera",其中包含初学者内容.我们需要做的第一件事是在我们的场景中创建两个摄像机。由于设置摄像机有多种方法,在这里我们将使用最常见的两种方法。对于我们的第一个摄像机,找到 放置Actor(Place Actors) 面板并选中 所有类(All Classes) 选项卡,你将找到一个 摄像机(Camera) Actor。将其拖拽到 关卡编辑器(Level Editor) 中,并将其放置在合适的位置,以便它能清楚地看到我们的场景。 完成此操作后,只要我们选择了新的 摄像机Actor(Camera Actor)关卡编辑器(Level Editor) 窗口就会有一个画中画视图,显示该 摄像机Actor(Camera Actor) 可以看到的内容。

在这里插入图片描述

1.2对于我们的第二个摄像机,我们将使用一种更深入的方法,让我们可以进行更多的控制。首先,单击 放置Actor(Place Actor) 面板的 基本(Basic) 选项卡,将一个 立方体(Cube) 拖放到 关卡编辑器(Level Editor) 窗口中。

在这里插入图片描述

在这一步骤中,我们几乎可以使用任何Actor类。用我们在快速入门教程中创建的MyActor类来替代立方体(Cube)可能会很有趣。
1.3放置我们的 立方体(Cube) Actor后,单击 详细信息(Details) 面板中的 +添加组件(+ Add Component) 按钮,来为 立方体(Cube) 添加 摄像机组件(CameraComponent)。你现在可以设置该 摄像机组件(CameraComponent) 的位置和旋转,让我们看到一个不同于我们之前放置的 摄像机Actor(CameraActor) 的场景视图。
设置摄像机组件CameraComponent 的位置是(0,80,130),避免摄像机组件和正方体重合。

在这里插入图片描述

1.4我们应该打开 约束高宽比(Constrain Aspect Ratio) 来自定义我们的 摄像机组件(CameraComponent),以便它与我们的 摄像机Actor(CameraActor) 上的设置匹配。这会使摄像机视图之间的转换更流畅,但这不是必需的。
我们最关键的还是C++,一些其余的设置可以在使用的时候再使用浏览器是更好的。设置好我们的场景后,我们现在可以开始创建控制摄像机视图的类。
第二步:在C++中控制摄像机视图
2.1我们现在可以创建一个C++类来控制摄像机视图了。在本教程中,我们可以扩展 Actor 为新类,我们将其称之为CameraDirector。

在这里插入图片描述

如果你忘记如何创建C++类,你可以看上一篇或者百度。
2.2在CameraDirector.h中,我们将以下代码添加到ACameraDirector类定义的底部位置:
UPROPERTY(EditAnywhere)
AActor* CameraOne;

UPROPERTY(EditAnywhere)
AActor* CameraTwo;

float TimeToNextCameraChange;
UPROPERTY 宏使得变量对 虚幻引擎(Unreal Engine) 可见。这样,当我们启动游戏或在将来的工作会话中重新载入关卡或项目时,这些变量中设置的值将不会被重置。我们还添加了 EditAnywhere 关键字,这允许我们在 虚幻编辑器(Unreal Editor) 中设置摄像机1(CameraOne)摄像机2(CameraTwo)
如果你有兴趣,可以对比上一节的代码。在学习的过程中,你必然会遇到你现在不会的事情,如果你不会的话,就说明你不会。但是你要是弄会了,那么就是说明你会了。将学习中遇到不会的事情弄坏你便是学到了东西,虽然有些东西你现在不一定能弄坏,但是你走着走着会再次遇到它的。
2.3在CameraDirector.cpp中,将以下代码行添加到文件的顶部位置,位于其它#include行的正下方:[当然你也可以放在正上方]
#include "Kismet/GameplayStatics.h"
GameplayStatics头文件允许我们访问一些有用的通用函数,在本教程中我们需要使用其中一个函数。完成后,将以下代码添加到 ACameraDirector::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);
        }
    }
}
此代码将可以让我们每隔3秒在两个不同的摄像机间切换默认玩家的视图。
2.4现在我们的代码可进行编译,我们可以返回到 虚幻编辑器(Unreal Editor) 并按下 编译(Compile) 按钮。无需其它代码。我们现在可以在场景中设置CameraDirector了。
第三步:在场景中放置Camera Director
3.1在代码编译完成后,我们可以将 内容浏览器(Content Browser) 中的新类的实例拖曳到 关卡编辑器(Level Editor) 中。

在这里插入图片描述

3.2接下来,我们需要设置摄像机1(CameraOne)和摄像机2(CameraTwo)变量。在 World Outliner (世界大纲视图) 中找到CameraDirector,并在 详细信息面板(Details Panel) 中进行编辑。

在这里插入图片描述

单击标记为"无(None)"的下拉框,然后将变量设置为 Cube(立方体) 和我们之前创建的 摄像机Actor (CameraActor)

在这里插入图片描述

3.3如果我们按下播放(Play),我们将会看到与一个视图对齐的摄像机:然后平滑混合到另一个视图:
你甚至可以改变两个参数的值,反向,甚至第一个Camera和第二个Camera都是同一个摄像机也是可以的。我们现在的这个系统会完全基于游戏逻辑来移动玩家的摄像机。如果玩家在游戏中无法直接控制摄像机,或者混合摄像机视图十分有用时,我们可以修改代码以在这些游戏中使用。总之就是十分Coooooooooooooooooool!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值