Skip to content

NActor对象

在Nibiru Stuido引擎中,Actor是场景中的基础对象,它是所有游戏实体的容器。几乎所有在引擎中可见的物体、脚本、声音、粒子等都基于Actor。它并不直接拥有渲染、物理、脚本等功能,而是作为一个容器来挂载不同的组件,这些组件才是真正实现各种行为的关键。

接口名称返回值接口含义
IsActiveSelfbool判断actor自身是否是激活状态
GetTagstd::string获取Tag
SetTagvoid设置Tag
SetLayervoid设置层级
SetTagNamevoid设置tag的名称
GetLayeruint32获取层级
SetNamevoid设置actor名称
GetNamestd::string获取Actor名称
Destroyvoid销毁
IsRaycastTargetbool判断是否参与射线拾取
GetChildrenstd::vector<NActorPtr>获取所有子控件
GetChildrenByNamestd::vector<NActorPtr>通过名称获取子控件
SetActivevoid设置激活状态
SetSelfActivevoid设置自身激活状态
SetParentvoid设置父节点
HasParentbool判断是否有父节点
GetParentNActorPtr获取父节点
GetWorldAABBAABB获取世界空间的自身AABB包围盒
GetWorldAABBMergeChildrenAABB获取包含所有子控件世界空间的AABB包围盒
GetLocalAABBAABB获取mesh包围盒
GetWorldOBBOBB获取世界空间的OBB包围盒
GetWorldOBBMergeChildrenOBB获取包含所有子节点的OBB包围盒
GetLocalOBBOBB获取mesh包围盒
SetRaycastTargetvoid设置是否参与射线拾取
GetComponentsstd::vector<NWeakObjectPtr<NComponent>>获取Actor身上挂载的所有组件
GetComponentsInChildrenstd::vector<NWeakObjectPtr<NComponent>>获取包含子节点身上挂载的所有组件
SetActorScopevoid设置Actor生命范围
GetActorScopeEActorScope获取Actor生命范围设置
AddComponentbool添加脚本
HasComponentbool判断是否挂载某个脚本
RemoveComponentvoid移除组件的挂载
GetSiblingIndexuint32获取同级索引值
SetAsFirstSiblingvoid设置Actor在同层级的最上面
SetAsLastSiblingvoid设置Actor在同层级的最下面
SetSiblingIndexvoid设置Actor在同层级里的索引值
CloneActorNActorPtr克隆Actor
IsStaticbool判断是不是静态Actor

属性面板介绍

alt text

  • ID标识符:该对象的名称。
  • 激活:对象是否为激活状态。勾选对象为激活状态,不勾选对象为隐藏状态,
  • 层级:是一种用于对对象进行分类的机制。通过将对象分配到不同的层级,开发者可以控制对象的渲染顺序、物理碰撞检测、光照计算等。
  • 标签:是用于标识对象的另一种机制。与层级不同,标签是字符串形式的标识符,可以更灵活地用于对象的分类和查找。
  • 静态物体:该对象是否设置为静态物体。
  • 射线检测:该对象是否接受对象检测。

设置和获取激活状态

bool IsActiveSelf();
void SetActive(bool value);
void SetSelfActive(bool bActive);

参数:

参数说明
value要设置的激活状态
bActive要设置的激活状态

描述:上述接口SetActive是设置自身同时包含所有子控件的激活状态,SetSelfActive接口只是设置自身的激活状态。

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	actor->SetActive(false);
	actor->SetSelfActive(true);
}

设置和获取Actor的层级

void SetLayer(uint32 layer, bool recursiveChildren = true);
uint32 GetLayer();

参数:

参数说明
layer要设置的Actor的层级
recursiveChildren是否要递归设置所有子控件

描述:设置Actor的渲染层级,当Camera进行渲染时,如果Camera设置的剔除遮罩不包含此层级,那么这个camera将不会渲染此控件。

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto camera=NCamera::MainCamera();
	camera->SetRenderMask(10);
	actor->SetLayer(10);
}

设置和获取Actor的名称

void SetName(const std::string& name);
std::string GetName();

参数:

参数说明
name要设置的名称

描述:通过上述接口可以设置当前actor的名称,不过Actor的名称都是在创建时就已经设置好,可以通过此接口进行修改。

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto name=actor->GetName();
	actor->SetName("Test_name");
}

设置Actor是否参与射线拾取

bool IsRaycastTarget();
void SetRaycastTarget(bool isRaycastTarget, bool containChildrens = true);

参数:

参数说明
isRaycastTarget是否参与射线拾取
containChildrens是否包含子控件

