ClusterGameJamに参加したのでギミックな話
Clusterゲームジャム2020に参加しました!
テーマはソーシャルということで,みんなで流しそうめんをするゲームを48時間,7人,92コミットで作りました.
テーマに合わせたオリジナルゲームなのでわかりづらいですが,以下が詳細なルールです.
1.プレイヤーは赤チームと青チームに分かれる
2.スタートボタンを押す.
3.プレイヤーは各チームカラーの竹を並べて水流(そうめんの通り道)を作る
4.同時に床が下がり始め,プレイヤーは水流を下につなげていく
5.床が最下層に着くとザルが現れる
6.プレイヤーは各チームカラーのザルをもって水流に乗って流れてくるそうめんを集める.
・そうめんが自チームの竹を通った ら1得点
・そうめんをザルでキャッチした ら5得点
・そうめんに紛れて落ちてくる蕎麦をザルでキャッチした らマイナス10点
7.一定時間後にそうめん投下停止,集計.勝ちチームが決まる
8.上層に戻るとすべてのオブジェクトがリセットされる
さてClusterSDKを使って対戦ゲームを作るためにいくつか工夫をしたので,紹介します.
ClusterSDKの概要
ClusterSDKは,Unity上でClusterで遊べるVRシーンを作成するキットですが,Unityの基本的なコンポーネントのほかにいくつかのオリジナルコンポーネントが使えます.
Interact Item Trigger : オブジェクトをボタンにする
On Collide Item Trigger : オブジェクトの当たり判定をとれる
Create Item Gimmick : アイテムを生成する
Add Instant Force Item Gimmick : オブジェクトに力を加える
などもっとたくさんあります!
が,これらを操作するのに新たに理解しなくてはいけない概念が4つあり
・Trigger
・Gimmick
・Target
・Key
・(Item)
すべての処理の流れはおそらく
TriggerはTargetにKeyを送信しにいく.
GimmickはTargetにKeyを受信しに行く.
のような感じに流れています.
例えば,「ボタンを押すとアイテムが生成される」のような仕組みは
①ボタンにしたいオブジェクトに”Interact Item Trigger”を付ける
②[CreateBlock]などの任意のkeyを設定する
③Targetに任意のオブジェクトを設定する
③Targetのオブジェクトに”Create Item Gimmick”を付ける
④keyを②で決めたもの[CreateBlock]に設定する
⑤”Create Item Gimmick”のItem Templateに生成したいオブジェクトを設定する
で実装可能です....いやぁめんどくさいっ!
お分かりのようにアイテム一つ生成するためだけに最低2個のコンポーネントと4個の設定項目が必要になり,簡単なギミックでも非常に複雑になります...(しかしながら,これらの概念は柔軟性があり複雑なギミックを組もうとしたときに真価を発揮します)
ゲームのフェーズ進行管理
上のゲームではゲーム進行を
・待機フェーズ
・竹並べフェーズ
・そうめん投下フェーズ
・終了フェーズ
みたいなフェーズに分けて考えました.
それぞれに対応するkeyは
・IsWaithingPhase
・IsTakePhase
・IsZaruPhase
・IsEndingPhase
プレイヤーからの入力はゲームの進行上
・スタートボタンを押す(StartGameSignal)
・上層に戻る(EndGameSignal)
の2つです.
"Global Timer"を使用して,key signalのリレーが行えますので,
StartGameSignalを受け取ったらTakePhaseStartを発信
TakePhaseStartを受け取ったら90秒後にTakePhaseEndを発信
TakePhaseEndを受け取ったらZaruPhaseStartを発信
ZaruPhaseStartを受け取ったら90秒後にZaruPhaseEndを発信
これらはシグナルなので"Global Logic"を使用して,
StartGameSignaを受け取ったらIsWaithingPhaseをfalse
TakePhaseStartを受け取ったらIsTakePhaseをtrue
TakePhaseEndを受け取ったらIsTakePhaseをfalse
ZaruPhaseStartを受け取ったらIsZaruPhaseをtrue
ZaruPhaseEndを受け取ったらIsZaruPhaseをfalse
みたいな感じに状態管理しました.
それぞれのIsPhaseを各シーン用オブジェクトの”Set Game Object Active Gimmick”に仕込んだりするとよいです.
得点システム
リセット機構
特殊な部分
共同作業のすすめ
ClusterSDKはGlobalTargetのおかげ○○トリガー着たら特定加算するように得点表作っといて!とかできるので結構よかった.
こころのさけび
GameJam終わった直後のめも
せっかくなので,ClusterSDK触った感想ここにも
・全体的にUnity普段から触ってる人はやりやすいけど,簡単なことやろうとしてもコンポーネント地獄になる印象...
・グローバルトリガーという概念,扱いやすい(共同作業にもよかった,hogehogeのグローバルトリガーで動くようにしといてーみたいな)
・変数保持できるのよい(UIとかに使えるのもよい)
・CreateとかTimerとか,だいたいのギミックがオブジェクト非アクティブでも動いちゃうの不便
・Itemコンポーネントのネストできないの不便(アップロード前に教えてほしかった...)
・非同期のギミックを作りづらい(チームごとに移動制限とかしたかった)
・Unityの機能との親和性低かった(Particleとか,Animation終わった時点でトリガーみたいな需要も...)
・コライダートリガーとか使っているとレイヤーかタグで場合分けしたい場面が多かった
・レイヤー設定をしたい場面も多かった(Grabableオブジェクトに乗れちゃうのが嫌な場面とか)
・Createさせるオブジェクトに,プレハブ外参照持たせたい → ゲーム内に非アクティブで設置して参照? → 非アクティブでもギミック動いてしまう
→ さらに上位のオブジェクトごとプレハブ化? → Itemのネスト構造に引っかかる → つみ
→(グローバル変数でオブジェクト参照できれば解決?)
(バグ?仕様?)
・トリガー(key)の入力中に入力のアクティブ外れること多かった
・Timer系のDurationに0入力した時点で0.01で上書きされるのうざい...
・インタラクト系アイテムに勝手につくアウトラインが高ポリオブジェクトだと重かった...(実装雑っぽい?ポストプロセス段階でやればいいのに)
・未確認だけど,Animatorのレイヤー2つ目とかがうまく動かない?
だいじなの忘れてた!<<エラーがわかりづらい!!>>
item in itemしちゃったときもそのアイテム探さなきゃいけないし,トリガーやキーの状態もデバッグログとかで監視したい
PS.
賞とっちゃったので書き終えなきゃ・・・