Torus Solutions 改

Skeleton Follower Component (SpineBoneFollower) の使い方

Skeleton Follower Component というコンポーネントを使うと、 Spine のアニメーションに追随してゲーム内の他の物を動かしたりできる。 ただ、公式のドキュメントには具体的な設定方法が書いてなかったので、すこし補足します。

image

SpineBoneFollower というコンポーネントを追加する。

image

Bone Name に追跡したいボーンの名前を指定する。 また、Use Component Transform をチェックする。

image

BeginPlay などのイベントを使って、Target に Spine アニメーションを含むアクター自身を指定する。

image

追随したいコンポーネントを 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());
                }
            }
        }
    }
}