蚊蹴るワールド作った話~Clusterで得点集計する方法と無限POPの確実なdestroy~ #ClusterGAMEJAM
やほほーい。せぃが君です。(*´▽`*)
いわゆるVtuber活動をしています。
clusterさんの公式企画 #ClusterGAMEJAM に参加しました。48時間でお題に沿ったワールドを制作RTAするというものです。
clusterさんのワールドは、イベント用の静的ワールドしか作ったことがなかったんだけど、面白そうだったので、せっかくだし参加することにしました。
企画開催と同時に発表されたテーマは「かける」。
このテーマにかすっていれば何でも可という、懐の深いお題でした。
「駆ける」と解釈してのタイムアタックとか、「(水を)かける」でお花の育成を促すゲームとか、色々考えたんですけど、結果的につくったのはこんなゲーム。
専用の蹴り蹴り棒を使い、大量発生する巨大な蚊たちを蚊取り線香に蹴り込む対戦ゲーム「蚊蹴る」です。°˖☆◝(⁰▿⁰)◜☆˖°
プレイ中は、ユーザの移動スピードがアップして、スピード感のある対戦が楽しめます。最大3on3。でも、結構自ら蚊取り線香にダイブする蚊たちがいるので、割とソロも楽しいです。
実際のプレイはこんなかんじ。
以下は、制作するうえで大変だったところなど。
得点システムの構築
蚊を蚊取り線香に蹴り込んだら、得点を集計したいんですけど、Cluster Creator Kitで得点システムを構築するのが意外に難しかったです。
具体的には、蚊取り線香にOn Collide Item Triggerをセットして、蚊に対してgoalのシグナルを送ります(ちなみに蹴り蹴り棒からはhitのシグナルを受け取り、Add Instant Force Item Gimmickさせてます)。
goalのシグナルを受け取った蚊は、それをトリガーにdestroyしたり得点計算したりしないといけないんですけど、Item LogicはGlobalに値を渡せない!
どうすべと思いました。
結果、考案したのはこちら。
得点計算用の秘密のエリアを、ワールド内に設けました。
create Item Gimmickは、targetにthisを取れるので、ここから得点計算用のGameObjectを計算エリアに生成します。その生成をOn Create Item Triggerで受け取り、ここからGlobalにアクセスするというものです。
生み出されたGameObjectは、計算エリアの床に接触することでOn Collide Item Triggerを発火させ、速やかにdestroyします。
この方法がどれだけ一般的かはわかりませんが、48時間の中で思いついたにはしては上出来かなと思います。
コピー元の蚊だけを生存させ、クローンだけをdestroyさせる
・親も一緒に死んでしまう問題
得点源となる蚊は、ゴールを決めると追加で生成され、また時間と共にどんどん増殖していきます。
試合終了後、蚊を確実にdestroyしないと、どんどん増殖して、あっという間に処理がオーバーフローしてしまうことが予想できました。
そのため、試合終了と共にGlobalシグナルを飛ばして、蚊を一斉に自死させるのですが、ここで問題が発生します。
コピー元の蚊は、プレハブではなくワールド内のGameObjectとして置いていたので、同じワールド内にいるため、当然同じGlobalシグナルでdestroyが発火し、コピー元の蚊まで一緒に死んでしまうんです。
結果、二回目以降、create Item Gimmickの参照先がなくなってしまい、クローン処理できないという問題が発生しました。
・プレハブではAdd Instant Force Item Gimmickの参照先が取れない問題
この問題は、create Item Gimmickの参照先をプレハブにすれば解決するんですが、今度は別の問題が発生しました。
上述したように、蚊は蹴り蹴り棒と接触した時にhitのシグナルを受け取り、Add Instant Force Item Gimmickで瞬間的な力を与えています。
この力の方向は蹴り蹴り棒から見て正面に設定してあります。
この「蹴り蹴り棒から正面」を受け取るために、Add Instant Force Item Gimmickはヒエラルキー内に存在する蹴り蹴り棒Objectの参照を持っている必要がありました。
この「ヒエラルキー内に存在する蹴り蹴り棒Objectの参照」が、蚊のコピー元をプレハブ化した場合、うまく設定できなかったのです。
(もしかして方法あるかもしれませんが、48時間では思いつきませんでした)
・最初に生成された蚊にだけ親フラグを立てる
色々ややこしく書きましたが、要は「ワールド内にコピー元も存在するけど、コピー元だけはdestroyしない仕組み」が必要でした。
具体的な方法としては、On Create Item Triggerで蚊の生成を検知し、一番最初に生成された=ワールド内に初期配置された蚊だけに親フラグを立てるようにしました。
一個ミスすると全く動作しなくなるので、ちょっと怖い解決方法なのですが、入念にテストプレイしてなんとか挙動を担保しました。
・ワールド再アップロード時のインスタンスのリロード問題
48時間の中でできたのは、ここまでだったのですが、今はこの親フラグ方式は採用していません。
というのは、レアケースですが、この方法がうまく挙動しないパターンを発見したからです。
それは公開済みワールドでユーザが遊んでいる状態で、ワールドの再アップロードをかけた時です。
ワールドにアプデをかけてアップロードし直した時、リアルタイムでそのワールドで遊んでいるユーザがいた場合、どうやらClusterでは、稼働中のワールドインスタンスにも、シームレスにアプデ内容を反映しているみたいなんですよね。(いわゆるホットデプロイみたいなかんじ)
たとえば、無音だったワールドに音楽をつけてアプデすると、無音ワールドインスタンスで遊んでいたユーザは、ある瞬間から急に音楽が流れ始める状態を体験することになります。
めっちゃすごい仕組みだなと感動してしまったんですが、このシームレスにアプデ内容を反映されるタイミングで、インスタンスの再構成を行っているようで、この時親フラグの挙動がバグってしまうみたいなんです。
結果、誰も親フラグを立てていない状態が爆誕→親も含め全員destroy→次の試合からクローン処理ができなくなってしまいます。
・困った時はOn Collide Item Trigger
考えた結果、親フラグ方式よりいい方法を思いつきました。
それは、試合終了時、試合エリアと同サイズのCubeをActiveにさせて、そのCubeと蚊たちを接触させることでOn Collide Item Triggerを受け取り、蚊にdestroyしてもらうことです。
これなら確実に蚊を滅することができますし、コピー元となる親蚊は離れた位置にあるので、確実に無事です。
もう、どうしてこの方法を最初から思いつかなかったのか…。🙃
時間との戦いの中で、多分視野が狭くなってたんでしょうね~。
「困った時はOn Collide Item Trigger」と心に刻みました。
プレハブを巡る、Noneのはずなのに参照名が残る現象
あと、これは単純に「詰まった報告」なんですが、Create Item Gimmickで詰まった時のことも備忘に残しておきます。
Create Item Gimmickで参照先のItemを削除すると、参照が外れてNoneになると思うんですが、「一見参照されているようで、実は参照されていない」というケースに出会いました。
この状況の再現方法は、次のようなかんじです。
Itemをプレハブ化
Create Item Gimmickで、Assets側ではなくヒエラルキー側のプレハブを参照
Assetsのプレハブを削除
ヒエラルキー上のItemをUnPack
こうすると、Create Item Gimmickコンポーネント上では参照先のオブジェクト名が表示されたままになり、一見参照されているように見えます。
が、実際にはNone状態になっており、参照先のオブジェクト名をダブルクリックして参照先にフォーカスさせようとしても、どこにもフォーカスされません。
この状態でプレビューすると、Create Item Gimmickが発火した段階でエラーが発生し、以降の処理が全部止まってしまいます。
解決方法は、単純にもう一度UnPackしたGameObjectを参照し直すだけです。
いや~、これは詰まりました。(ノ▽`*)
コンポーネントを一個一個消して検証してやっと気づきました。
CCK×プレハブ周りの挙動は、ちょっと鬼門ですね。
(Create Item Gimmickにヒエラルキー上のGameObjectを設定する方が珍しいと思うので、僕が勝手にトリッキーなやり方をしているだけだとは思いますけど。
さいごに
そんなかんじです!
48時間の制限時間の中、初めてのゲームワールドにしては、よく考えて作ったのでは~?と、個人的には自画自賛しております。(*´▽`*)
得点システム、無限POPのGameObjectの片づけ方は結構みんな詰まるところだと思うので、ご参考になれば幸いです。
・素晴らしき蚊蹴るナカーマたち
ちなみに、「ふはは~!まさか蚊蹴るの発想をしたひとは僕以外におるまい!」と思って鼻歌まじりだったんですが、蓋を開けてみたら僕と同じ「かける=蚊蹴る」の発想をしたひとが二人もいらっしゃって、世界の広さを痛感しました。(ノ▽`*)
せっかくなので、蚊蹴るナカーマということで、そちらのワールドもご紹介しておきます。
同じ「蚊蹴る」発想ですが、それぞれ方向性は全然違うので、どれも素敵なワールドを楽しめると思います!
↑微かな羽音を頼りに、小さな蚊を探してゴールに追いやれ!新感覚サッ蚊ー
↑落ち着いた雰囲気の夜の公園で、優雅に空を飛ぶ蚊を眺めながら、チルな時間を
記事を良き!と思った時に、BOOTHのブーストみたいに投げ銭できるみたい。いただいたサポートは、VTuber活動資金として大切に使わせていただきます。