UE4中常用的库

| 分类 UE4  | 标签 note 

UE4里面有大量游戏开发相关的C++库,但在如此庞大的代码工程里直接查阅也不是那么简单。这里挑一些常用且值得掌握的介绍一下。要知晓详情,可以查阅API文档里面的Core这部分。


容器

为了满足合适的存储需求,UE4提供了繁多的容器类,其中很多是直接照搬的C++标准库。所以啊,没啥令人兴奋的。


通用容器

TARRAY (Engine\Source\Runtime\Core\Public\Containers\Array.h)

TArray是个模板动态数组,最通用最易用的UE4容器。拥有你所期望的所有动态数组特性和完备的UPROPERTY支持。并且,其API额外提供了将TArray看作栈或者堆的泛型支持。

TArray可以声明为UPROPERTY,意味着其能显示在编辑器的属性窗口上而且有资格用于网络复制,还能自动UPROPERTY序列化。具备如此酷炫的特性,TArray自然成为游戏逻辑功能实现的最常见选择。

如果你之前常用C++标准库里的vector类,TArray可取而代之。

TSET (Engine\Source\Runtime\Core\Public\Containers\Set.h)

TSet是对数学上集合这个概念的模板实现,提供必备的集合运算,比如交集、并集、差集和快速查询元素是否存在某集合(PeopleWhoLoveTSet.Contains(Me);)

警告:与TArray不同,TSet(和TMap)不直接支持UPROPERTY,因此就没法自动复制、序列化等等。如果一个TSet(或者TMap)用于UObject引用(比如TSet<UObject*>),就需要手动确认这些引用被正确序列化可用于垃圾回收。有的甚至需要手动清理垃圾。

TSet与STL里的set类相似,但UE4的实现基于哈希。如果你创建了一个新类型,且需要用在TSet(或TMap)里,那必须实现一个简单的函数来哈希这个类型: uint32 GetTypeHash(const YourType& TypeVar) 。可以参考代码库里大量的示例。

TMAP (Engine\Source\Runtime\Core\Public\Containers\Map.h)

TMap是种数据结构模板,允许一种类型映射另一种(键-值对),具有快速添加、移除、查找元素的特点。在有些语言里,TMap结构也叫字典(dictionary)

与TSet类似,TMap也不能声明成UPROPERTY

TMap与STL库的map相比,UE4基于哈希算法实现。


迭代器

UE4的容器提供迭代器支持,但用法与STL里的完全相同。你可以逐个查阅容器类,了解各自支持的迭代器。当然,通用的const和非const迭代器肯定是支持滴。

示例:

// Example direct from the engine source:

// Initialize an iterator from the provided array (InPackages)

for (TArray<UPackage*>::TConstIterator PkgIter(InPackages); PkgIter; ++PkgIter)
{

// Access the element at the current position of the iterator with the * operator
	UPackage* CurPackage = *PkgIter;

使用C++11的话,也可以用auto关键字。


for (auto FileIt = Files.CreateConstIterator(); FileIt; ++FileIt)
{
	const FString FileExtension = FPaths::GetExtension(*FileIt);


排序

除了默认的排序选项外,UE4容器排序也允许自定义排序规则。

示例:


// Custom struct written to serve as the predicate for sorting. Given two constant references to elements

// in the data structure (anim notify events), sort them according to their trigger time.

struct FCompareFAnimNotifyEvent
{

	FORCEINLINE bool operator()(const FAnimNotifyEvent& A, const FAnimNotifyEvent& B) const
	{
		return A.GetTriggerTime() < B.GetTriggerTime();
	}

};

// Sort the notifies array (TArray<FAnimNotifyEvent>) with the custom predicate

Notifies.Sort(FCompareFAnimNotifyEvent());


其他容器

TArrayTSetTMap是UE4中最常用的容器,但不是仅有的!如果想翻源码瞧瞧所有的容器,可查阅Engine\Source\Runtime\Core\Public\Containers代码目录。


字符串处理

(Engine\Source\Runtime\Core\Public\Containers\UnrealString.h)

(Engine\Source\Runtime\Core\Public\UObject\NameTypes.h)

(Engine\Source\Runtime\Core\Public\Internationalization\Text.h)

UE4为字符串交互提供了三种不同的类:FStringFNameFText。需要清楚知晓他们各自的详细用途和最佳使用场所,可以查阅文档和相关的链接。


数学计算

(Engine\Source\Runtime\Core\Public\Math\UnrealMathUtility.h)

(Engine\Source\Runtime\Core\Public\GenericPlatform\GenericPlatformMath.h)

游戏离得开数学吗?当然不行,所以UE4拥有一套非常健壮且跨平台的数学库,在FMath里实现了一系列的静态函数。FMath涵盖了由简到难非常大的数学计算集合。涉及到数学的使用时,只需浏览头文件就可以理解早已写好的完整要领。


结语

希望这篇简单的常用库介绍对你了解UE4有所帮助。不可否认,这些只是皮毛,所幸UE4已然完全开源,其博大精深之处还需细细专研品味。有兴趣交流的可以多联系,还望不吝赐教。


参阅

  • UE4 Blog
  • 《Learning C++ by Creating Games with UE4》

Previous     Next