关于Acotor的根组件和附加组件
根节点
Actor 默认有DefaultSceneRoot
创建3个静态网格体
FirstMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("FirstMesh"));
SecondMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("SecondMesh"));
ThirdMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ThirdMesh"));
编译后第一个网格体成为了根组件,后面的网格体默认附加到根组件上,因为只能有一个根组件。
这个时候指定第二个网格体为根组件:
RootComponent = SecondMesh;
// 使用下面方法也可以设置根节点
// SetRootComponent(SecondMesh);
编译后:
SetupAttachment
可以使用SetupAttachment将一个组件附加到另一个组件上
/**
* 初始化注册组件时要附加的所需的Attach Parent和SocketName。
* 通常打算从其所属Actor的构造函数中调用,
* 并且在未注册组件时,应优先于AttachToComponent进行调用
* @param InParent 依附到的父组件
* @param InSocketName 要附加到父项上的可选套接字,默认NAME_None
*/
void SetupAttachment(USceneComponent* InParent, FName InSocketName = NAME_None);
例如:
ThirdMesh->SetupAttachment(SecondMesh);
编译后:
AttachToComponent
/**
* 初始化注册组件时要附加的所需的Attach Parent和SocketName。
* 通常打算从其所属Actor的构造函数中调用,
* 并且在未注册组件时,应优先于AttachToComponent进行调用
* @param Parent 依附到的父组件
* @param AttachmentRules 附加方式
* @param SocketName 要附加到父项上的可选套接字,默认NAME_None
*/
void AActor::AttachToComponent(USceneComponent* Parent, const FAttachmentTransformRules& AttachmentRules, FName SocketName)
FAttachmentTransformRules:
- KeepRelativeTransform(保持两个物体之间的相对位置不变)
- KeepWorldTransform(保持连个物体在世界的位置不变)
- SnapToTargetNotIncludingScale(保持物体的缩放对齐到目标上)
- SnapToTargetIncludingScale(随目标的缩放)
例如:
ThirdMesh->AttachToComponent(SecondMesh, FAttachmentTransformRules::KeepRelativeTransform);
编译后也可以达到同样的结果
SetupAttachment 和 AttachToComponent的区别,可以参考这篇文章