1.学习路径规划

unreal5 actor 创建实例 unreal官方文档_初始化


先介绍一下本人的学习路径:我是跟着UE4官方文档中的编程模块来学习,按官方分的,有入门、初级、中级。第一篇是入门里的内容,而今天我来理一理“初级”模块中的第一篇《游戏控制的摄像机》的代码部分。

链接:https://docs.unrealengine.com/zh-CN/Programming/Tutorials/AutoCamera/index.html

unreal5 actor 创建实例 unreal官方文档_unreal5 actor 创建实例_02


这一步的具体步骤没有什么问题,主要是代码逻辑,可能写得有一些巧妙,解读他对于新手们来说太耗费时间***(我的文章不是大佬向的,逃)***。

所以我就梳理一下官方案例中的代码,方便自己,方便他人。

2.代码讲解

unreal5 actor 创建实例 unreal官方文档_头文件_03


首先看向这一部分在头文件中的声明。上面的两个UPROPERTY的功能是给CameraDirector的“细节”视图添加两个可供编辑的Actor变量,让我们可以自行在游戏编辑器中选择CameraOne和CameraTwo所对应的是场景中的哪两个物体。

而最下面一行的TimeToNextCameraChange,看名字,再想一想官方案例要实现的功能,可以很容易想到,这个变量就是两个照相机各自被激活之间的间隔时间,它会在后面的游戏逻辑中被用到。

unreal5 actor 创建实例 unreal官方文档_头文件_04


这个头文件无需多说,我们继续来看下面的逻辑代码。

const float TimeBetweenCameraChanges = 2.0f;
	const float SmoothBlendTime = 0.75f;
	TimeToNextCameraChange -= DeltaTime;

先来解读一下这几个变量:
TimeBetweenCameraChanges,顾名思义,就是指两个相机来回切换之间的时间**(变量名其实真的不用太纠结,重要的是知道他们的用途)**。
SmoothBlendTime,也很好判断,就是切换照相机这个过程所需的时间。
对TimeToNextCameraChange的处理,首先要理解DeltaTime,它是指每一帧的时间(单位:秒),所以是1/60秒,由于我们在.h文件中把TimeToNextCameraChange初始化时其值为0,所以第一次运算后,TimeToNextCameraChange的值为负。

if (TimeToNextCameraChange <= 0.0f)
	{
		TimeToNextCameraChange += TimeBetweenCameraChanges;

前面我们提到TimeToNextCameraChange在第一次参与运算后值为负,,所以此时要执行if中的内容。TimeToNextCameraChange马上加上了值为2.0的常量,此时TimeToNextCameraChange的值变为1.9几。为正,所以接下来的很多帧之内if中的语句都不执行了。

TimeToNextCameraChange -= DeltaTime;

回到这一句,由于Tick函数中的代码是每秒执行60次,所以TimeToNextCameraChange 的值每秒要减少1,所以在两秒左右的时间之内if里的内容都不执行。

// 查找处理本地玩家控制的actor。
		APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);

**下面来看if中的内容具体是什么:**这一句中的GetPlayerCotroller方法中的两个参数,前一个是编辑器世界中的某个物体,是本地玩家参数就为this,后面的int 参数0是一个索引,也是指向本地玩家。

if (OurPlayerController)
		{
			if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
			{
				// 立即切换到摄像机1。
				OurPlayerController->SetViewTarget(CameraOne);
			}

这里的语句很好理解,就是判断你此时的视野是不是你设置的CameraOne,如果不是就立即切换,当然你也可以用下面代码中的平滑切换来实现这个过程。
稍微说一下GetViewTarget和SetViewTarget,前者是获取玩家此时的视野所在的物体,后者是设置视野所属的物体,二者都是APlayerController中的方法。

else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
			{
				// 平滑地混合到摄像机2。
				OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
			}

这一步就是平滑切换的实现了,和SetViewTarget不一样,SetViewTargetWithBlend中多了一个时间参数,也就是前面设置的SmoothBlendTime。