A_rosuko wrote: ↑2019/05/15 16:12
FixedUpdateは物理を使う場合はほぼ条件反射的に使っていたのでうまく説明できるかわかりませんが
具体的な利点としては下記の2つでしょうか。
1、一定間隔で更新される。
特殊なケースかもしれませんが、速度の計算で固定フレームの方が少し楽できます。
敵の移動先に向かって偏差射撃するなど。
2、物理の更新タイミングと同期している。
物理の更新タイミングに合わせて確実に1回だけ処理したい場合に向いています。
押すとか移動するとか0回でも2回以上でもダメな場合。
概ね私の理解と同じかと思いますが、「2、物理の更新タイミングと同期している」の方が要点となっていますね。
「1、一定間隔で更新される。」は物理計算においては固定フレームでの呼び出しが最適、という意味では理解しています。
ちなみに、UpdateとFixedUpdateの使い分けについては、以下の記事が参考になります。
[Unity] InputとFixedUpdateと物理演算の関係を整理しよう
Input関連の組み込みスクリプトもありますので、OnStateUpdateがFixedUpdateから呼ばれると問題が起きそう、という感じですね。
Input関連以外も組み込みスクリプトは多数あるので、実際にどれに問題があるかを検証するコストを考えると対応は難しいかと思います。
一応Input関連の判定自体はUpdateで処理していますが、どのみち全スクリプトをFixedUpdate版で検証するコストは発生しますので。
(逆に、本来FixedUpdateで処理したほうが良いものをUpdateで処理してしまってる場合もありますが、それは気づき次第個別に対応していきます)
別案として、OnStateFixedUpdateを追加しArborFSMのFixedUpdateから常に呼ばれるようにする、というのも考えられますが、
スクリプト自作するならFixedUpdateそのものが書けるので、今のところ必要性はあまりないと思います。
A_rosuko wrote: ↑2019/05/15 16:12
書き終えてからUpdateSettings.typeがManualの存在に気が付いたのですが
ExecuteUpdate(false)をFixedUpdateから実行してはいけない感じでしょうか?
同様に組み込みスクリプトが想定していないということで・・・。
Manualはグラフの階層化対応の際に、親グラフのUpdateSettingsに依存して動作する仕組みが必要になって追加した感じです。
InputとFixedUpdateの記事にある問題は同様に付いてきますので、「FixedUpdateから実行してはいけない」とまでは言いませんが推奨できない方法となります。
使う分には自由に使っていただいても構いませんが、あくまで自己責任でお願いいたします。
まとめ
こちらが感じている問題点をまとめますと、以下ようになります。
- 組み込みスクリプトを使用する場合にFixedUpdateから呼び出されることを考慮していないので、対応したら全組み込みスクリプトの再検証作業が発生する。
- FSM全体の更新をFixedUpdateで使用する利点がよくわからない(物理計算に関連するところだけFixedUpdateのスクリプト書けば済みそう、という考え)。
- 特殊なロジックを組む際、組み込みスクリプトのみ(スクリプトを一切自作しない)でFSMを使用することも想定していないので、必要に応じてスクリプトを書いていただきたい。
という感じです。
1の検証コストも重要ですが、2の全体更新についての私の理解不足もあって、現状頭に?が並んでいる感じです。
今後も、この件について必要性を感じましたら、具体的なグラフのスクリーンショットなども交えて問題点の共有と改善策を練っていけたら良いなと思います。