見出し画像

Unity1週間ゲームジャムで「This is the Wild West」を作りました

Gunzee2

unityroom様で開催されたUnity1週間ゲームジャムで、自作ゲーム「This is the Wild West」を制作しました。

今回のゲームジャムのテーマは「あける」だったので、「酒場のスイングドアを開けて荒くれ者を倒す」という内容のミニゲームになっています。

いつもは自分のブログに書いているのですが、今回はフィギュアをいただけるという物欲に釣られた為、noteにて制作の経緯や感想を書きたいと思います。

自己紹介

Medium-Rare Gamesという名義で個人でゲーム制作を行っています。過去にAndroid,iOSでアプリを一本だけ出したことがあります。(現在はストアの規約変更によって消えてしまいました)

画像1

1週間ゲームジャムに参加するのは3回目で、第一回第二回以来、3年ぶりの参加になります。(その他Probuilderゲームジャムに参加しています)

前述のスマホゲームは、第一回で作った物のブラッシュアップ版です。ゲームジャムでの公開時には好評いただいて、励みになりました。

その後、何度もゲーム制作を行っては来たのですが、納得行くものが作れず、いわゆる無限エターナる状態に陥っているという感じで今に至ります。

参加の経緯

実は、先週の木曜日(12/24)まで開催の事実を知りませんでした。

人生の暇つぶしにTweetDeckでタイムラインを眺めていた所、下記のツイートが目に入りました。

そして記載のnote記事を読んでいった所…

画像5

ほぅ…

画像3


ん…?


画像4


全員!??


これは今からでも、参加するしかねぇ!


「無料」や「プレゼント」という言葉の前に、人は無力。

アイデア出し(木曜夕方)

一週間ゲームジャム開催を知ったのは木曜朝、一週間のうち3日間が既に過ぎ去っていました。

また、一日のすべてをゲーム制作に使うこともできないため、残された時間はあまり多くありません。

そこで、面白さや斬新さは二の次にして、アイデアについてもゲームの内容についても、シンプルなものにしようと考えました。

そしてScapleで書いたアイデアのたたき台がこちら。

画像5

完成形と違う…

この時点では、マウスカーソルを動かして扉を開けたり閉めたりすることで(マウスで擬似的に扉の開け締めっぽい動作をさせて)敵を倒すゲームにしようと考えていました。

制作開始(木曜夜)

そんな感じでふんわりと方向性が決まったところで制作開始。

話は変わりますが、私は趣味でゲームの実況配信というものをしています。(いわゆる生放送)

いつもは普通にゲームで遊んでいるだけなのですが、稀にゲーム制作配信などをすることもあり、今回もなんとなく製作作業を配信し始めました。
(作業監視的な効果もあって意外と捗ります。いつもより疲れるけど)

その中で、こういうものを作ろうと思っていますという話をしたところ、

「酒場のスイングドアとか良いんじゃない?」

「ラグドールでふっ飛ばそう」

「扉2枚ならピンボール出来そう」

といったご意見をいただきました。


お、それええやん!いただいとこ!


これで全体像が固まりました。今回に関しては、リスナーの方たちにアイデアをいただいたと言っても過言ではありません。

「フィギュアが届いた暁には尻の部分を報酬にくれ」というエキセントリックなメッセージもいただきましたが、代わりに感謝の言葉を送らせていただきます。

一つのフィギュアをバラバラにして山分けという発想がすごい。

その後、扉の開閉とラグドールの実装まで制作してこの日は終了。5時間弱の作業時間でした。

画像6

制作二日目(金曜夜)

夕方からコツコツ作業開始。上の画像をよく見るとわかりますが、昨日の時点ではラグドール化した人がTポーズを取るため不自然なので、これの解決から手を付けました。

普段は非ラグドールのモデルをAnimatorで動かしていて、キャラクターが死亡したタイミングでラグドール設定をしたモデルと差し替えているため、最初の非ラグドールモデルの死亡時ポーズ(走っている姿)とラグドール化モデルの初期ポーズであるTポーズで不一致が起きていることが原因です。

画像8

なので、非ラグドールモデルのボーンのTransform情報(傾きと位置)をコピーし、ラグドールモデル生成時に同一名のボーンにTransform情報をペーストすることで、ラグドールに擬似的に同一のポーズをさせ、対応しました。

参考文献↓

あとはラグドールを吹き飛ばしてピンボール的な事をしたかった為、その実装を行いました。

   
   public void AddForceAllBones(Vector3 force)
   {
       var bones = boneRootTransform..GetComponentsInChildren<Transform>().ToList();
       var boneRbs = bones.Where(x => x.GetComponent<Rigidbody>() != null).Select(x => x.GetComponent<Rigidbody>()).ToList();
       
       foreach (var rb in boneRbs)
       {
           rb.AddForce(force, ForceMode.Impulse);
       }
   }

