Page 1 of 1

StateBehaviourへの初期化用Callbackメソッド

Posted: 2016/03/29 18:00
by nice
お世話になっております。
(質問に引き続き、連投となってしまい申し訳ございません…)

StateBehaviourに、例えばGetCompornentや他Stateに対するGetBehaviourをした結果を
メンバ変数に入れるような用途に適した、初期化用Callbackメソッドを追加していただくことは可能でしょうか?

最初、通常のMonobehaviourと同様に、Startに実装すればよいかとも考えましたが、
現状、OnStateBegin→Startという順番で呼ばれておりますので、
初回のOnStateBegin呼び出し時点では、まだ初期化処理が動く前となってしまいます。

OnStateBeginにて上記のような初期化処理を実装するのも考えましたが、
Startとは違い、OnStateBeginは呼ばれますので、毎回GetCompornent/GetBehaviourをするのが
少し気になってしまっています。
また、他に何か値を持っていた場合も、それらの値が状態遷移ごとに初期化されてしまいます。

Awakeも考えましたが、このタイミングではGetCompornent/GetBehaviourに失敗する(nullが返る)こともありえると思います。

そのため、例えばですが、初回のOnStateBegin呼び出し直前などに一度だけ呼ばれる等、
何か初期化用のCalbackメソッドを用意していただけると嬉しいです。

ご検討頂けると幸いです。
また、他に良い方法がありましたら、ご教示頂けると助かります。
それでは、よろしくおねがいします。

Re: StateBehaviourへの初期化用Callbackメソッド

Posted: 2016/03/29 18:14
by nice
すみません。
やや雑然とした書き方になってしまったので、以下に整理させて頂きます。

お伝えしたかった要望の内容としては、
 ・Startのような初期化に用いることが出来るoverride可能なメソッドが欲しい
 ・そのメソッドはOnStateBeginより前のタイミングで呼ばれて欲しい
 ・かつ、そのメソッドは一度だけ呼ばれて欲しい
となります。

また、先のPostの「Callback」は誤用でした…。混乱させてしまいましたら申し訳ございません。

何卒、ご検討よろしくおねがいします。

Re: StateBehaviourへの初期化用Callbackメソッド

Posted: 2016/03/30 02:04
by caitsithware
OnStateBeginの呼び出しタイミングはOnEnableの直後(enabledをtrueにした直後)なので、Start前に呼び出されてしまうのはUnityの仕様上の問題ですね。
イベント関数の実行順

初期化用Callbackメソッドについて検討いたしますが、次回更新がいつになるかはちょっとお約束できないので、その点についてはご容赦いただければと。

また、個人的に、このような呼び出し順の問題を対処するなら、という程度の話ですが、

Code: Select all

Component _CachedComponent;
Component cachedComponent
{
    get {
        if( _CachedComponent == null )
        {
            _CachedComponent = GetComponent~
        }
        return _CachedComponent;
    }
}
とかやっておいて、参照する際はすべてcachedComponent介すようにしておいたりします。
数によってはかなりの手間になってしまいますが、もしよろしければこの方法もご検討ください。

Re: StateBehaviourへの初期化用Callbackメソッド

Posted: 2017/01/05 15:44
by nice
お返事、ありがとうございます。

初期化用メソッドについて検討していただけるとの事で、感謝致します。
次回更新時期について現時点では未定であることも了解いたしました。
どうぞ無理せずご自愛下さい。

また、cachedComponentについてもご提案頂きありがとうございます。
初回使用時にのみGetComponentする仕組みなのですね。大変参考となります!
この方法を是非使わせていただきます。

それでは、ありがとうございました。