🏃

【visionOS】複数のアニメーションを再生する

2024/06/13に公開

はじめに

今回は複数のアニメーションを切り替える方法を紹介します。
例として、歩くアニメーションと倒れるアニメーションを切り替えて再生するプロセスを説明します。

つくったもの

環境

  1. Xcode Version 15.3
  2. visionOS 1.1

アニメーションのロード

USDファイルからアニメーションをロードするには2つの方法があります。

  1. クリップごとにUSDファイルを用意し、各USDをEntityとしてロードする方法
  2. 同じタイムラインで単一のUSDにそれらを配置し、AnimationViewを使用して複数のクリップにスライスする方法

今回は1つ目の「各USDをEntityとしてロードする方法」を採用しました。

USDファイルを用意

まずは、2つのアニメーションをUSDZファイルとして用意します。
【USDZ】AIを使ってモデリングするで行ったように「歩くアニメーション」と「倒れるアニメーション」を作成しました。

歩く 倒れる

各USDZをEntityとしてロード

作成したUSDZファイルをEntityとしてロードし、それらをAnimationResourceとして取得します。
リソースはスケルトンのジョイント名がアニメーションと一致していればどのエンティティでも再生できるようです。

変数にAnimationResource型の配列を定義し、倒れるアニメーションのEntityをloadしてイニシャライザで格納します。

class Enemy {
    var animationResource: [AnimationResource] = []
    private var die = try! Entity.loadModel(named: "DyingOni")
    
    init() {
        // 撃退のときのアニメーションをAnimationResouceに追加
        animationResource.append(die.availableAnimations[0])
    }
}

歩くアニメーションの再生

鬼を生成する時に歩くアニメーションを再生します。

func generateOni() -> Entity? {
    // テンプレートがないときは作成
    if oniTemplate == nil {
        if let oni = try? Entity.loadModel(named: "WalkingOni") {
            oniTemplate = oni
        }
    }

    guard let oniTemplate = oniTemplate else {
        fatalError("Oni template is nil.")
    }

    // テンプレートからクローン生成する
    let oni = oniTemplate.clone(recursive: true)Collision追加などの処理)

    if let animation = oni.availableAnimations.first {
        oni.playAnimation(animation.repeat())
    } else { return nil }

    return oni
}

倒れるアニメーションに切り替える

弾と鬼の衝突をトリガーに倒れるアニメーションに切り替えます。

// 霊弾と鬼が衝突したら霊弾と鬼両方を消す
if collisionEvent.entityA.name == "SoulBullet" && collisionEvent.entityB.name == "Oni" {
    collisionEvent.entityA.removeFromParent()

    guard let oni = collisionEvent.entityB.parent else { return }

    (鬼のスピードを止めたり撃退のサウンドを再生する)

    // 撃退のアニメーションを再生する
    oni.playAnimation(enemy.animationResource[1])

    Task {
        try await Task.sleep(for: .seconds(3))
        oni.removeFromParent()
    }
}

おわりに

以上、「複数のアニメーションを再生する」でした。
FBXなどを使用する場合、Animator Controllerでアニメーションをコントロールしますが、この部分のアニメーション制御にはまだ改善の余地があると感じています。Spatial Computingにおいてはアニメーションの再生はほぼ必須であり、この情報が役に立てば幸いです。

また、今回の記事で紹介している空間シューティングゲーム「妖怪バスターZ」を日本発売前の2024年5月3日にリリースしました。
ぜひインストールして遊んでみてください。

https://apps.apple.com/us/app/yokai-buster-z/id6502185713

今後もvisionOSについて発信していきますので、この記事が参考になったと思ったらぜひ♡をお願いします。

参考

https://qiita.com/1-eyeddd/items/5e01bc60261dbe94702d
https://developer.apple.com/videos/play/wwdc2021/10074/

Discussion