#1 自動販売機を作りながらステートパターン(State)を学ぶ【Unityミニゲーム】

ミニゲームを作りながらC#とUnityの使い方を覚えよう企画。Unityの基礎っぽいことは覚えたけれど、スクリプトでの書き方に不安がある、という人向け。今回はあらゆるゲームで利用可能なステートパターンについて学習しましょう。学ぶ上でみんな知っているであろう自動販売機を作りながら覚えていきたいと思います。

目次

今回のミニゲーム制作の主目的

ゲーム作るのでもちろん完成させるのが目標ではありますが、ミニゲーム講座ではいくつかのテーマが存在します。せっかく作るのであればそれらのテーマを意識しながら作っていきましょう。

メインテーマは「ステートパターン」

今回はプログラムのデザインパターンと呼ばれるもののうちの一つであるStatePattern(ステートパターン)を使えるようになるのが目標です。ちなみに自分はステートパターンの説明受けても全然分からん!みんなも「ステートパターン」でググればそれっぽいサイトが出てくるので一度みてみると良いかもですね!

まずは簡単に例を上げて状態(ステート)がどいういうものか説明したいと思います。ここではとあるアクションゲームのキャラクターを例に説明したいと思います。

下図のキャラクターには3つの状態があります。

  • 何もしていないニュートラル状態
  • ジャンプ状態
  • スライディング状態

この3つの状態はニュートラル状態からジャンプボタンを押したり、下を押しながらジャンプボタンを押すことで各状態へ移行します。

しかし、ジャンプ中に下+Aを押してスライディングにならなかったり、スライディング中にAを押しても急にジャンプをしたりはしません。

これは別の状態に遷移するための処理が各状態ごとに限定されているためだと思います。こうした作りを心がけることで、「下+ジャンプ」の入力処理でスライディングに移動する処理というのはニュートラル状態に関係する処理だけを見れば良くなります。ざっくりではありますが、おおまかなステートに関しての説明は以上!

個人的にステートパターンは複数ある状態を行き来することへの制限を掛けることがもっとも有用だと自分は感じています。

今回は自動販売機を作るのですが、作るための仕様として以下の要件を満たしたものを作ります。

自動販売機の要件

これから作る自動販売機は以下の要件を満たしたものを作ります。

  • 自動販売機には硬貨10~500円までが投入可能
  • UIで10/50/100/500と書かれたボタンが存在する。これらを硬貨投入ボタンと呼びます。
  • お釣り払い出しボタンを押すと、投入中の硬貨が払い出される
  • 商品は4種類準備
  • 各商品には個別に金額を指定することが出来る
  • 硬貨投入後、購入不可のドリンクは半透明になる
  • 効果投入後、購入可能なドリンクは半透明が解除される
  • 硬貨投入後30秒何も行わないと自動で投入中の硬貨の払い出しが行われる
  • 購入可能状態のドリンク画像を押すと商品払い出しが行われる
  • 購入後は再度購入まで2秒間のインターバルを設ける。この間はボタンの入力はいずれも受け付けない
  • 払い出し後、残金が0の場合のみ即座に待機状態に戻る
  • お釣りの払い出しは投入中の金額に対して払い出せる最大の硬貨を返却する
  • お釣りの払い出しは1秒ごとに1枚ずつ払い出しを行う
  • お釣り払い出し中は他の操作は受け付けず、払い出しが完了すると待機中に戻る

細かい抜けはありそうですが大まかにはこのぐらいの要件。

普通の自動販売機だと購入せずにお釣り払い出すとそのまま返却されるのに!とかありますが、今回はそういった細かい部分は気にしないでステートマシン習得に集中しましょう。

自動販売機のステート(状態)は?

今回上記要件を満たすのに自動販売機の状態は次のものを用意します。英語があってるかはさておき、各状態の名前もカッコ内に示します。

  • お金が入っていないニュートラル状態(Neutral)
  • お金が入った状態(Selecting)
  • 商品払い出し中(Payout)
  • お釣り払い出し(Changing)

それぞれの状態で出来ることをさらにまとめてみましょう

各状態出来ること
Idleお金の投入
Selecting購入できる商品ボタンの表示
購入ボタンを押して商品払い出し
お金の投入
Payout選択された商品の払い出しを待つ
Changingお釣りの払い出し

ここで注目したいのは、出来ること以外は逆に言うと出来ないことになります。なのでPayoutやChangingの状態ではお金の投入や購入ボタンを押しても何も起こりません。一般的に一つのスクリプト(クラス)で処理を書こうとすると、いろいろな分岐などが入ってしまい複雑になってしまいます。そのため今回はステートパターンを利用することで現在の状態で出来ることだけに集中するようなクラスを準備することで完結に処理をまとめることが出来るようになるのです。

ミニゲーム制作で学べることについて

ステートパターンの使い方が学べるのはもちろんなのですが、その他にもついでにいろいろと学べるようになっています。とはいえ他の要素に関しては説明が少し不足するポイントもありますので、各部分に関しては多少分からなくても「ふーん」ぐらいで済ませつつ、ステートパターンが使えるようになってから改めて学習し直すスタンスでも大丈夫です。

複数ボタン系の入力関係

今回はいくつかのボタンが登場します。硬貨を投入するボタンや自動販売機から対象の商品を購入するためのボタン。複数あるものからデータを受け取って処理を振り分ける方法などを学ぶことが出来ます。

また、ボタンのOnClickイベントをインスペクターで設定するのではなく、スクリプトからイベントを紐付ける方法も学ぶことが出来ます。スクリプトで出来るようになるメリットは必要なときだけイベントを接続して、不要になったら解除するという使い方なんかが出来ます。今回のステートパターンにはもってこいですね!

スクリプタブルオブジェクト

商品データを管理するために利用します。同じ商品を並べたり、順番を変えたりする場合、都度都度画像を変更していては手間がかかって仕方ない!そこで登場するのがスクリプタブルオブジェク。静的なデータの塊はスクリプタブルオブジェクトにおまかせしましょう。

ちなみに長くUnityと付き合うとこのスクリプタブルオブジェクトは切っても切れない関係になりますので、使いながら少しずつ慣れていきましょう。

その他一覧

  • クラスの継承
  • Generic型
  • 入れ子クラス
  • スプライトをクリックする方法
  • 複数のボタン(UI)から異なるパラメータを受け取る方法
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次