見出し画像

ClusterGAMEJAM 個人的振り返り

ClusterGAMEJAM 2020 in WINTER に参加して こういうもの を作ったので、何をしたか・どうしてそうなったか・どうしたかったか等を書いていきます。(今回は完全に個人のやつなのでトバしていきます)

アイデア出し

テーマが「溢れるエナジー」と聞いて、アイデアメモとしてまず最初に書いたのが「チャージからの オーバーキル」でした。実際に書いたことを上からそのまま載せるとこうなります↓

チャージからの オーバーキル
ターゲット <- 複数の固定砲台
連爆?
操縦桿? 複数人で操作したい
エナジー係、発射がかり

集めて入れて撃つ

完成です!!!

この時点で 「テーマに沿っていて、ゲームになり、まあまあ面白そう」 という自信があったので作り始めても良かったのですが、 前回のGAMEJAM では「大喜利ツイートを作る」というテーマがそれなりに被って少し悔しかったため、もう少し発想を広げる時間をあえて作ることにしました。

そこで出たアイデアはいくつかあり、
・玉入れ
・雪玉を転がして大きくする
・一定時間早くなるレース的なの
・列車に乗ってて燃料を入れていく
・発電所をつないでいく
・ビールを発射
・温泉で人があふれる街づくり
・我々が溢れる (ワールドが小さくなる)
などがありました。(実際に他のチームで使われてるアイデアも結構ありますね)

これらのアイデアは感覚的には面白そうなのですが、最初の案ほどはゲームとして上手く落とし込むことができませんでした。そのため、これらの"感覚的に面白そう"を言語化して、最初の案のテーマとして組み込めないかを考えてみました。 (この時点では、発電所にエナジーをぶつけるという案でした)

言語化する過程を言語化するのは難しいので結果だけを書くと、
・溢れるのは主体的な行動から
・それは目立つ必要がある
・面白い結果を引き起こす

となりました。(もちろんこれは自分の感じた"面白そう"の説明なので、他の人にそのまま適用できるものではありません)

そこで、溢れると嬉しいものを考えたところ、( お金 の次に) プレゼント が思いついたので、(プレゼントを使った他のゲームがないか考えた後、) プレゼントをぶつけて溢れさせるゲームを作ることに決定しました。

クリスマスも近いので、今年は手渡しがしづらいサンタの代わりに遠くから街にプレゼントを送るというテーマも密かに含まれています。(的になるプレゼントボックスは街並みをイメージしています。伝えようとはしていませんが)

謎のエナジーを謎の発電所に発射するゲームよりも、プレゼントを街に発射するゲームの方が直感的で面白いと思うのではないでしょうか。

ただ、ワールドのタイトルはもうちょっといいのが思いつきたかったなーと心残りです。ちなみにEXにはExceedとExplodeの2つの意味がかかっています。

製作

今回は特に事前準備をして居なかったので、リポジトリとプロジェクトを作るところからスタートするのですが、なんと今回からは テンプレートプロジェクト をForkする ことで両方が一気に完了するのです!テンプレート偉大過ぎる。

ぬいぐるみは投げた瞬間に自分に当たることがあったので、手を離してから0.3秒間はコライダーを消しています。
また、いろんなぬいぐるみを使う方が楽しいので、再出現まで少し時間を空けるようにしました(複数人で遊ぶ時のコンフリクトを避けるためというのもある)。

プレゼントボックスはテープが溜まっていく表現をするために、アセットをUV展開してシェーダを書きました。これだけで結構満足感があった。

大砲横のプレゼントボックスは、他のアイテムからこの値を使うことが分かっていたので、最初から値をGlobalとして作りました。

大砲の制御システムは昔作っていたボツワールドからの使い回しです。照準を向くAimConstraintを設定したGameObjectを作り、土台にはそれのY回転のみ使うRotationConstraintを、本体にはXYZのRotationConstraintを、照準にはAimConstraintの子オブジェクトに対するPositionConstraintと、中心に向かうAimConstraintを設定しています。

弾は毎回同じ飛び方をするのが気になったため、飛ぶ瞬間に3通りのAddInstantTorqueGimmickから1つをランダムに適用し、さらにSpawnPointをアニメーションで回しています (生成される向きがランダムに見えるようになる) 。

プレゼントが溢れるギミックは、
・溜まり方が1~10の10通り (この時は。バランス調整して最終的には6までになった)
・チームが2通り
・飛ぶ方向が4つ
あるので、なんとCreateItemGimmickを80個必要としました。さすがに手でつけるのは現実的でないのでEditorスクリプトを書いています。(ちゃんとやるのは面倒だったので、Creator Kit内のプロパティを手元でだけpublicにして実行しました)
また、溜まり方をfloatの0.1~1.0で管理していたのですが、計算誤差で上手く動かない場合があることが発覚したのでintの1~10に途中から書き直したりもしました。