一つのRigidbodyに対してではなく、こんな感じでボーンすべてのRigidbodyに対して力を加えてあげる必要がありました。

この日の成果は以上。

制作三日目(土曜夕方)

初日の時点では敵キャラクターの移動がRoot Motion頼みだった為、何らかの方法で制御しようという所から始めました。

画像7

その過程でRigidbodyをつけたりして起きた現象。こういう面白いバグを見るのも制作の醍醐味と言えなくもない。

移動制御については、Navmeshを使うことにしました。

画像9

敵をぶつける対象になる障害物(サボテンなど)にはNavmeshObstacleコンポーネントを付与。

画像10

敵が吹き飛んでぶつかるコライダーは大きめ、NavMeshの当たり判定は小さめにしてます。(それでも敵が引っかかるけど)

その後、スコアカウンターや、敵と障害物の簡易的な自動生成処理、ゲーム全体の状態遷移制御などを作ってこの日は終了。

あれ?あと一日?無理じゃない?って気がしてきました。

制作四日目(日曜昼)

こだわりを捨てて最低限遊べる形を目指していきます。

タイトル→ゲーム→結果発表といった状態遷移の仕組み自体は前日に作ったので、そこにUIを加えていきます。

時間もないしUnity標準のUIでサクッと作るのも良かったのですが、ここはオトナらしく金で解決しようということで、Mordern UI Packを購入しました。

そこにもともと持っていたDoozy UIを組み合わせて、

お手軽にリッチめなUIを実装することができました。
(実際にはチョト調整が必要)

参考文献↓

これを使って、

画像11

こんなのや

画像12

こんなのをつくりました。

あとは効果音、BGMを↓魔王魂さんから拝借して、

もともと持っていたMasterAudioを使ってサクッと再生。

パーティクルは以前セールで購入したこれや、

これを使ってサクッと実装。

これでとりあえずゲームとしての体裁を保てたので、WebGLビルドしたところ、ビルド自体は通るものの、音が再生されない問題に遭遇しました。

原因はUnity2020.2.0の問題でした。2020.2.1にアップデートしたら解決。

リトライしないと音がでない問題は、私が普段使っているVivaldiというブラウザ固有の問題っぽい感じでした。(Chromeだと問題なかった)なのでノータッチ。

WebGLのビルドを行うと私の環境では終了まで10分くらい掛かってしまうため、ちょっと調整してはビルドを繰り返すだけでも時間は刻々と経過してしまい、志半ばでタイムアップとなりました。

完成した感想

作っている途中では、「複数種類の敵や障害物を出そうかな」などと考えていたのですが、全体的な体裁を整えるのに想像以上に時間が掛かってしまいました。

そのため、期日時点では、細かい手触りやゲーム性の部分で個人的に最低限実現しようと考えていた「面白い」とか「気持ちいい」と感じられる調整をしきれなかったのは残念です。

(期日後にアップデートでちょっとだけ追加しました)

ただ、Unityを久々に触って感覚を思い出せたし、明確な期日から逆算して何ができるか、何を切り捨てるかという判断を行うのは純粋に良い経験になったと思います。

いつもは目に見えない(期日がない)ゴールに向かって走って迷走しているので、やっぱり目標設定は大事だなぁと感じました。

あと今回は4日間という短い期間での制作になりましたが、いつもは

「自分で納得の行く良いものを作ろう」

という意気込みがあって、それを上手く表現できずエターナってしまう事が続きましたが、今回は日数が少ないのもあって、逆に肩肘張らずにのびのび作れた気がします。いつもこれくらいの気持ちで望んでいればもうちょっと世に出せた物も多かったのになぁとチョト後悔。今後はもっと気楽に発表していきたいところです。

技術的な部分では、UniTask(v2)やUniRx、Zenject(Extenject)あたりを使えて、理解が深まった点もあったので収穫がありました。

特にUniTaskでDoTweenの終了待ちできるのがとっても便利。OnCompleteに色々書かなくて良いってステキ。

余談

水曜日に群馬県の「世界の名犬牧場」というお犬様と触れ合える空間に遊びに行った際、撮影した画像をtwitterに上げたら大反響をいただきました。

どうせなら創作活動でバズりたかったという気持ちがありつつも、
犬猫は古来からの人気コンテンツ、勝てるわけがありません。

お犬様が好きな方はぜひ行ってみてください。

最後に

さて長々と書きましたが、今回イベントを開催してくださったunityroom様、参加者の皆様、関係者の皆様ありがとうございました。お疲れさまでした。またお会いしましょう。

それでは、

フィギュア、お待ちしています。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!