Zephus 发表于 2022-6-5 18:35

2022-06-05【UE】回忆之前,忘记之后【大象无形】

<hr><hr>第四章 对象


《就他这样怎么能找到对象的?》
(找个对象很难吗?)
类对象的创建

纯c++类型,使用F开头。通过new创建对象。
[*]继承自UObject,使用NewObject创建对象。
NewObject<T>()
这会返回一个指向你的类的指针,此时这个对象被分配在临时包中。下一次加载会被清除。
[*]继承自AActor,通过SpawnActor函数来产生对象。
GetWorld()->SpawnActor<AMyActor>()Slate,暂时不用
类对象的获取


for(TActorIterator<AActor> Iterator(GetWorld()); Iterator; ++ Iterator){}
通过cast转换类型拿到自己想要的actor。
类对象的销毁


[*]
再函数体中创建,不是通过new来分配内存,这个对象会在函数调用结束后,随着函数栈空间释放,一起释放掉。不需要操作。
void Func()
{
FClass obj = FClass();
}
[*]
如果是通过new来分配内存,而且直接传递类的指针,那么需要意识到,除非手动删除,否则这一块内存永远不会被释放:内存泄漏。
但是如果使用new分配了内存,同时使用了智能指针TSharedPtr/TSharedRef进行管理,那么它和c#一样,也不需要并且不应该被手动释放。智能指针通过引用计数来完成自动内存释放。
可以使用MakeShareable函数来转化普通指针为只能指针。
TSharedPtr<FClass> objPtr = MakeShareable(new FClass())
[*]
UObject特殊,无法使用智能指针来管理UObject对象。
UObject采用自动垃圾回收机制。
当一个类的成员变量包含指向UObject的对象,同时又带有UPROPERTY宏,那么这个成员变量会触发引用计数机制。
垃圾回收器会定期从根节点Root开始检查,当一个UObject没有被别的任何UObject引用,就会被垃圾回收。你可以通过AddToRoot函数,让一个UObject一直不被回收。
Actor类,可以通过调用Destroy函数请求销毁,但这只意味着讲当前Actor从所属世界中摧毁,但是内存回收依然由系统决定。
第七章 引擎系统相关类

字符串处理


FName: const string
FText:static string
FString:string
第十三章 蓝图

蓝图架构概述


从Kismet系统发展而来,是一个完整的面向对象的可视化编程系统。小型蓝图编译速度远远快过c++速度,并且能在发布时将蓝图编译为c++。是基于虚幻UClass Uproperty UFunction框架,根植于Unreal Script字节码编译器系统的一套可视化编程系统。
也就是说,蓝图编译结果依然会转化为UClass,UProperty,UFunction信息。指令代码会存储于UFunction信息中。可视化字节码编程。
前端:蓝图存储与编辑


蓝图系统由三部分组成:蓝图编辑系统、蓝图本身、蓝图编译后的字节码。最终编译完成的蓝图字节码将不会包含蓝图本身的节点信息。这部分信息是在UEdGraph中存储的,这是一种优化。
UEdGraph用于表示蓝图的数据结构。从整体来说,可以把其他看作这个结构。
UEdGraph
|-Schema
|-Nodes
|-SubGraphes
页: [1]
查看完整版本: 2022-06-05【UE】回忆之前,忘记之后【大象无形】