もろもろの演出で使っているプニョンってなるアニメーションはテンプレートプロジェクトのものなのですが、そのまま使うとちょっと極端だったため、AnimatorのTransition Offsetを設定して先頭を少しオミットしています。汎用的な演出って便利ですね。 (本当は大砲はもう少し重厚な演出にしたかったが諦め)

タイムアタックの数値表示は実は2種類のハイブリッドで作られています。初期状態およびゲーム中はタイムラインで (0~9のGameObjectを予め用意して、それのアクティブ状態を切り替えるアニメーションをループさせる) 、結果表示はSetTextGimmick (Signalの引き算) でやっています。100分を超えるとタイムラインは止まるが結果表示はできる状態になると思うので誰か試してください。

ゲームデザイン

このゲームには、「連鎖を起こすことが出来るが、準備中に横取りされるかもしれない」というジレンマが含まれています。ゲーム性にジレンマはつきものなのですが、今回の場合プレイヤーがこれを解決するために「連鎖を組まない」という劣化戦略を行ってしまう可能性があります。これを解決するスマートな方法を20時間ぐらい考えていたのですが結局思いつかず……
最終的にはタイムアタックモードを追加することによって妥協しました。
また、照準で狙うのが難しいのもこれに由来しています (難しくしたいのではなく難しくせざるを得なかった) 。とはいえもうちょっと当てやすく調整できたら良かったですね。

また、途中で負けが確定してしまうのもなんとかしたかったことの1つです。最後の最後まで逆転の可能性があるのは(クリエイターにとってもユーザーにとっても)難しいことがあるので、加速度的なゲーム進行にするというのも1つの手です(分配によって連鎖のタネは貯まるが、それ以上に狙いづらくなる方が大きくなってしまった)。

今回はゲームの説明を兼ねた仕組みや演出を多く行うことができました (まあ少ないリソースでゲームを完成させるためでもあるのですが)。
最初の取っ掛かりは「ぬいぐるみをプレゼントボックスに入れる」という現実的で分かりやすい動作から始まります。ここでプレイヤーは「箱にものを当てるとテープのゲージが貯まる」ということを覚えます
テープが溜まりきるとぬいぐるみもプレゼントボックスも触る意味がなくなるため、大砲を扱うように誘導されます。ここでプレゼントボックスにプレゼントが当たるという、このゲーム固有の現象が起こるのですが、先程プレイヤーは「箱にものを当てるとテープのゲージが貯まる」ということを(繰り返し)学習したため、何が起こるかを容易に理解できると思います。
プレゼントボックスが満杯になると、小さなプレゼントが高く打ち上がります。これは一番目立ち・長く・楽しい演出なので、全プレイヤーにとって目指す目標になっています。(この演出は必須なので、満杯になるときには必ず発生するように、実は余った個数+1のプレゼントが配られます。)

攻略のTips

連鎖を利用しましょう!(それはそう)
前述のように連鎖を準備することはリスクがあるのですが、一箇所に5個貯める→6個のプレゼントをぶつけるという、一番シンプルな連鎖は十分実用的です。途中で照準を動かす必要がなく、これだけ最大5つ満杯にできてリターンも大きいです。
いろんな連鎖の動画も上げたのでぜひ見てください。

確かに狙いをつけるのは難しいのですが、プレゼントをぬいぐるみ1つから飛ばすことで簡単に弾道予測が可能です (演出的には飛ばすプレゼントの大きさを変えたかったがこの理由でやらなかった)。
また、手前の列は自分からは狙いやすく相手からは狙いづらいので、後回しにするのも有効です。

おまけ

おまけ

(カメラに映らないレイヤーになってしまったおまけパネル)

こういう問題です↓
- 4行4列(16個)のプレゼントボックスをすべて満杯にしたい
- いずれかのボックスに1個~6個のぬいぐるみを追加するという操作を繰り返し行える
- プレゼントボックスは6個のぬいぐるみが溜まった時点で満杯になり、周囲4近傍に余剰分+1個のぬいぐるみをそれぞれ追加する
  - 例えば、5まで溜まっているボックスに4つのぬいぐるみを追加すると5+4-6+1=4個のプレゼントを上下左右それぞれに追加する。
  - すでに満杯のボックスにぬいぐるみが追加されても何も起こらない。
  - この分配は幅優先的に行われる (上下左右全てに配り終えてから連鎖を考える)。上下左右の順番は実際は複雑だが、とりあえず任意の順番として良い。
- 必要なぬいぐるみは最小でいくつか?
  - 例えば、以下の手順により43個で十分である。

(1,2)に5個 →
(1,2)に6個 (周囲に6個ずつ配られ、(1,1), (1,3), (2,2)も満杯になる) →
(2,4)に5個 →
(2,4)に6個 ((1,4), (2,3), (3,4)も満杯になる) →
(3,1)に5個 →
(3,1)に6個 ((2,1), (3,2), (4,1)も) →
(4,3)に5個 →
(4,3)に5個 (残りのボックスはすべて1つ以上溜まっているので最後は5個で十分)

対戦よろしくお願いします。

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