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 @ 2020-05-11 22:20  不三周助  阅读(402)  评论(0编辑  收藏  举报