はじめに
この記事はUnity アセット真夏のアドベントカレンダー 2014 Summer!18日目の記事となります。
uStateとは?
ウダサンコウボウさんが配布しているスクリプトベースのステートマシンアセット
今回話すこと
自分がGameJam中によく使うuStateを使ったシーンの状態管理を紹介します。
#ゆるふわゲームジャムでの結果演出の際の事例と合わせて紹介します。
使い方
(詳しくはウダサンコウボウさんを参照して下さい!)
必要なもの
uStateでは状態管理を実現する為に以下のものが必要となります
- uStateMachineを継承したHogeStateMachineクラス
- uStateGenericを継承したFooStateクラス
基本的にはuStateMachine直下に各Stateのゲームオブジェクトを配置し、
uStateMachineはそれを見に行く感じ
ゆるふわゲームジャムでの実例 戦闘演出
ゆるふわゲームジャムで作成したけのじゃ!では入力後に、自分と相手のプレイヤーが同時に選択した行動を行い、各段階にて演出をさせる事をやりました。
まず戦闘演出に必要なステートを考える。
ざっくり列挙
- 初期化
- 準備演出
- 戦闘演出
- 結果演出
BattleStateMachine
インスペクタはこんな感じ
- DefaultStateName
- シーンに遷移した直後の状態の名前
- TransitionLimit
- 使ってないのでわかってない…(ごめんなさい)
今回はbattleStateMachineにPlayerも含めてしまっていたけどこれはあまり良い方法ではなさそう(GameJamでオラオラした結果です。。。)
シーンのステータス制御の仕方
基本的にはuStateGenericを継承した各状態の中に書きます。
よく使うuStateGenericのメソッド
StateEnter
状態に遷移した直後のメソッド
StateStay
MonoBihaviourでいうUpdateみたいなもん
StateExit
現在の状態から抜ける時の処理
Reset
初期状態の設定等(初期のState名等を設定する)
状態遷移のやりかた
準備状態の時のコード
protected override void Reset ()
{
base.Reset();
// 三秒後にShoot状態に遷移
exitByTime = new ExitByTime(3.0f, "Shoot");
}
// すぐに遷移したい場合はこんな感じ
exitByTime = new ExitByTime(0.0f, "遷移したいState名");
#### 外から状態を変更する場合
自分で用意したuStateMachineの参照をもって↓みたいにするとうまく動くかも
```csharp
uStateMachine stateMachine;
stateMachine.TransitionState("遷移するState名");
つかってよかったこと
状態ごとの処理をクラスごとに分けて書くことができた。
- 攻撃前の演出はReadyStateに
- 戦闘演出に必要な事はBattleStateに
- 戦闘結果演出に必要なことはResultStateに
動かすだけならすぐできる
- スクリプトベースのなのでコードを読めば使い方がすぐわかる。
悪かったこと
状態の遷移が見えづらい
- ノードベースと違って見えない
おわりに
uStateはスクリプトベースで管理できる為コレまでスクリプト上で状態管理をしていた人からするととても使いやすい気がします。
最近だとノードベースの状態管理のアセットなんかも最近は安価でかつ高機能ではあるのですが習熟に時間がかかる部分もあるため自分はuStateを推しています。
雑なまとめとなってしまいましたがuState是非お試し下さい〜
明日は束田 大介さんの記事となります!!