見出し画像

Unityでは起きないのにclusterでは起きるバグを解決しよう!

こんにちは。VR-TRPGクリエイターの逆凪と申します。
今回は、clusterでのゲームワールド制作で何度も悩まされてきたcluster特有のバグの対処法について解説していこうと思います!

cluster特有のバグとは?

今回扱うのは「Unityでは問題なく動作しているのに、clusterで(特に複数人で)遊ぶと”起きてしまう事がある”」バグです。

このバグの厄介な所はUnity・clusterで一人で遊んでいるとバグが発生しないのに、clusterで複数人で遊ぶとたまに起きるという点です。デバッグには複数人が必要になり、またしっかりバグが直っているのか偶然バグが発生しなかったのかも分からないんですね。

ゲームができたから友達を呼んで遊ぼうとしたら、進行不能バグによって雰囲気が地獄になることもよくありました。そんな悲劇を防ぐ為にもこの記事で私が見つけた事例を3つ紹介しましょう。

1.grabbableItemが原点にワープしている!

【使用Component】
grabbableItem・SetGameObjectActiveGimmick

【事例】
非ActiveにしていたgrabbableItemを表示しようと、ボタンを押したが何故かそのgrabbableItemが原点にある・表示されていない!というケースです。

【簡易解説】
以下のように親子関係を組めばOKです。
親(Active):grabbableItem
子(非Active):Collider・SetGameObjectActiveGimmick
(※)MeshRendererは状況に合わせて親か子に。

【詳説】
これはSetGameObjectActiveGimmickがgrabbableItemと 同じ or 親 のオブジェクトについている事で起こるバグです。順を追って解決していきましょう。

▲まず、掴めるようにしたいオブジェクトに適当なコライダーとSetGameObjectActiveGimmickをつけます。そして非表示にするのもお忘れなく。
▲そしてHierarchyでオブジェクトを右クリック。「Create Empty Parent」を押します。
▲アイテムの親にEmptyが追加されましたね。このEmptyに対してgrabbableItemをつけましょう。その後Rigidbodyの設定を弄る事もお忘れなく。これでバグ対策は完了です。

元々あるアイテムを途中で掴めるようにしたい場合は以下の記事の「おまけ」を参考にしてください!

clusterの内部構造を熟知してる訳ではない一介のクリエイターなのでふわっとした説明ですが、grabbableItemがActiveになる際、grabbableItemは一旦原点にスポーンしてからUnity上で指定された座標にワープする仕様なのですが、高負荷環境だとこのワープがうまくいかない事がある、というのがこのバグの原因のようです。

2.Timelineが動かない!

【使用Component】
PlayTimelineGimmick・SetGameObjectActiveGimmick・PlayableDirector

【事例】
オブジェクトをSetGameObjectActiveGimmickでActiveにし、同時にPlayTimelineGimmickでそのオブジェクトに関連するTimelineを再生しようとしたらTimelineが流れないというケースです。

【簡易解説】
1.SetGameObjectActiveGimmickの数秒後にPlayTimelineGimmickが動くようにする

2.PlayableDirector(PlayTimelineGimmick)がついたオブジェクトをSetGameObjectActiveGimmickがついたオブジェクトの子から外す

【詳説】
SetGameObjectActiveGimmickがPlayableDirectorと 同じor親 のオブジェクトについている事で起こるバグです。

基本的にTimelineはTimeline管理の為のオブジェクトを作成すると良いのですが、ClusterGAMEJAMなどで共同制作をしていて各々が別のパートを担当している場合にこの事故が起こる事があるので注意しましょう。

また、この時PlayableDirectorのPlayOnAwake(※)にチェックがついているとUnity上でもバグるので外してPlayTimelineGimmickで管理するようにしましょう。(※チェックするとオブジェクトがActiveになった時に自動でTimelineを再生するはずですが、Timelineが上手く再生されないケースがありました。)

恐らくSetGameObjectActiveGimmickとPlayTimelineGImmickが同時に発動するようにトリガーを組んだにも関わらず、高負荷によってPlayTimelineGimmickを動かすトリガーが先行したのが原因だと思います。そうするとPlayTimelineGimmickが発動するタイミングでそのオブジェクトが非Activeになっている為に、PlayTimelineGimmickが効果を発揮しないんですね。大変だぁ。

3.何故か分からないけどギミックが動かない!

【事例】
1と2のような状況ではないが、何故かclusterで複数人プレイの時にギミックが動かないケースです。

【簡易解説】
トリガー・ギミックのKeyの文字数を少なくしましょう。
(10文字以下だったら確実に大丈夫だと思います。20文字超えると多分やばいです。)

4.それでもダメだったら…?

新たな「clusterで複数人で遊んでいるとたまに起きるバグ」かもしれませんし、cluster側に問題がある「Unityでは動くのにclusterでは動かないバグ」かもしれません。フレンドに聞いてみるか別の実装方法を取るか諦めて寝ましょう。

実際ClusterGAMEJAM2022inAUTUMNの一週間前、grabbebleItemにつけたOnVelocityChangedItemTriggerがUnityでは動いたのにclusterでは動きませんでした。そして翌週のアップデートでサイレント修正されていた事をハスさんに教えて貰いました。

マルチプレイストーリーゲームにおける身体性を伴った協力ギミックの研究をして、Unity上で動作確認をして気持ちよくなっていた時に、clusterバグとサイレント修正で2回殴られたので目がグルグルでしたね。

終わりに

clusterのチュートリアルガイドはとても親切ですが、こういった変なバグの対処法・特定のコンポーネントが使えなくなっている事は教えてくれないので何か見つけたら知見を共有すると良いのかなと思います。

この記事が気に入ったらサポートをしてみませんか?