# 前言

上周最终还是找了份工作 —— 不过已经不是做游戏什么的了 —— 而是 VR、AR... 据说后面还有 MR 之类的。
虽然换了一份工作,待遇毫无长进 —— 毕竟现在行情似乎不大好,也没办法了。毕竟,稳定和可持续发展才是王道吧。
(好吧,我承认是为了继续待在重庆,然后重庆找不着合适的游戏公司了,加上考虑自己对 UE4 感兴趣,然后大家都在说 VR 后面或许发展比手游更好之类的,所以就毅然转行了)

上周入职之后,算是把 Oculus DK2、HTC Vive、Gear VR 摸了个遍 —— 当然是用 Unity,基本上接口不难,大半天就熟悉了。
而据说新公司主要是使用 UE4,所以,最主要的还是:学习 UE4。

作为一个程序,我其实是不是很喜欢蓝图,因此主要还是研究 C 的实现。
但是作为 Unity 转过来的程序,编程语言突然被从 C# 变成了 C
—— 用起来感觉处处都透着一股奇怪。加上 UE4 对于 C++ 相关接口每次发版本都要变,碰上问题都很可能就是 “最新” 的了。

比如这次。

# 内容

这次其实也是一个简单的问题,但着实花了些时间来琢磨。其原因大概是官方的 4.15 的解释:“更快的 C++ 编译时间:‘虚幻引擎 4 代码库现在的编译速度提升了 50%!头文件只包含其所需的其他标头,而不是每个包含大型单体标头(例如 Engine.h 和 UnrealEd.h)的源文件 - 我们将这一做法称为含您所用(IWYU)。’”
然后直接结果就是,本来在早一点版本的 UE4 写的好好代码,升级到最新 UE4.15 之后,当我们在使用某些接口的时候,直接被编译器提示:“不允许使用不完整的类型”(当然也有其它类型的文字提示,但意思应该差不多)

最普遍的,比如说我想要画一条线:

p
ULineBatchComponent*  lineBatch = GetWorld()->PersistentLineBatcher;
	if (lineBatch != nullptr)
	{
		lineBatch->DrawLine(GetActorLocation(), GetActorForwardVector() * 10, FLinearColor::Red, -1, LineSize, 10);
	}

就会得到这样的提示,并且编译无法通过:

错误

而在 UE4.15 版本中,要解决这个错误,就必须手动添加头文件的引用了。
比如画线这个组件的头文件是 LineBatchComponent.h,我们就必须在代码前边手动包含它:

p
#include "Components/LineBatchComponent.h"

不然就是报错 “不允许指针指向不完整的类型”。
最蛋痛的是,C++ 包含的时候必须有这个头文件的路径。也就是说,你得找到他的路径,或者见着某个代码是如何包含的才行... 虽然可以按下 F12 可以定位,但是好慢啊...

再来举个栗子:添加输入按键映射。

p
UPlayerInput::AddEngineDefinedActionMapping(FInputActionKeyMapping("Jump", EKeys::SpaceBar));

直接这样子写也是不行的,错误是 “不允许使用不完整的类型”,所以必须包含完整路径的头文件:

p
#include "GameFramework/PlayerInput.h"

# 结束

所以,使用 UE4.15 或者更新版本的话,大概都会有这问题 (如果官方本来就是这样打算的话,自己想要什么就必须自己添加头文件...), 就要稍微多动动手了,明白问题所在,当然解决也快。