如果你是 虚幻引擎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) 可以看到的内容。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/342b5c826e4a83484d37b6e7a55b8555.png)
1.2对于我们的第二个摄像机,我们将使用一种更深入的方法,让我们可以进行更多的控制。首先,单击 放置Actor(Place Actor) 面板的 基本(Basic) 选项卡,将一个 立方体(Cube) 拖放到 关卡编辑器(Level Editor) 窗口中。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/db01303f9c4514f5dc97c2b3a88c8149.png)
在这一步骤中,我们几乎可以使用任何Actor类。用我们在快速入门教程中创建的MyActor类来替代立方体(Cube)可能会很有趣。 |
1.3放置我们的 立方体(Cube) Actor后,单击 详细信息(Details) 面板中的 +添加组件(+ Add Component) 按钮,来为 立方体(Cube) 添加 摄像机组件(CameraComponent)。你现在可以设置该 摄像机组件(CameraComponent) 的位置和旋转,让我们看到一个不同于我们之前放置的 摄像机Actor(CameraActor) 的场景视图。 |
设置摄像机组件CameraComponent 的位置是(0,80,130),避免摄像机组件和正方体重合。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/54438bba2eafe08840fd8cc00999b0c5.png)
1.4我们应该打开 约束高宽比(Constrain Aspect Ratio) 来自定义我们的 摄像机组件(CameraComponent),以便它与我们的 摄像机Actor(CameraActor) 上的设置匹配。这会使摄像机视图之间的转换更流畅,但这不是必需的。 |
我们最关键的还是C++,一些其余的设置可以在使用的时候再使用浏览器是更好的。设置好我们的场景后,我们现在可以开始创建控制摄像机视图的类。 |
2.1我们现在可以创建一个C++类来控制摄像机视图了。在本教程中,我们可以扩展 Actor 为新类,我们将其称之为CameraDirector。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/87528d12cb7f356d1c4c4a797ea674f5.png)
如果你忘记如何创建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;
APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
if (OurPlayerController)
{
if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
{
OurPlayerController->SetViewTarget(CameraOne);
}
else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
{
OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
}
}
}
此代码将可以让我们每隔3秒在两个不同的摄像机间切换默认玩家的视图。 |
2.4现在我们的代码可进行编译,我们可以返回到 虚幻编辑器(Unreal Editor) 并按下 编译(Compile) 按钮。无需其它代码。我们现在可以在场景中设置CameraDirector了。 |
第三步:在场景中放置Camera Director |
3.1在代码编译完成后,我们可以将 内容浏览器(Content Browser) 中的新类的实例拖曳到 关卡编辑器(Level Editor) 中。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1744a22e26f383baeda5ad1bd3cda048.png)
3.2接下来,我们需要设置摄像机1(CameraOne)和摄像机2(CameraTwo)变量。在 World Outliner (世界大纲视图) 中找到CameraDirector,并在 详细信息面板(Details Panel) 中进行编辑。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aaca67177eee15903e34732b46e91c0b.png)
单击标记为"无(None)"的下拉框,然后将变量设置为 Cube(立方体) 和我们之前创建的 摄像机Actor (CameraActor)。 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/458484305388f5b489ec1d14f0f9315c.png)
3.3如果我们按下播放(Play),我们将会看到与一个视图对齐的摄像机:然后平滑混合到另一个视图: |
你甚至可以改变两个参数的值,反向,甚至第一个Camera和第二个Camera都是同一个摄像机也是可以的。我们现在的这个系统会完全基于游戏逻辑来移动玩家的摄像机。如果玩家在游戏中无法直接控制摄像机,或者混合摄像机视图十分有用时,我们可以修改代码以在这些游戏中使用。总之就是十分Coooooooooooooooooool! |