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

1. Actor 与Component的关系

在unreal中,对于场景中能运行的对象,我们称为Actor,而对Actor进行功能性描述的叫做Component
两者最大的区别就是,Actor存在生命周期,而Component和Actor共享生命周期。

2. SceneComponent

一般而言,我们会给Actor一个默认的根节点,而这个节点通常就是SceneComponent
使用什么Component作为默认的根节点并没有什么特别的要求,但是使用SceneComponent
作为默认节点是一种默契。

2.1 定义SceneComponent

在c++我们要在一个对象里面复合另外一个对象,有两个办法
  1. 通过成员对象的方式
    成员对象是指:假设存在两个类A和B,其中B是A种的一个变量对象b,我们称b为A的成员对象。
    这种方式在普通的c++项目中,最大的好处就是当我们类析构的时候,该成员对象自己就会析构,不需要我们花费额外的精力去处理成员对象的内存问题。
    但是在Unreal中,这种方式是被拒绝的:
    在这里插入图片描述
    当我尝试编译的时候,会报错:
    在这里插入图片描述
    原因我们可以简单的考虑为,所有标注为UCLASS的对象在编译结束后,将会被默认的调用整个对象的构造,这个时候,如果我们通过成员对象的方式,这也意味着还需要call成员对象里面的构造,这显然是一件…很多余的事情。
    所以Unreal 对它进行了限制,需要通过指针的方式进行定义。

  2. 通过指针的方式
    在这里插入图片描述

2.2 常见的创建Component的函数

2.2.1 CreateDefaultSubobject<T:UComponent>(name)

  1. 这个函数主要创建类型为T的组件节点,并定义该节点名称为name,这个节点创建出来时将会绑定到自己定义的RootScene指针中。
  2. 该函数必须要在Actor的构造函数里面调用,而不能在BeginPlay或者Tick里面调用,否则游戏会崩溃。具体原因未知.但是我们大概还是能猜到一些,因为unreal的反射系统需要事先知道该class的关联component,这样

实现代码:

AFirstActor::AFirstActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	RootScene = CreateDefaultSubobject<USceneComponent>(TEXT("RootScene"));
	RootComponent = RootScene;
}

2.2.2 利用蓝图观察自己创建的Actor和其Component

在这里插入图片描述
在这里插入图片描述

点进去,我们会发现 我们创建的 Actor + Component 的组合
在这里插入图片描述

2.2.3 函数问题的讨论与实验

  1. 如果我们去除
    在这里插入图片描述
    那么,这个创建出来的RootScene还是不是根节点?
    实验结果表明,依旧是,问题的原因我我们可能需要去看源码,在这里限于篇幅,我们不多做赘述

2.按照问题1提出的, 我们同时创建两个SceneComponent,那么谁是RootComponent?

在这里插入图片描述
而事实上,实验之后,我们会发现,创建出来的蓝图并不会考虑R2节点。如图所示

在这里插入图片描述
当我们将R2设置为根节点时,则我们会发现一个非常神奇的情况
在这里插入图片描述
在这里插入图片描述
看到了吗,创建的RootScene自动称为R2的节点,可以预见的,我们创建R3也会称为R2的子节点
在这里插入图片描述
在这里插入图片描述
所以,设定根节点是一个比较重要的事情,不然可能会出现内存泄露奥…(我也不确定是否会回收这部分资源)

2.3 处理Component之间的父子关系

在前面,我们创建了RootScene,R2,R3,我们现在希望让RootScene作为根节点,R2作为RootScene的子节点,而R3作为R2的子节点
在这里插入图片描述

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值