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++函数中实现默认,在蓝图中可实现重写。

posted @   不三周助  阅读(448)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示