こんにちは。ヤマヤタケシです。
UnityのJavascriptでState Patternをやるで、ステートパターンについて書きました。
が、使ってみてイマイチだったので、やり方を変えました。
こんな風に。
var count : int = 0; class State { function State( t_init : Function, t_update : Function, t_exit : Function ) { init = t_init ; update = t_update ; exit = t_exit ; } function Init() { init(); } function Update() { update(); } function Exit() { exit(); } var init : Function; var update : Function; var exit : Function; } function MainStateInit() { Debug.Log ( "Main:init" ); } function MainStateUpdate() { Debug.Log ( "Main:update" ); count++; } function MainStateExit() { Debug.Log ( "Main:exit" ); } var mainState = new MainState( MainStateInit, MainStateUpdate, MainStateExit ); function WaitStateInit() { Debug.Log ( "Wait:init" ); } function WaitStateUpdate() { Debug.Log ( "Wait:update" ); } function WaitStateExit() { Debug.Log ( "Wait:exit" ); } var waitState = new WaitState( WaitStateInit, WaitStateUpdate, WaitStateExit ); function StateTest() { Debug.Log( "FunctionTest" ); var s : State; s = mainState; { s.Init(); s.Update(); s.Exit(); } s = waitState; { s.Init(); s.Update(); s.Exit(); } }
以前は継承をベースにしたのですが、それだと変数へ直接アクセスができません。
以前はステートもクラスなので外側のメンバへは親への参照を持たせて、parent.count みたいに書く必要がありました。
まあいいやと思っていましたが、我慢できなくなりFunctionを使うように変更しました。
UnityのJavascriptは(UnityScript)は、Javascriptとはやっぱり違いますね。Function型を使う必要がありました。普通のJavascriptだとJavascritpだと関数は第一級オブジェクトだったのでそのまま代入できたのに。
まだ改良の余地があるかもしれませんが、とりあえず満足して使っています。
そんじゃまた。
ピンバック: UnityのJavascriptでState Patternをやる | ヤマヤタケシのブログ