Page 1 of 1

ArborFSMのプレハブでSetParameterを使用すると、NullReferenceExceptionが発生する

Posted: 2023/09/13 07:14
by ooee
いつもお世話になっています。

件名の不具合に遭遇したので、ご報告いたします。

OS: Windows11
Unityバージョン: 2021.3.30f1
Arborバージョン: 3.9.10
再現方法:
1. ArborFSMのプレハブを作成
2. プレハブでArborFSMをOpen Editorして、SetParameterを追加
3. Arbor Editorで何かしら値を編集すると、以下のエラーが発生する

NullReferenceException
Arbor.NodeBehaviour.get_nodeGraph () (at Assets/Plugins/Arbor/Internal/Scripts/NodeBehaviour.cs:76)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.SetupIsInGraphParameter () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:294)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.SerializeVer1 () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:329)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.Serialize () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:347)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.Arbor.INodeBehaviourSerializationCallbackReceiver.OnBeforeSerialize () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:363)
Arbor.NodeBehaviour.UnityEngine.ISerializationCallbackReceiver.OnBeforeSerialize () (at Assets/Plugins/Arbor/Internal/Scripts/NodeBehaviour.cs:384)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

MissingReferenceException: The object of type 'SetParameterBehaviour' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Arbor.NodeBehaviour.get_nodeGraph () (at Assets/Plugins/Arbor/Internal/Scripts/NodeBehaviour.cs:76)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.SetupIsInGraphParameter () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:294)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.SerializeVer1 () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:329)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.Serialize () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:347)
Arbor.ParameterBehaviours.SetParameterBehaviourInternal.Arbor.INodeBehaviourSerializationCallbackReceiver.OnAfterDeserialize () (at Assets/Plugins/Arbor/Internal/Scripts/StateMachine/ParameterBehaviours/SetParameterBehaviourInternal.cs:368)
Arbor.NodeBehaviour.UnityEngine.ISerializationCallbackReceiver.OnAfterDeserialize () (at Assets/Plugins/Arbor/Internal/Scripts/NodeBehaviour.cs:393)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

現在は、SetParameterのかわりにCalcParameterを代用しています。

Re: ArborFSMのプレハブでSetParameterを使用すると、NullReferenceExceptionが発生する

Posted: 2023/09/13 08:03
by caitsithware
ご報告ありがとうございます。

こちらでも再現確認できました。
Unity側のプレハブ周りの仕様変更の関係か、Projectウィンドウのプレハブを直接Arbor Editorで開いて編集している場合に正常にシリアライズが行われないタイミングが発生する問題が起きているのを確認しました。
プレハブの直接編集ではSetParameterに限らず他にも何かしらの問題が起きている可能性もありそうです。
また、プレハブをダブルクリックしプレハブモードに切り替えてからHierachy上のオブジェクトを選択&編集した場合は再現しませんでした。
根本的な原因を調査の上修正いたします。

暫定対処方法
  1. プレハブをダブルクリックしプレハブモードに切り替える
  2. Hierachy上のオブジェクトを選択しInspectorのOpen Editorボタンをクリック
  3. Arbor Editorで編集する

Re: ArborFSMのプレハブでSetParameterを使用すると、NullReferenceExceptionが発生する

Posted: 2023/09/15 03:03
by caitsithware
根本的な原因を調査したところ、Unityの不具合の可能性があったためUnityへバグレポートを送信いたしました。
この不具合が直るまでプレハブの直接編集ができないのも辛いかと思いますので次回更新時に以下の回避策を組み込みます。

回避策
  1. Assets/Plugins/Arbor/Internal/Scripts/NodeBehaviour.csをコードエディタで開く。
  2. 381行目(OnBeforeSerializeメソッド内の先頭)に以下コードを追加。

    Code: Select all

    try
    {
    	if (this == null)
    		return;
    }
    catch
    {
    	return;
    }
    
  3. 399行目(OnAfterDeserializeメソッド内の先頭)にも同様のコードを追加。

    Code: Select all

    try
    {
    	if (this == null)
    		return;
    }
    catch
    {
    	return;
    }
    

Re: ArborFSMのプレハブでSetParameterを使用すると、NullReferenceExceptionが発生する

Posted: 2023/09/17 05:24
by ooee
回避策を問題が発生している手持ちのプロジェクトで確認したところ、エラーが発生しなくなりました。

確認ありがとうございました。