Learn Unity 4 for iOS Game Development 8

レッツ・プレイ! ゲーム・スクリプティング

作ったもの
・ボウリング・ゲームへの、ゲーム・ロジックの実装。

クリックすると、別ウィンドウが開きます。(音が出ます。)
Screen-Shot-2013-08-16-at-17.42_600
http://shakeweb.sakura.ne.jp/demo/LU4_chap8/

————————————————————————————————
・FSM(finite state machine)の概念に則って、汎用的にスコアを計算するためのクラス郡を収めたライブラリ用の .js ファイルを用意する。

————————————————————————————————
フレームごとのスコアを保持するクラス

・スペア/ストライク時、以降のフレームが終了するまでスコアが未確定の場合は、-1 とする。

————————————————————————————————
スコアを計算するクラス

・クラス内に、変数、コンストラクタ、スペア/ストライク判定用関数を用意。

・scores:FuguBowlScore[] : built-in array : 処理は早いが、一度作るとリサイズできない。
・コンストラクタで、配列 scores を用意し、10フレーム分のスコアを初期化して未確定にしておく。
・各フレームのスペア、ストライク判定用の関数 IsSpare()、IsStrike() を用意。
・FuguBowlPlayer クラスは、FuguBowlScore クラスのラッパーのようなもの。

・スペア/ストライク時のスコア更新用関数を用意。

・スペア時 : 10(1投目 + 2投目)+ 次のフレームの最初の投球。
・ストライク時 : 10(ストライク)+ 次のフレームの最初の投球 + 次の投球。

・1投目のスコア確定用関数。

・2投目のスコア確定用関数。

・3投目のスコア確定用関数。

・総合得点取得用関数。

・recursive function : 自分自身を呼ぶ関数。

————————————————————————————————
・ピンが倒れているかどうかを判別するスクリプトをそれぞれのピンに適用する。

————————————————————————————————
ゲーム・コントローラーに処理を追加

・FuguBowlPlayer をインスタンス化。

・倒れているピンの数をカウントする。

・倒れたピンを非表示にする。

・SetActive(false) で、GameObject を非アクティブにできる。

・ResetPins 関数に非アクティブにしたピンを再度、アクティブにする処理を追加。

————————————————————————————————
FSM (finite state machine)

・ゲーム進行を整理する。
 New Game
 ↓ ※
 Ball1 || Ball2 || Ball3
 Rolling
 RolledPast || GutterBall
 Roll Over
 Spare || Strike || KnockedSomeDown
 NextBall
 ↓(最終フレームが来るまで ※ に戻る)
 GameOver

・現在のフレーム数と何投目かを入れる変数を用意。

・前章で用意した Update() 関数を削除し、代わりに Start() 関数内でコルーチンを使用して FSM を実装する。
・それぞれのステートに合わせた処理を、コルーチンとして呼び出す。

・yield で処理を明け渡した上で StartCoroutine() でコルーチンを実行し、while 文のループを一時停止させる。
・コルーチンと yield について リファレンス

・ゲーム開始時のステート、StateNewGame の処理。

・1投目のステート、StateBall1 で投球前の初期化処理。

・2投目のステート、StateBall2 で投球前の初期化処理。

・3投目のステート、StateBall3 で投球前の初期化処理。

・投球後のステート、StateRolling の処理。

・yield で処理を明け渡した上で、while 文をループさせ続け、条件を満たした時に処理を抜ける。

・投球後、ボールがピンのラインを越えた時のステート、StateRolledPast の処理。

・SmoothFollow 型や MonoBehaviour 型の変数に代入しても、enabled / disabled を切り替えられるが、汎用性を考慮して、Behaviour 型に代入。
 Behaviour クラス → MonoBehaviour クラス → SmoothFollow 等の GameObject に適用されたスクリプトのクラス。
・l.6では GetComponent() にクラス名を渡しているのに対し、l.2ではストリングを渡している。
 l.2 GetComponent(“SmoothFollow”) : ランタイムエラー
 l.6 GetComponent(FuguForce) : コンパイラエラー
 SmoothFollow クラスは、Unity の開発環境によっては、存在しない可能性もあり得る。
 存在しないクラスの enabled 変数にアクセスしようとすれば、エラーになる。
 ストリングを渡せば、同名のコンポーネントが見つからない場合は、ランタイム時に null が返ってくるため、null チェックができる。
・yield WaitForSecontds() で処理を明け渡した上で、5秒間、一時停止させる。

・disabled にされたコンポーネントを、リセット時に、再度、enabled にする。

・ガター時のステート、StateGutterBall の処理。

・ガター時/ボールがピンのラインを越えた時のステート、StateRollOver の処理。

・投球後の結果の各ステート、StateSpare、StateStrike、StateKnockedSomeDown の処理。

・投球完了時のステート、StateNextBall の処理。

・ゲームオーバー時のステート、StateGameOver の処理。

————————————————————————————————
参考アセット

FSM のアセット
Playmaker (Huton Games)

————————————————————————————————
FSM に関連した参考サイト

CryEngine 3 Free SDK
Entity States を検索。

Blue Mars wiki
entity script を検索。

Second Life wiki
state を検索。

ページトップへ