こんにちは!
最近、Clusterで川下りをテーマにしたワールド「桜River Story」を公開しました。
穏やかな川の流れに身を任せ、幻想的な景色を楽しむ癒しのクルーズへようこそ。✨ 季節を変える魔法 ✨中華エリアで光る花びら…
このワールドは穏やかな川の流れに身を任せるクルージング体験が目玉なのですが、開発過程で「同期ズレ」という興味深い技術的課題に直面しました。今回はその経験をシェアしたいと思います。
同期ずれ問題との遭遇
ワールドを公開した後、フレンドが遊んでいるところに私も参加してみました。すると奇妙な現象が発生したのです。
船はすでに動いていましたが、なぜか船の上にいるはずのフレンドの姿が見えません。しかし、会話はできており、フレンドの声は確かに船の上から聞こえてくるのです。これが「同期ずれ」の問題でした。
船自体はお互いに見えていても、実際のプレイヤーの位置が異なっていたのです。
興味深いことに、船の中の椅子に座ると、なぜかお互いが見えるようになりました。
前提条件
この記事は、Unity環境におけるCinemachineとアニメーションシステムについてある程度の知識をお持ちの方を対象としています。AnimatorController、Timeline、PlayableDirectorなどの基本的な概念や使い方を理解していることを前提としています。Cluster CreatorKitの基本的な仕組みに慣れていると、より内容を理解しやすいでしょう。
技術的な原因と詳細
調査の結果、問題の原因がわかりました。船の動かし方に2つの方法があり、それぞれに長所と短所がありました:
1. Cinemachine + アニメーションでの実装(技術詳細)
上記の画像は、AnimatorControllerの設定例。Speedが、一定の数値を超えたら次に遷移するようにしています。
この方法では、AnimatorControllerを使用して船のTransformを時間経過とともに変化させていました。
技術的には:
- AnimatorControllerで船の移動パスをAnimationClipとして定義
- 再生速度をAnimatorのパラメータ(speed)で制御
- Cinemachineのバーチャルカメラが船を追従
問題点:
- Cluster環境ではAnimatorの同期に制限があり、後から入室したプレイヤーのAnimator状態が既存プレイヤーと一致しない
- 結果として、見た目上は同じ船に乗っているように見えても、内部的な位置情報が異なるため、お互いのプレイヤーアバターが見えなくなる
- 椅子に座ると見えるようになる現象は、(おそらく)座席がプレイヤーの位置を強制的に固定するため
これはClusterの公式ドキュメントでも言及されています:
「入室タイミングやAnimatorControllerの遷移の書き方によって、再生位置や再生中のAnimationStateが一致しない場合があります。」
引用:クラスタ公式ドキュメント
2. Timeline + Cinemachineでの実装(技術詳細)
この方法では、PlayableDirecorとTimelineを使用して船の動きを制御していました:
- Timelineのアニメーショントラックで船のTransform変化を定義
- PlayableDirectorがTimelineを実行し、(おそらく)サーバー側で同期
- Cinemachineは船のTransformをFollowするが、カメラのpositionを直接制御
- ディスクトップ、スマホの場合、カメラの視点は船に固定されない。
その結果、カメラを置いた瞬間に船が動き撮影困難に(VRだと問題ないかも)
利点:
- Timelineはサーバー同期されるため、後から入室したプレイヤーも同じ状態を共有できる
- 船の位置情報が全プレイヤーで一致するため同期ずれが発生しない
問題点:
- TimelineはCinemachineのカメラ制御とうまく連携せず、特にデスクトップやスマホではカメラが船と完全に同期しない
- 結果として自由視点での撮影が困難になる
解決策:二つのモードの実装
これらの技術的制約を踏まえ、2つの走行モードを実装することで対応しました:
- Standard RUN Mode(タイムライン使用)
- PlayableDirectorとTimelineを使用
- 全員が同期して同じ船の位置情報を共有
- 同期問題が発生しない安定したモード
- VRでの体験を優先し、カメラワークは固定的
- Advanced RUN Mode(アニメーション使用)
- AnimatorControllerを使用し、パラメータでアニメーション制御
- 船を任意のタイミングで一時停止させることが可能
- アバター同期の問題はあるが、自由度の高い撮影が可能
教訓と技術的考察
この開発で学んだ技術的な教訓としては:
- マルチプレイVR空間での同期の難しさ
- リアルタイムの位置同期とアニメーション同期は完全ではない
- 特にAnimatorControllerの状態は後から参加したユーザーと完全に同期しない
- TimelineとAnimatorの使い分け
- 全員で同じ体験を共有する必要がある場合はTimelineが優位
- 自由度やインタラクティブ性が必要な場合はAnimatorが優位
- 両方の技術を状況に応じて使い分けることで最適な体験を提供できる
- 座席の活用
- 座席がプレイヤーの位置を強制的に固定することで同期問題を部分的に解決
- これは「hack」的な対応だが、実用的な解決策として機能する
このような技術的な知識と工夫により、Cluster上での動的なワールド制作における同期問題になんとか対処することができました!
まとめ
VRプラットフォームでの動的なオブジェクトを含むワールド開発では、同期の問題は避けて通れない課題です。
完全な解決策はないものの、プラットフォームの特性を理解し、複数のアプローチを組み合わせることで、解消することは可能です。
皆さんもぜひ「桜River Story」に遊びに来てください。冬の景色から春の桜へと変化する幻想的な川下り体験をお楽しみいただけます!
穏やかな川の流れに身を任せ、幻想的な景色を楽しむ癒しのクルーズへようこそ。✨ 季節を変える魔法 ✨中華エリアで光る花びら…
参考記事
今回のワールドを作る際に参考になった記事を紹介します!
ライド系のワールド作るのに非常に役立ちます!
おうちにいながら遊園地でよくあるようなライド・アトラクションに乗れたら楽しいですよね!待ち時間もないし!ということでバー…