はじめに
この記事はHamster Output Advent Calendar 2024の8日目の記事です!
今回は数日間悩んだ、Arbor3のParameterContainerの値が変更できない問題の解決方法を記事にしたいと思います。
結論:同じオブジェクトに付けない
画像のように、ArborFSM(StateMachine)、BehaviourTree、ParameterContainerを同じGameObjectに付けていると...値が、変わらない問題が起きます。
解決方法はシンプルで、1つのGameObjectから分ければ解決します。この場合、子階層のGameObjectに変更するだけで問題は解決できます。
気づいたきっかけ
ParameterContainerのドキュメントを発見し、○○○ParameterReferenceで値を参照するという方法を見つけました。
今まで、自分はSet○○○(○○○, 値);のようにSetメソッドを使って値を変更すると思っていましたが、ParameterReferenceでも値を変更できるということが分かりました。
実際に確認した
ParameterReferenceにはSerializeField属性をつけて、インスペクタからどのParameterContainerが参照できるのか確認できます。なので、それぞれのParameterContainerに値を作成してどれが参照出来ているのか実験をして見ます!
今回、ArborFSM(StateMachine)、BehaviourTree、ParameterContainerの3つを付けているので、それぞれに、bool変数でState、Behaviour、Parameterという値を作ります。
そしてParameterReferenceの参照先を確認をして見ると...
3つ付けてるのに1つしか参照出来ていない! ということが分かりました。どういう基準で選ばれているのかは謎ですが、同じGameObjectに付けると駄目みたいです。
まとめ
同じGameObjectにArborFSM(StateMachine)、BehaviourTree、ParameterContainerをアタッチしていると、ParameterContainerを参照したい時に参照先が分からなくなるので、なるべく分けよう!
雑メモ
・Set○○○が反応しなかった理由
Setメソッドが反応しなかった原因として、参照していたParameterContainerが、違った可能性が高い。それでも、何も情報が無かったら例外やエラー辺りが出てもおかしくはない気がするけども...?
・UnityObjectでコンポーネントを持たせる
ParameterContainerにコンポーネントを持たせたい場合、UnityObjectというのを利用する。
画像のではAnimatorが選択されているが自分で設定をする必要があり、何も設定していないと、ArborEditor上でコンポーネントが認識されないので注意が要りそう。