Skeleton Follower Component というコンポーネントを使うと、 Spine のアニメーションに追随してゲーム内の他の物を動かしたりできる。 ただ、公式のドキュメントには具体的な設定方法が書いてなかったので、すこし補足します。
SpineBoneFollower というコンポーネントを追加する。
Bone Name に追跡したいボーンの名前を指定する。 また、Use Component Transform をチェックする。
BeginPlay などのイベントを使って、Target に Spine アニメーションを含むアクター自身を指定する。
追随したいコンポーネントを SpineBoneFollower の子に追加する。
実際の Spine ランタイムのコードでは次のように記述されている。 ここから分かるように、Target と UseComponentTransform の有無で動作が決まるようになっている。
void USpineBoneFollowerComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) {
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (Target) {
USpineSkeletonComponent *skeleton = static_cast<USpineSkeletonComponent *>(Target->GetComponentByClass(USpineSkeletonComponent::StaticClass()));
if (skeleton) {
FTransform transform = skeleton->GetBoneWorldTransform(BoneName);
if (UseComponentTransform) {
if (UsePosition) SetWorldLocation(transform.GetLocation());
if (UseRotation) SetWorldRotation(transform.GetRotation());
if (UseScale) SetWorldScale3D(transform.GetScale3D());
} else {
AActor *owner = GetOwner();
if (owner) {
if (UsePosition) owner->SetActorLocation(transform.GetLocation());
if (UseRotation) owner->SetActorRotation(transform.GetRotation());
if (UseScale) owner->SetActorScale3D(transform.GetScale3D());
}
}
}
}
}