今回は昨年末にリリースした「そらとぶかえる」のゲームの裏側をご紹介していきます(^^)v
開発背景
なにかアプリを出したいけど、あんまり大きい規模のものだと完成しないので、比較的規模の小さいミニゲームを作ろうって話になりました。
ゲームの元ネタは妻が出したもので、レベルデザインとプログラムを私が担当しました。
シーン数について
このゲームは「Main」シーンだけで構成されています。
シーンが遷移しているように見えるのは、UIの表示非表示を切り替えているだけです。
ゲームを動かしているスクリプト達
上記のシーン内に「GameManager」オブジェクトを配置して、基本的に全てのスクリプトをここに割り当てています。
ゲームマネージャー
プレイヤースピード、風船の膨らみ、スコア、風船アニメ制御、背景画像を切り替える仕組み などなどを制御しています。
UIマネージャー
ゲーム中の全てのUIはこのスクリプトを介してしか制御できません。別スクリプトからUIを呼び出す時は必ずこのクラスを通します。できるだけ疎結合な作りを心がけました
ジェネレーター
障害物と風船を生成するクラスです。風船サイズは範囲内でランダムに切り替わります。
プレイヤー制御
プレイヤーがどれくらいのスピードで上昇するか?左右移動速度は?などを制御するクラスです。
実はけろたんは上にのぼっているわけではないんですよね。風船が下に落ちているだけです(笑)
表情切り替え
このゲームの主人公(けろたん)は状況に応じて表情が変化します。
これは、ゲームを作ってる途中で「表情が切り替わった方がいいよね!」ってノリで実装したやつです。
ゲームを実行していない時はけろたんの顔はこんな感じになっています。全ての顔が表示しているのですね笑
表情はグループ化して、それぞれのSpriteをプログラムで切り替えを行っています。
上記の画像を表情マネージャークラスで制御しています。けろたんの状況毎の配列があり、配列内にSprite(画像)をセット。
そしてゲーム実行時に、けろたんの状況に応じて、配列内でランダムに表情が表示されるって仕組みです。
今思えば、そんなに表情データも無いからもっと簡単な実装で良かったような・・・
サウンドマネージャー
音を再生する時は必ずこのクラスを通すようにしています。
BGMとSEをそれぞれ配列で分けて、予めAudioをセットしておくのです。
再生する時は「PlaySE("se_balloonCrash)」のように、引数に文字列を入れればいいので簡単です。
エフェクトマネージャー
これもサウントと同じ仕組みですね。使いたいエフェクトをセットして呼び出す。このクラスを必ず介する。
セーブと設定
ゲーム内での情報の保存はこのクラスを介します。
プレイヤーと風船
プレイヤーはそれぞれ、「風船」「腕」「体」でパーツがわかれています。
全パーツに「Rigidbody2D」が適用されており、「腕」「体」には「Hinge Joint 2D」がついております。
これで、キャラのプラプラを表現しています。
背景
細長い画像をリピートして使用しています。
また、Nメートル毎に 昼→夕方→夜 と時間帯の変化に合わせて、背景画像をフェードで切り替えています。
これは簡単なシェーダーを組みました。Lerpを使って2枚の画像を切り替えるだけのシェーダーです。
UIアニメーション
CanvasのルートなどにAnimatorを追加して、ステートマシンで制御したり、iTweenを使用したりしています。
複雑な動きや、ワンアクション後にループが必要なものをAnimatorで制御するって使い分けをしていました。
とこんなかんじで、開発の裏側をお見せしました。これからゲーム開発をやってみたい人のお役に少しでも立てれば幸いです。
良ければゲームの方もDLして遊んでみてください。
これが本当の目的です!
play.google.com