Cluster GAMEJAM 2020 in WINTERに参加した
はじめに
この記事は「ョョョねこ Advent Calendar 2020」25日目の記事です。
こんばんねこ!普段VRのゲームとかを作っているねこです。今回は、Cluster GAMEJAM 2020 in WINTERというイベントに参加したので、イベントへの参加理由や具体的にどんなことがあったかなどを書こうと思います。
今回作った作品は以下のツイートから確認できます。
最初に、Cluster GAMEJAM 2020 in WINTERって何?という方もいらっしゃると思うのでどのようなイベントかを説明します。
バーチャルSNS(アバターを着て交流できるプラットフォーム)のひとつに「Cluster」というものがあります。このプラットフォームには、Unityを使って作ったゲーム(Clusterでは「ワールド」と呼ばれる)をアップロードできる機能があります。
今回のイベントは、その「ワールド」をひとり or チームメンバーと複数人で、48時間で作ろう!というイベントです。
48時間とはいえど、日付的には3日にわたって開催され、1日目の20時開始、3日目の20時終了というスケジュールでした。
詳しくは以下のリンクが分かりやすいと思います。
参加理由
3日でゲームを作るって正気ではないのでは??!そんなイベントにどうして参加したの??と思われる方もいらっしゃるのではないかと思います。
3日でゲームを作ることは正気ではありませんが、国内で2~3日という短期間でゲームを作ろう!というイベントも一応存在します。
このような形態のイベントを「ゲームジャム」と呼びます。
私もその手のイベントに何度か参加したことがあり、2~3日で作品を完成させた経験もあります。
そのため、まあ参加すればどうにかゲームは完成するだろうなという見込みはありました。
しかし、今回に関してはいままで参加してきたイベントと少しルールが違いました。
いままでのものは、とりあえずリアル会場にたどり着いたら3~6人くらいでランダムマッチングしてくれるのに対して、今回のものは予めチームを組んでエントリーする必要があります。
チームを組まずに1人参加する選択肢もありますが、ハードな道に思われます。さらにオンラインゲームジャムもやったことないので、どうしたものかと思っていました。
オンラインゲームコミュニティについて
そんな中、私が思い出したのは今まで属していたオンラインゲームのコミュニティです。
昔とあるオンラインゲームをやっていて、生活の都合上ゲームを一時離れることになり、流れでプレイしなくなったことがあります。
そんな感じで、(例外もあることは十分承知ですが)オンラインゲームコミュニティからはいつか脱退することがありえます。そう思うと昔やっていたゲームで仲が良かった人とも、もう少し遊んでおけばよかった...と思うこともあります。
何が言いたいかというと、今やっているゲームとそのコミュニティは、今のうちに楽しんで、思い出作りをしておくしかないのです!
思い出作り
そんな回想から、Clusterのゲームジャムを今属しているVRコミュニティでの思い出作りにできないかなと考えました。
だれかと共同開発をできれば楽しいかなと思ったところ、真っ先にお声掛けしたくなったのがチワさんでした。
チワさんとはVR(VRChat)を始めてわりとすぐの今年の3月ごろに出会いました。そのころワールド制作に興味があった私は、チワさんのVRChat作業部屋に通って、Unityを使ったワールド制作のノウハウを色々教えてもらったことを覚えています。
それから今まで、作業部屋に行ってはUnityを使った創作関連の話をしています。
VR関係のコミュニティでここまでUnityについて話した人はいないな...という理由で、ゲームジャムにチワさんをお誘いしてみることにしました。12月初旬の出来事です。
ゲームジャムの事前準備
ありがたいことに、私がチワさんにゲームジャム参加の打診をした日に、参加OKの返事を頂きました。
ただ、その時共通の認識としてあったのは、今回のゲームジャムは作品を完成させることすら難しいのではないかということです。
当時Clusterの開発環境には2人とも触れたことがなく、Clusterワールドも(超有名どころ以外)何も知りませんでした。
そこで、どうゲームジャムを攻略していくか作戦会議をすることにしました。
作戦会議
最初の作戦会議で挙がった課題点は以下の通りです。
[1] 今回アウトプットする作品における価値観を共有できていない
[2] どんなワールドがClusterの「すごいワールド」なのかお互いに知らない
※ ここでの「すごいワールド」はVRChatで言う、連日Gameワールドの上位入りしているようなワールド
[3] Clusterのワールド制作の方法を知らない
[1] に関してはの「価値観」とは、制作における縛りのようなものです。
ゲームのアイデア出し自体はゲームジャムが始まった瞬間に行うものですが、そこで各々が出したアイデアの評価基準を決めます。
具体的な価値観としては「敵に直接殴られるようなVRゲームはこわいので今回は控える」「1ワールドで遊ぶ時間は10分程度な気がするので、そのくらいで完結するゲームにする」などが出てきました。
[2] [3] に関しては手探りしていくしかないか...?と思ったのですが、Clusterの運営さんが素晴らしいコンテンツを用意してくださっていました。
Cluster上でうまく機能するゲームワールドのサンプルです。しかも、このサンプルはダウンロードするとUnityプロジェクトファイルとしても閲覧可能なものでした。
ひとまずはこのテンプレートワールドを「すごいワールド」として見た上で、プロジェクトファイルを見ながらワールド制作の方法を学習していこうという結論が出ました。
この時点で、私がプログラムを、チワさんがグラフィックを担当することは決まっていました。
しかし、グラフィック担当者もClusterでできることがわかっていなければ効果的なアセットづくりができない、万が一私のPCがダメになったときなどにギミックをいじれないなどの理由で、2人で一緒に学習をすることになりました。
テンプレートワールドを触る
※ Clusterの開発環境がよくわからない方は、この節を読み飛ばしてもらっても差し支えないと思います ※
このテンプレートワールドを2人で触りながらギミックを作る時間を別途設けました。
テンプレートワールドを触った結果、ゲームワールドを短期間で作るなら、チームでいくつかワールドギミックの規則を作るべきだという結論に至りました。そのため、普通のソフトウェア開発チームでいうコーディング規則の策定を行っていきます。
具体的に決まったこととしては、大きく次の3つが挙げられます。
[1] アイテムがオブジェクトのルートに来る必要がない場合は、アイテムをTransform以外にコンポーネントのないゲームオブジェクトの子にする
これはClusterの仕様としてItemコンポーネントを持つゲームオブジェクトの子オブジェクトには、Itemコンポーネントをアタッチできない(=アイテムをネストできない)ものの、ゲームの見た目上アイテムをネストしたように見せかけたいケースが多々あることに起因する規則です。
ルートオブジェクトにItemコンポーネントをアタッチすると、視認性や拡張性の面でデメリットが大きいため、このような規則を作りました。
また、「アイテムを子に持つ、Transform以外にコンポーネントのないルートオブジェクト」を「~System」という名前に統一することにしました。例えば敵オブジェクトなら「EnemySystem」です。
[2] どのゲームオブジェクトのメッセージ(=Target, Key, Parameter Typeを包括する概念の名前)なのか, スコープ, 型名をはっきりさせる
具体的には、以下の規則でKeyを表記します。
(System名)::(アイテム名).(任意の機能名)_(スコープ)_(型名)
※任意の機能名はSignal型なら大文字、それ以外の型なら小文字で始めることが望ましい
※アイテム名とゲームオブジェクト名は可能な限り同一とする
例外1: 複製で(1)とかがつく場合は同じアイテム名でもいい
例外2: HPなどのパラメータや、外観モデルだけが異なる場合も、同じアイテム名でもいい
一応認識共有のために、Clusterにおける「型」をParameter Typeとして「Signal」「Integer」「Float」「Bool」の4つと定義します。
「スコープ」を、メッセージのTarget(=メッセージを扱える範囲)として「This/Item」「Global」「Player」の3つとします。
「(System名)::(アイテム名)」をKey名に入力させる理由は、どのオブジェクトを中心として扱われているメッセージなのかUnityのヒエラルキーを見てすぐわかるようにするためです。
どの辺りでそのメッセージの値がいじられているのかわからなければ、値を使いにくくなってしまいます。
「.(任意の機能名)」をKey名に入力させるのは、そのメッセージがどのような機能をもつのか把握するためです。
「_(スコープ)_(型名)」をKey名に入力させるのは、Cluster SDKでは、宣言以降も「このメッセージは何型でどのようなスコープですよ」と明記させる場面が再三あるからです。
ここで違った型名・スコープを入力すると途端にバグり始めます。可能な限り型の再入力を間違えないようにしたいため、Key名に型名とスコープの情報も与えることにします。
[3] OnCreateItemTriggerが実質Unityの変数宣言なので、そこで使用変数(=Signal以外のメッセージ)を挙げてしまう
処理中にいきなり謎の変数が登場しても困るので、最初に使いたい変数を挙げてしまいます。Signal型メッセージの宣言は、ここでは考えません。「なんとかLogic」とかのコンポーネントの先頭で宣言できるためです(プロトタイプ宣言が必要でないC#的な考え方)
OnCreateItemTriggerは値の初期化としては使わず、この後にOnInstantiateというSignalを置いたりして、宣言した値を初期化します。理由は、OnCreateItemTriggerでは変数が使えないためです。他のオブジェクトの変数を参照して、宣言した変数を初期化したい場合に困ります(ただ、C#でいうconstでよい変数は、OnCreateItemTriggerの段階で宣言と同時に初期化していいでしょう)
...ほかにもルールはいくつかありますが、このようなノリでチワさんとギミックづくりにおける規則を作っていきました。
実際にClusterでゲームワールドを作る
ここまでで、Clusterのテンプレートワールドを見てみた上で、制作上の考え方をまとめました。
しかし、いくら座学したところで実践力をつけるには実際にモノを作らなければなりません。
ということで、実際に当日ギミックを作る私が、ゲームジャムの数日前までに何かCluster向けの作品をつくることにしました。
作品づくりのネタとしては、以前VRChat SDK2で作ったワールドを再現することにしました。
このVRChatワールドはUdon追加アップデートで動かなくなったのですが、この機会にClusterで再現しておくことでまた遊べる形にして世に出すことができると踏んだためです。
VRChat SDK2では、変数を用いた計算が非常に大変で、半加算器や全加算器を作ったことを覚えていますが、Cluster SDKで作り直すのはそんなに大変ではなく、ギミックづくりだけだと2, 3日で完成しました。
※ アセットはVRChat版のものを流用しました。グラフィックが完全に用意されている状況でギミックのみを作る形だったため、ゲームジャムのいい予行練習になりました。
実際のワールドはこちらになります。
※ 余談ですが、このときチワさんは短時間での3Dモデルなどを用いた絵作りを通してゲームジャムの準備をしてくれていたようです。
ゲームジャム直前準備
実際にCluster向けゲームワールドを作り切り、最初の作戦会議で挙がった課題点が解決されつつあるのではないかと感じたころ、ゲームジャム本番がすぐそこまで差し迫ってきていました。
そこで、再度チワさんと集まって、ゲームジャム当日のスケジュールを組むことにしました。
当日のスケジュール
上記のように、細かく時間を区切ってGoogle Docsにスケジュールを書いていきました。
上記の画像は制作状況によって都度修正したスケジュールなので、開始直前の内容とは乖離がありますが、最初からこのくらいの粒度ではありました。
タスク割り振りツール
お互いの作業の進捗をお互いが把握するために、Trelloというタスク割り振りツールを使いました。
お互いのタスクはラベルで色分けし、縦の列はアジャイル開発の手法を参考にして「チームタスク」「作業中のタスク」「完了したタスク」に分けました(本家より少し粒度を落としました。2人チームだからいいだろうという認識です)
このようにして、ゲームジャムの直前準備を完了させ、あとは当日に企画と開発をするだけ!という状況になりました。
ゲームジャム当日
1日目の20時にお題が発表され、ゲームジャム開始となります。
お題は「溢れるエナジー」でした。お題発表後、先述したスケジュールに沿ってアイデア出しを始めることになりました。
アイデア出し
最初は何も話し合わずに、チワさんと私でそれぞれお題からのキーワード連想 -> 実際にゲームに使えそうなキーワードを抽出して企画を書くという流れを行いました。
決められた時間に各々での企画作りはいったんストップし、出たアイデアを共有します。上記は私のメモですが、チワさんも同じことをされていて、お互いのアイデアを見ることになりました。
結果、上記画像の最上部の案をベースに雪合戦ゲームを作ることになりました。1日目はこの時点で夜遅くなっているので、早めに休もうという方針で、実際の制作は始めず解散となりました(私はこのあとVRでいくつかの体操をやったりして、夜更かししたのですが...)
モックとアセットの制作
2日目の朝から実際の制作にかかることになりました。
私はプログラム担当として、プレイの感覚がわかるモックを作り、チワさんは必要なモデルを作っていきます。上記画像はモデルの一部です。
モックを遊んでみる
2日目の夕方ごろには、ある程度プログラムとモデルもできてきて、最低限のゲームフローが完成しました。
そこで、実際にClusterにゲームをアップロードして、遊んでみることになりました。
上記ツイートはアップロードしている様子です。
方向性を修正する
モックを遊んだ結果、チワさんが手触りを現実の雪合戦に寄せたらもっと面白くなるとの意見を出してくれて、それまでできていたギミックの挙動から方向性を変えることとなりました。
現在のゲームでは、雪玉が放物線を描いて飛んで行ったり、雪玉のリロードが1発ずつだったりしますが、モック版では雪玉が直線状に飛んで行ったり、一気に雪玉がリロードされたりしていました。
モックを修正したものを3日目の午前1時ごろに共有しました。結果、手触りが改善したと判断できました。この修正版モックの挙動は現在のゲームとかなり近くなっています。
そのため、続きはこの方向性で行こうということで合意し、2日目の制作を終わります。
時間的に3日目に入っていますが「寝るまでが今日」です。ただし、睡眠時間の確保をしなければ正常な判断ができなくなり、最終的なゲームのクオリティが悪くなるとの考えで、作業は終わりになりました。
3日目の作業
2日目の時点で、ある程度のゲームフローはできていました。
ただ、細かな手触りの調整や音周りの実装、遊び方の解説をできていなかったので、そちらを詰めることになりました。
とくに遊び方の解説をワールドに含めないことには、遊びに来た人がどうやって遊べばいいかわからないため、わかりやすい文章を心掛ける必要があります。
このあたりの実装を終わった後は、(Clusterの運営さん的には、成果物をツイッターでも紹介してほしそうだったので)Twitter上に投稿するための紹介動画を作るなどしていたら、時間はあっという間に過ぎていきました。
Twitterに動画を投稿して、完成報告をして終了です!
ゲームジャムの余談
まとめに入る前に、今までの記事に書ききれなかった余談を紹介します。
ゲームジャム当日に準備した現実のアイテム
ゲームジャム当日は(特に後半になればなるほど)タスクに追われて食事時間を短縮したくなります。また、使わないことが理想ではありますが、どうしても眠気覚ましとかも必要になってきます。
そのため、以前別のゲームジャムに参加したときを思い出し、カップ麺やペットボトルコーヒー、手を汚さずに食べられるお菓子をリアル作業部屋の片隅に置いておきました。
結果、制作を進める上でとても役に立ったのではないかと思っています。
これらのものを食べながら思ったのですが、ゲームジャムにおいての制作スタイルはリアル会場を使っても、オンライン上やっても、あまり変わりませんね。
ゲームジャム関連の参考になる記事
私のゲームジャムに対する参加の心構えは、上記の記事によるところが大きいです。上記記事の最初には、以下のような文章が登場します。
最初に知っておいていただきたいのは、「2日で遊べるゲームが完成するのは、とてつもない奇跡」だということだ。「動く」ところまでは行っても、「遊べる」ところにたどり着くにはさらなる試練が存在する。
今回は特に2人での作業(片方はプログラム、片方はグラフィック)なので、お互いの作業内容だけをやっていては「遊べる」ゲームになるはずがありません。
私の方では、プログラムをする上では、なるべくレベルデザインを考えながらギミックを作っていくことを意識するなどして、時間の削減を図りました。
また、同じ記事に以下のような文章も登場します。
テーマを無視すると当日何を作ればいいのか?と悩むかもしれない。ただ、面白いゲームを作るには、当日考え始めてもまとまらない場合が多い。どんなゲームを作りたいか、事前に構想を練っておくのが理想的だ。
こちらもかなり同意なのですが、ゲームづくり界隈をねこ的に観測したところ、ある程度テーマを守る空気があるように思えました。
そのため、今回のゲームジャムに向けての事前の作戦会議では「企画アイデアの評価方法」を検討し、決定するという形をとりました。
その後、当日にテーマが発表されてから、最初に(あまり評価方法を考えずに)自由にアイデアを出してから、評価方法を考慮してアイデアを絞り込むという流れをとりました。
後になって思えば、これはお互いのバックグラウンドの把握がある程度できているからこその手法かもしれません...。
ゲームジャムのチーム名「せぷョねこ」って何??
ゲームジャムの中間発表2の公式放送で、プレゼンターのリーチャさんに突っ込まれたチーム名「チームせぷョねこ」って何?という話ですが、このようにして決まりました。
「せぷ」が私で「ねこ」がチワさんらしいです。「ョ」とはいったい...?
いかがでしたか?
ということで、長くなってしまいましたが「Cluster GAMEJAM 2020 in WINTER」の体験記でした。
最初に書いた通り、VRコミュニティでの思い出作りのために参加しよう!と決心した今回のイベントでしたが、実際に得るものも大きかったです。
特に、ゲームジャム2日目最後の方向性の修正で、大きくゲームの手触りが変わりました。それまで作ったものについて、納得させた上で作り直しの提案をできる関係性って大切ですね。
とても楽しいイベントでした!参加をご快諾いただいた上、最後まで頑張ってくれたチワさん、運営さん、作品を見てくださった皆様、本当にありがとうございました!
ョョョねこ Advent Calendar 2020 閉幕
記事の本筋とは関係ないですが、今回の記事でョョョねこ Advent Calendar 2020 が全て終了しました!まさか全日程が埋まるとは思いませんでした...。
開催理由は以下の記事に書いた通り「普段お話している方々や、その周りの方のお話をもっと聞いてみたい」というものでしたが、非常に様々な記事が読めてとても嬉しく思っています。
とてもいい記事ばかりなので、ぜひ記事一覧を一度確認された上で、興味があるタイトルの記事を読んでみてください...!!
またこのような機会を設けられるかはわかりませんが、またアドベントカレンダーを企画できた暁にはご参加いただけますと幸いです!
また、年末なのでそちらのご挨拶ですが、今年の2月にVRを始めたとは思えないほど高速で過ぎ去ってしまい、とても楽しい1年でした。
本当にお世話になりました!来年もよろしくお願いいたします。