TaskGraphAsset内で使用したNodeComponentが初期化されるタイミング
Posted: 2025/04/05 20:47
お世話になっております。
NodeComponentをTaskGraphAsset内で使用した場合に、メンバ変数がシーン切り替え後も初期化されない現象を確認しました。
同じNodeComponentをLogicBehaviorやLogicAsset内で直接使用した場合には発生しませんでした。
作成したグラフの一部を後からTaskGraphAsset化した場合、元と異なる動作になる可能性があります。
そのため、もし可能でしたらLogicBehavior(LogicAsset)内のNodeComponentが初期化されるタイミングで
そのLogicBehavior(LogicAsset)が参照しているTaskGraphAssetも初期化されるような仕組みをご検討いただけますと幸いです。
ただ、運用やスクリプティングで対処できる内容でもありますので、
他のユーザーの方々への影響が大きいようでしたら現状のままでも問題ございません。
■環境
Unity:6000.0.40f1
LogicToolkit:1.8.1
■再現方法
再現用のコードは以下になります。
Unityエディタからシーンを再生し、その後同じシーンをSceneManager.LoadSceneAsync()でロードすると、
TaskGraphAsset内で使用したServiceComponentのみメンバ変数valueが初期化されずtrueが出力されました。
メンバ変数valueの初期値を出力するServiceComponent
実行結果(下3件がシーン再読み込み後の結果)
再現に使用したノードグラフ
再現に使用したTaskGraphAsset(InvokeTest)
私の場合はステージのリトライ機能をシーン再読み込みで実現しており、
再読み込み後にComponentNodeのメンバ変数をリセットしたかっただけなので、
以下のようにLogicPlayerが削除されたらリセットすることで対処できました。
LogicPlayerが削除されたらメンバ変数を初期化するServiceComponent
NodeComponentをTaskGraphAsset内で使用した場合に、メンバ変数がシーン切り替え後も初期化されない現象を確認しました。
同じNodeComponentをLogicBehaviorやLogicAsset内で直接使用した場合には発生しませんでした。
作成したグラフの一部を後からTaskGraphAsset化した場合、元と異なる動作になる可能性があります。
そのため、もし可能でしたらLogicBehavior(LogicAsset)内のNodeComponentが初期化されるタイミングで
そのLogicBehavior(LogicAsset)が参照しているTaskGraphAssetも初期化されるような仕組みをご検討いただけますと幸いです。
ただ、運用やスクリプティングで対処できる内容でもありますので、
他のユーザーの方々への影響が大きいようでしたら現状のままでも問題ございません。
■環境
Unity:6000.0.40f1
LogicToolkit:1.8.1
■再現方法
再現用のコードは以下になります。
Unityエディタからシーンを再生し、その後同じシーンをSceneManager.LoadSceneAsync()でロードすると、
TaskGraphAsset内で使用したServiceComponentのみメンバ変数valueが初期化されずtrueが出力されました。
メンバ変数valueの初期値を出力するServiceComponent
Code: Select all
using LogicToolkit;
using UnityEngine;
internal class TestServiceComponent : ServiceComponent
{
[SerializeField]
LogicToolkit.InputField<string> name;
private bool value = false;
protected override void OnActivated()
{
base.OnActivated();
Debug.Log($"OnActivated({name.Value}):{value}");
value = true;
}
}
私の場合はステージのリトライ機能をシーン再読み込みで実現しており、
再読み込み後にComponentNodeのメンバ変数をリセットしたかっただけなので、
以下のようにLogicPlayerが削除されたらリセットすることで対処できました。
LogicPlayerが削除されたらメンバ変数を初期化するServiceComponent
Code: Select all
using LogicToolkit;
using UnityEngine;
internal class TestServiceComponent : ServiceComponent
{
[SerializeField]
InputField<string> name;
private bool value = false;
MonoBehaviour _parent;
protected override void OnActivated()
{
base.OnActivated();
if (_parent == null)
{
Initialize();
_parent = this.Player;
}
Debug.Log($"OnActivated({name.Value}):{value}");
value = true;
}
private void Initialize()
{
value = false;
}
}