找回密码
 立即注册
查看: 406|回复: 0

unreal-c++教程-第二章:Actor和Component

[复制链接]
发表于 2023-4-13 10:23 | 显示全部楼层 |阅读模式
Actor和Component

    1. Actor 与Component的关系2. SceneComponent
      2.1 定义SceneComponent2.2 常见的创建Component的函数
        2.2.1 CreateDefaultSubobject(name)2.2.2 利用蓝图观察自己创建的Actor和其Component2.2.3 函数问题的讨论与实验
      2.3 处理Component之间的父子关系



1. Actor 与Component的关系
  1. 在unreal中,对于场景中能运行的对象,我们称为Actor,而对Actor进行功能性描述的叫做Component
  2. 两者最大的区别就是,Actor存在生命周期,而Component和Actor共享生命周期。
复制代码
2. SceneComponent
  1. 一般而言,我们会给Actor一个默认的根节点,而这个节点通常就是SceneComponent
  2. 使用什么Component作为默认的根节点并没有什么特别的要求,但是使用SceneComponent
  3. 作为默认节点是一种默契。
复制代码
2.1 定义SceneComponent
  1. 在c++我们要在一个对象里面复合另外一个对象,有两个办法
复制代码
    通过成员对象的方式
    成员对象是指:假设存在两个类A和B,其中B是A种的一个变量对象b,我们称b为A的成员对象。
    这种方式在普通的c++项目中,最大的好处就是当我们类析构的时候,该成员对象自己就会析构,不需要我们花费额外的精力去处理成员对象的内存问题。
    但是在Unreal中,这种方式是被拒绝的:


    当我尝试编译的时候,会报错:


    原因我们可以简单的考虑为,所有标注为UCLASS的对象在编译结束后,将会被默认的调用整个对象的构造,这个时候,如果我们通过成员对象的方式,这也意味着还需要call成员对象里面的构造,这显然是一件…很多余的事情。
    所以Unreal 对它进行了限制,需要通过指针的方式进行定义。
    通过指针的方式



2.2 常见的创建Component的函数

2.2.1 CreateDefaultSubobject<T:UComponent>(name)

    这个函数主要创建类型为T的组件节点,并定义该节点名称为name,这个节点创建出来时将会绑定到自己定义的RootScene指针中。该函数必须要在Actor的构造函数里面调用,而不能在BeginPlay或者Tick里面调用,否则游戏会崩溃。具体原因未知.但是我们大概还是能猜到一些,因为unreal的反射系统需要事先知道该class的关联component,这样
实现代码:
  1. AFirstActor::AFirstActor(){// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
  2.         PrimaryActorTick.bCanEverTick = true;
  3.         RootScene = CreateDefaultSubobject<USceneComponent>(TEXT("RootScene"));
  4.         RootComponent = RootScene;}
复制代码
2.2.2 利用蓝图观察自己创建的Actor和其Component




点进去,我们会发现 我们创建的 Actor + Component 的组合



2.2.3 函数问题的讨论与实验

    如果我们去除


    那么,这个创建出来的RootScene还是不是根节点?
    实验结果表明,依旧是,问题的原因我我们可能需要去看源码,在这里限于篇幅,我们不多做赘述
2.按照问题1提出的, 我们同时创建两个SceneComponent,那么谁是RootComponent?

而事实上,实验之后,我们会发现,创建出来的蓝图并不会考虑R2节点。如图所示

当我们将R2设置为根节点时,则我们会发现一个非常神奇的情况



看到了吗,创建的RootScene自动称为R2的节点,可以预见的,我们创建R3也会称为R2的子节点



所以,设定根节点是一个比较重要的事情,不然可能会出现内存泄露奥…(我也不确定是否会回收这部分资源)
2.3 处理Component之间的父子关系

在前面,我们创建了RootScene,R2,R3,我们现在希望让RootScene作为根节点,R2作为RootScene的子节点,而R3作为R2的子节点




这里可能有点小小的问题,就是在c++上写的代码不会及时热更到蓝图,删掉重创就行,这是个小问题,并不影响你的项目。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 08:01 , Processed in 0.097008 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表