この記事はアドベントカレンダー2日目の記事です。
鵜崎です。
10月末に公開した自作ゲーム、「SpinBrainSpin」は遊んでいただけたでしょうか。
公開から近いうちに開発日誌をあげるとのたまってはや1ヶ月…
AdCの2日目に間に合っているかも怪しいですが、今回はichigojam参加記として15日間の開発を振り返っていこうと思います。
ichigojamって?
15(ichigo)日間+ゲームジャム(jam)をかけあわせた造語で、その由来の通り15日間でゲームを開発するイベントです。
ichigojam22summerと題した今回は9/17~10/1の期間で開催され、アイデアのためのフリーワードとして、「Smooth」「カツ」「脳」が与えられていました。
開発開始
実はてねしんくんがichigojamに合わせて前日に3時間でのゲームジャムを開催していました。
ここでのテーマが「回」だったので、フリーワード「脳」と組み合わせてなんとなく「頭の回転」というコンセプトが思い浮かんでいました。
また、少し前にこちらの記事を読んでおり、「頭の回転」を体感型の入力で実現できるということに気付き、「頭の回転」からパズルと体感型ゲームという二つのコンセプトをまとめあげようと思いました。
・何種類かのパズルをつくる
・制限時間内でいくつ解けたかを競う
・Joyconで体の1回転を取得し、回転のたびにヒントがもらえる
というアイデアはもうすでにこの段階で決まっていました。
開発1日目
こちらの記事を参考にしたうえで、新たに作成したプロジェクトに
JoyconLibをUnityに導入しました。
1日目は導入がうまくいったことや、サンプルシーンをいじってあそんでだいぶ満足してしまったのでここで終わりました。
明日からがんばるぞ!!!
...
...
...
開発5日目
他のプロジェクトでGame3に参加していたこととスプラ3(だいたいこれのせい)で多忙だったこともあり、
気づけば全く進捗がないまま、ほぼ半分の時間を使ってしまいました。
やってしまった。
...
...
...
くよくよしてても仕方ないので開発を進めます。
設計
今回はちゃんと設計から考えました。えらすぎる。
複数のミニパズルをシームレスにどんどん登場させたかったので(メイドインワリオみたいな感じ)、クリア判定、パス、ヒント獲得などの関数を格納したミニゲーム共通クラスを作成し、それを継承したオブジェクトを管理するという方向で進めました。
ミニゲームごとにシーンを作成し、それをLoadSceneMode.Additiveで読み込むというのを思いついていたのですが、ちょっと触った感じ沼る可能性を感じたので、力業とも呼べる前述の方法で実装しました。
今考えるとこれを設計なんて言えるか怪しいですが、短期&個人開発だったので、特に問題がおこることもなく進んだのでよかったです。
もうちょっと次は気を付けたい。
とりあえず暫定の設計もできたので実際にパズルの実装に移ります。
一筆書きパズル
構想段階で最初に思いついていたのは、
- Understandのような一筆書きパズル
- 脳が1回転するごとに勝手にパズルを解いてくれる
みたいなやつだったのでまずは一筆書きパズルを作りました。
画像の四角形がマスで、丸い部分がカーソルです。
この日は、カーソルの移動と一手戻す処理、クリア判定まで実装することができました。
開発6~7日目
パズルのレベル制作はScriptableオブジェクトでやりました。
一筆書きパズルに必要な要素を色々格納することができるので採用しました。
もっとよかったのは、後から要素追加だったり仕様変更だったりがめちゃくちゃ楽だったことです。
この時点では、
- ステージの大きさ(縦と横のマス数)
- すでに埋まっているマスの設定
くらいだけの情報しか格納してませんでした。
これとこのScriptableObjectのローダークラスとステージ生成クラスを作成するので2日間使いました。
短期では厳しいですが、せっかくScriptableObjectをつかうならエディタ拡張とかでGUIでレベル制作できるようにしたかったですね。
これも次回の課題です。
中間発表(8日目)
折り返しの8日目。イベントとしては、中間発表の日です。
まわりの進捗に怯えながらとりあえず進捗を報告。
他の参加者をみてみると、ぱっと見でクオリティが高い作品がもうあったので、
僕もせめて人に見せられるものにしたいと思いUI周りの制作を始めました。
画面要素の整理もできたので、このタイミングでUI制作を行って正解でした。
UIの制作にはFigmaを用いました。
自分は普段からちょっとした画像編集もFigma上で行っており、
手書きでラフスケッチをつくるような感覚で色々試しながら整えました。
「やわらか頭塾」と「脳を鍛えるトレーニング」シリーズにめちゃめちゃにインスパイアされているのは誰が見ても明らかです。
こういう時にオマージュに走ると、UI構想における時短にもなっていいですね。
開発9~13日目
いよいよJoyconをゲームに導入していきます。
しかしここが一番沼るポイントになってしまいました。
Joyconのジャイロ機能で体の一回転を取得するためにJoyconLibのリファレンスや各種記事を参考にして調べます。
JoyconLibから取得できるジャイロ情報は、
- 加速度
- 現在の傾き
- 回転速度
の3つでした。
回転だけでなく、動きと同期した脳のモデルを画面中に表示したかったので、現在の傾きを利用する方針に決めました。
しかしここでいくつか大きな問題が生じます。
クオータニオンがわからない
現在の傾きはクオータニオンとして取得することが可能でした。
理系学生として恥ずかしい限りですが、いままでむずそうという理由で避けてきたクオータニオンに向き合うべきときが来たのです。
ない頭を頑張ってフル稼働させて勉強した結果、ここで使える程度にはなんとなくわかってきたのですが、それでも2日間を溶かしました。おバカ。
同期ずれがすごい
脳のモデルと傾きを同期させたところ、実際の体の動きとの間に大きなずれが発生してしまうことが判明しました。
ある程度の見た目のずれは許せそうなもんですが、「1回転」を判定しなければならない以上、「見た目は1回転しているのに判定はされない」みたいなことが起こりうるのでかなり深刻な問題でした。
上記のクオータニオンの知識不足とも相まって完っ全に詰まりました。
解決策
結局、どうしたかというと、y軸の角加速度とフレーム間時間の積の和を保存しました。
ゲーム開始前に3回転してもらい前述の値を算出し、1回転に必要な値を補正するという方法を用いました。
左右どちらの回転にも適用できるので普通に良いアイデアでした。
モデルもこの値を用いて同期させたところ、見た目とのずれもかなり解消しました。
実際のゲーム開発現場ではどういう実装しているんですかね。
詳しい人教えてください。
たすけて~~~~~~~~~~~~~!!!
開発13~15日目
気付けば開発も大詰めです。
まだ全然できてないのに!!!!!
ヒント機能
先述のScriptableObjectに回答となる操作を格納したリストを作成し、1回転ごとにその操作を小出しにして解かせるというようなことをしました。
ヒントの操作より戻れないような実装にしてしまったせいで、実際にプレイする人はその仕様に困惑してしまっていたので反省です。
半透明なガイドを上からかぶせるとかの素直な実装で良かったと思うばかりです。
各種ブラッシュアップ
- タイトル画面の実装
- Joycon設定画面の実装
- ゲームシステムどうしのつなぎこみ
- UIの適用
- リザルトの実装
などなどのゲームとして今足りていないものをががっと実装します。
この量の作業をブラッシュアップと呼ぶのかなり乱暴だな。
ここらへんの記憶があんまありません。
とにかく形にすべく奮起していたのでデバッグをまったくしていませんでした。
どうなるかは想像通りです。
ichigojam終了
なんとか発表会までにビルド”は”終わりました。
プレゼン資料もないまま、発表会に挑みます。
ゲームの概要を紹介しつつ、できたてほやほやのゲームを起動します。
…
…
…
ゲームがタイトル画面から移動しません。
頭が真っ白になる僕。
幸いビルド前のUnityプロジェクトは正常に動作していたので急遽そちらを用いて発表を続行できました。
原因はDontDestroyOnLoadオブジェクトがシーン間で重複していたことでした。
ちゃんとビルドしてデバッグしないから...
他にもちょこちょこバグがでてきながらなんとか発表は終了。
悔しい思いをした僕はある決意をします。
延長戦突入
この時点で、
- 他の種類のミニパズルゲーム
- リザルトの演出
- バグ取り
- 音
などやりたいことがまだまだありました。
「なにもしていない4日間」を盾にichigojamを言い張って開発を続行します。
目標は10/20のtraPメンバー集会。
全部員の注目が集まる場です。しかも今回は数年ぶりの対面開催という絶好のチャンス。
ここで発表しない手はありません。
延長戦(16~19日目)
夏季休暇が終わり新学期が始まってばたばたした結果、開発を再開したのは集会の3日前。
急いで制作を進めます。
間違い探し
こちらのゲームの構想も開発初期の段階であったので即攻開発開始です。
暗幕が透けるアイデアはかなりウケがよかったので結構満足しているアイデアです。
時間もないので、一筆書きゲームと同様にレベルを手動で一つ一つ制作しているわけにもいきません。
- 生成する動物
- 問題の疑問文の種類
をあらかじめいくつか設定しその中からランダムに問題を生成します。
1日ほどで完成しました。
ブラックジャック風ゲーム
もう1つくらいゲームの種類が欲しかったので急遽制作しました。
アイデアとしては「ちょっと複雑な計算問題」から「ブラックジャック」に結びつきました。
こちらはなんと2時間ほどで見た目も含めて完成。
自分でもほれぼれする仕事ぶり。
アルゴリズムも競プロの簡単問題みたいでやってて楽しかったです。
ブラッシュアップ(真)
さっきはブラッシュアップという名のただの限界開発でしたが、今度はちゃんとクオリティアップやデバッグなどの作業に時間を割くことが可能でした。
リザルトにもいろいろネタを仕込めて満足です。
完成!そして反響
メンバー集会
しっかりとプレゼンの資料をつくった上で、発表に挑みます。
会場では僕がゲームを実演しながら、ゲームの概要を紹介しました。
遊ぶ人間の見た目のインパクトも大きかったのか、かなりいい評判をいただくことができました。
嬉し~~~~~~~~~~
文化祭に出展
10/29,30に開催されたイベント「ゲームドーーン」においてもこのゲームを持っていきました。
体感型のゲームということもあって、お客さんからの評判もかなりよくてうれしかったです。
この瞬間のために生きてる!!!!!!!!!!!!
めっちゃモチベがあがったと同時に、次回以降の開発での改善点も無限に見つかったので「やるぞ!!!!!!!!!!!!!」という気持ちです。
おわりに
個人ゲーム開発ってなにしてるの?という疑問もよく聞きます。
今回の記事で少しでもその内情が伝わっていると嬉しいです。
結構厳しいことや苦しいことも書きましたが、終わった今となっては楽しかったの一言につきます。
願わくばこれで興味を持った人がゲーム開発を始めることとなれば。
最後まで読んでいただきありがとうございました。
あしたのAdC担当はOribeさんです。それでは。