描述:通过上述接口可以设置Actor是否参与射线拾取,如果不参与,将收不到事件回调。 代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	actor->SetRaycastTarget(true,true);
	auto israycast=actor->IsRaycastTarget();
}

获取子控件

bool IsRaycastTarget();
void SetRaycastTarget(bool isRaycastTarget, bool containChildrens = true);

参数:

参数说明
name子控件的名称
recursively是否递归所有的子控件

描述:通过上述接口可以获取所有子控件和所有指定名称的子控件。 代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto childs=actor->GetChildren();
	auto testchilds=actor->GetChildrenByName("Test",true);
}

设置或获取父控件

void SetParent(NActorPtr parent);
void SetParent(NActorPtr parent, bool worldPositionStays);
bool HasParent();
NActorPtr GetParent();
NActorPtr GetParent(bool recursiveToRoot);

参数:

参数说明
parent要设置的父控件
worldPositionStays是否保持世界空间位置不变
recursiveToRoot是否需要递归根节点

描述:通过SetParent接口可以将Actor添加到一个父节点下

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto parent=NActorManager::GetActor("parentAct");
	actor->SetParent(parent);
}

获取控件的包围盒

AABB GetWorldAABB() const;
AABB GetWorldAABBMergeChildren() const;
AABB GetLocalAABB() const;
OBB GetWorldOBB() const;
OBB GetWorldOBBMergeChildren() const;
OBB GetLocalOBB() const;

返回值:

返回值说明
AABBAABB包围盒对象
OBBOBB包围盒对象

描述:通过上述接口可以获取控件的包围盒信息.GetWorldAABB、GetWorldOBB接口获取世界空间的包围盒信息,GetLocalAABB、GetLocalOBB接口是获取局部空间的包围盒信息,GetWorldAABBMergeChildren、GetWorldOBBMergeChildren接口是获取世界空间的包围盒信息,同时merge了所有子控件的包围盒结果。

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto aabb=actor->GetWorldAABB();
	auto aabbMerge=actor->GetWorldAABBMergeChildren();
	auto obb=actor->GetWorldOBB();
	auto obbmerge=actor->GetWorldOBBMergeChildren();
}

设置和获取Actor的生命范围

void SetActorScope(EActorScope type);
EActorScope GetActorScope();

参数:

参数说明
typeActor的生命范围,Level表示当前场景,Global表示整个应用进程

描述:通过上述接口可以设置Actor生命范围,默认为Level,这意味着它将在离开Level时销毁,如果将actor设置为Global,则actor将在整个应用程序生命周期中存在。

代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	actor->SetActorScope(EActorScope::Global);
	auto type = actor->GetActorScope();
}

设置和获取Actor的生命范围

cpp
bool AddComponent(const std::string& componentName);

template <typename T>
bool HasComponent(std::enable_if_t<!IsInternalComponent<T>::Value, NWeakObjectPtr<T>> comp)

template <typename T>
void RemoveComponent(std::enable_if_t<!IsInternalComponent<T>::Value, NWeakObjectPtr<T>> comp)

描述:通过上述接口,开发者可以在运行时添加脚本组件,移除脚本组件。 代码示例:

cpp
void NImageViewTest::Start()
{
	auto actor=GetNActor();
	auto testcomp=actor->AddComponent<NButtonTest>();
	auto has=actor->HasComponent<NButtonTest>(testcomp);
	if (has)
	{
        actor->RemoveComponent< NButtonTest>(testcomp);
    }
}

置Actor同级索引

uint32 GetSiblingIndex();
void SetAsFirstSibling();
void SetAsLastSibling();
void SetSiblingIndex(uint32 index);

参数:

参数说明
index索引值

描述:通过上述接口设置控件在兄弟节点之间的排序,一般只有对UI控件设置索引有效果,会影响UI的渲染顺序,渲染效果就是后渲染的会遮挡前渲染的UI.

代码示例:

cpp
void NImageViewTest::Start()
{
    auto actor=GetNActor();
    actor->SetAsFirstSibling();
    actor->SetAsLastSibling();
    actor->SetSiblingIndex(5);
}

克隆一个控件

NActorPtr CloneActor() const;

描述:通过上述接口可以克隆一个和原始控件一模一样的新控件,这个接口在重复创建多个相同控件时经常使用。

代码示例:

cpp
void NImageViewTest::Start()
{
    auto actor=GetNActor();
    auto newActor=actor->CloneActor();
    newActor->SetName("cloneActor");
    newActor->SetParent(actor->GetParent());
}