Page 1 of 1

ビヘイビアーツリー外から変数を取得したい

Posted: 2021/11/20 14:50
by namnum3785
オブジェクトAのビヘイビアーツリー内にある変数をオブジェクトB内のスクリプトから取得、変更したいです。
(こちらの質問と反対のことをしたいですviewtopic.php?f=3&t=2566

この場合、どうすれば良いでしょうか。

初歩的な質問で申し訳ありませんが、よろしくお願い致します

Re: ビヘイビアーツリー外から変数を取得したい

Posted: 2021/11/20 23:13
by caitsithware
ビヘイビアツリー内のノード用スクリプトの変数を参照したい、ということですね。

流れは「オブジェクトBのスクリプトからオブジェクトAのスクリプトを参照する」という形ですので
他のオブジェクトの変数の参照と基本的な流れは同じとなります。

例スクリプト : ObjectAAction.cs

Code: Select all

using UnityEngine;
using Arbor.BehaviourTree;

public class ObjectAAction : ActionBehaviour
{
	public int testInt = 0;

	protected override void OnExecute() 
	{
		if (Input.GetKeyDown(KeyCode.Space)) // スペースキー押すたびに1増やすテスト
		{
			testInt++;
		}
	}
}
例スクリプト : ObjectBBehaviour.cs

Code: Select all

using UnityEngine;

public class ObjectBBehaviour : MonoBehaviour
{
	public ObjectAAction objectA;

    void Update()
    {
		int testInt = objectA.testInt;
		Debug.Log(testInt); // testIntの値をコンソールにデバッグ出力してみるテスト。
	}
}
流れ

上記2つのスクリプトがあるとして、
  • オブジェクトAのビヘイビアツリーにObjectAActionを追加。
    ObjectA_BehaviourTree.png
    ObjectA_BehaviourTree.png (19.64 KiB) Viewed 3747 times
  • オブジェクトBにObjectBBehaviourを追加。
  • オブジェクトBのInspectorのobjectAフィールドに、ビヘイビアツリーに追加しておいたObjectAActionをドラッグアンドドロップ。
     ※ArborEditorWindowで表示しているグラフ内からスクリプトのタイトルバー部分(ノード名部分ではなく)をドラッグアンドドロップできます
    ObjectB_Inspector.png
    ObjectB_Inspector.png (20.45 KiB) Viewed 3747 times
※ノード用スクリプトのタイトルバー部分をオブジェクト参照フィールドへドラッグアンドドロップは、StateBehaviourなどの他スクリプトでも可能です(ただし演算ノードはタイトルバー部分がないため非対応)

Re: ビヘイビアーツリー外から変数を取得したい

Posted: 2021/11/21 02:14
by namnum3785
丁寧な対応ありがとうございます。
追加の質問で申し訳ないのですが、AgentMoveToTransform内の変数_TargetTransformを参照するにはどうしたらよいでしょうか。

エラー CS0029 型 'UnityEngine.Transform' を 'Arbor.FlexibleTransform' に暗黙的に変換できません

というエラーが出てしまい困っています。

Re: ビヘイビアーツリー外から変数を取得したい

Posted: 2021/11/21 05:51
by caitsithware
まずAgentMoveToTransformの_TargetTransformはprivateですので外部から参照できません。
publicに書き換えるかReflectionで無理やりに参照することもできますが今後の更新による互換性も考慮するとお勧めはできません。
どちらも自己責任でお願いいたします。
namnum3785 wrote: 2021/11/21 02:14 エラー CS0029 型 'UnityEngine.Transform' を 'Arbor.FlexibleTransform' に暗黙的に変換できません
もしpublicに書き換えたうえで上記のようなエラーが出る場合は、FlexibleTransformのキャストオペレーターかvalueを参考にしてみてください。

具体的には、

Code: Select all

Transform transform = _TargetTransform.value;
もしくは

Code: Select all

Transform transform = (Transform)_TargetTransform;
という形で取得できます。
(逆にFlexibleTransformが参照するTransformを外部スクリプトから書き換えるのは想定外の使用方法ですのでここでは割愛します)

この辺りはC#の基本的な文法に関する部分ですので、一通り基礎的なところも学ばれることをお勧めいたします。
また、ノード内スクリプトの変数を直接参照しなければならない設計で本当に良いのかの見直し(ParameterContainerを介すなど)も一度考えてみた方がよろしいかと思います。

Re: ビヘイビアーツリー外から変数を取得したい

Posted: 2021/11/21 08:18
by namnum3785
大変わかりやすい説明ありがとうございました。
今度ともよろしくお願い致します。