Unreal 读书笔记 (二) 类对象的设计
一.命名规则
F 纯C++类
U 继承自UObject,但不继承自Actor
A 继承自Actor
S Slate控件类
H HitResult相关类
二.生成
在标准C++中,一个类产生一个对象,被称为“实例化”。实例化对象的方法通过new关键字。
而在虚幻中,对于某些类型,我们不得不通过调用某些函数来产生对象。
①如果你的类是纯C++的类(F开头),你可以通过new来产生对象。
②如果你的类继承自UObject但不继承自Actor,你需要通过NewOBject函数来产生对象。
③如果你的类继承自AActor,你需要通过SpawnActor函数来产生对象。
三.类对象的获取
获取一个对象的唯一的方法,就是通过某种方式传递到这个对象的指针或引用。
①获取场景中某种Actor的所有实例?
for(TActorIterator<AActor> Iterator(GetAorld());Iterator;++Iterator)
四.销毁
①如果是纯C++类在函数体重创建,而不是通过new来分配的,则这个类的对象在函数调用结束后会随着函数栈空间的释放,一起释放掉,不需要手动干涉。
②如果是纯C++类使用new来分配内存,而且你直接传递类的指针。那么需要意识到:除非你手动删除,否则这一块内存将永远不会被释放。如果忘记了,就会产生内存泄漏。
③如果你使用纯C++类来使用new分配内存,同时使用智能指针TSharedPtr/TSharedRef
来进行管理,那么你的类对象将不需要也不应该被你手动释放。智能指针会使用引用计数来完成自动的内存释放。你可以使用MakeShareable函数来转换为普通指针为智能指针:
TSharedPtr<YourClass> YourClassPtr = MakeShareable(new YourClass());
④继承自UObject采用垃圾回收机制。当一个类的成员变量包含指向UObject的对象,同时又带有UPROPERTY宏定义,那么这个成员变量将会触发引用计数机制。
垃圾回收期会定期从根节点Root开始检查,当一个UObject没有被别的任何UObject引用,就会被垃圾回收。你可以通过AddToRoot函数来让一个UObject一直不被回收。
⑤Actor类
Actor类对象可以通过Destroy函数来请求销毁,这样的销毁意味着当前的Actor从所属的世界中被摧毁,但是对象对应的内存的回收依然由系统决定。
五.从C++到蓝图
1.UPROPERTY
当你需要将一个UObject的子类的成员变量注册到蓝图中
UPROPERTY(BlueprintReadWrite,VisibleAnyWhere,Category = "Object")
2.UFUNCTION
当你需要将一个函数供蓝图调用
UFUNCTION(BlueprintCallable,Category="TestLogory")
BlueprintImplementEvent 必须由蓝图的子类实现,不应该在C++中给出实现,否则会导致链接错误
BlueprintNativeEvent 必须在C++函数中实现默认,在蓝图中可实现重写。