UnrealScriptでは言語レベルでステートマシンをサポートしている。
定義にはstateブロックを利用し、ブロック内で変数・関数を定義できる。stateブロック内で定義された関数は、アクタがその状態にいるときのみ呼び出しが可能となる。
定義
stateには三通りの定義方法があり、意味が異なる。
UnrealEdで設定可能なstate
stateのあとに括弧をつける記法。
state() MyState
{
...
}
設定不能なstate
stateのみの記法。
state MyState
{
...
}
デフォルトのstate
stateの前にautoをつける記法。このstateがアクタの初期状態になる。
auto state MyState
{
...
}
ブロック内の要素
stateブロック(ブレースで囲まれた中)内ではclassブロックと同様に変数・関数定義ができる他、stateコードとよばれるコードを記述できる。stateコードについては次節以降で述べる。
例:
state MyState
{
var int someValue;//変数が定義できる
var Actor someActor;
function someFunction()//関数も定義できる
{
...
}
//以下stateコード
Label://関数同様にラベルが利用可能
goto('Label');//無限ループ
}
stateコード
stateコードは、stateブロック直接書くことができるコードである。関数定義内と同様の記述ができるほか、いくつかの組み込み関数が利用でき、またラベルに関して特殊な用法がある。
組み込み関数
- Sleep(float Seconds): Second秒待つ。
- FinishAnim(): (恐らくアクタの)アニメーションが終わるまで待つ
- FinishInterpolation(): 現在のInterpolationPoint movementが完了するまで待つ
他にもあるかも
ラベルとgoto('')
stateコードのラベル名は基本的に自由だか、Beginという名前は予約されている。Beginラベルはその状態に遷移したときに実行を開始するラベルである。
また、goto('')はstateコードの実行を中断し、同一状態内の別のラベルか次の状態に遷移するまで何もしない。
状態の遷移
状態の遷移はGotoState('状態名', 'ラベル名')を用いる。第二引数のラベル名は省略でき、その場合Beginラベルに遷移する。