Page 1 of 1

prefabとprefab instanceの同期が失敗してグラフが壊れてしまう問題

Posted: 2024/03/07 04:42
by Boily
unity ver 2022.3.19f1
arbor3 ver 3.10.0

以下、大まかな状況説明です。
prefabにFSMやbehavior treeが実装してあり、そのインスタンスがシーンに配置されている。
インスタンスのグラフを編集し、その変更内容を元のprefabに適用しようと試みる。(modified component > apply to prefab 'name')
インスタンスの変更点が消える。一部または全部のビヘイビアがインスペクタにコンポーネントとして表示される。
prefab側に変更は適用されず。
といった具合に、グラフの構成要素によって挙動が一定でないものの、総じてプレハブとの同期が失敗してしまいます。

以下、エラーメッセージです。
MissingReferenceException: The object of type 'SubBehaviourTree' 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.NodeGraph.DestroyUnusedNodeBehaviour (Arbor.NodeBehaviour behaviour) (at Assets/Plugins/Arbor/Internal/Scripts/NodeGraph.cs:1612)
Arbor.NodeGraph.DestroyUnusedSubComponents () (at Assets/Plugins/Arbor/Internal/Scripts/NodeGraph.cs:1655)
Arbor.NodeGraph.OnValidateDelay () (at Assets/Plugins/Arbor/Internal/Scripts/NodeGraph.cs:1821)
ArborEditor.ComponentEditorProcessor.OnDelayCall () (at Assets/Plugins/Arbor/Internal/Editor/UndoComponentInitializer.cs:112)
UnityEditor.EditorApplication.Internal_CallDelayFunctions () (at <2acbecbc299e4654adc94df891af51f2>:0)

Destroying assets is not permitted to avoid data loss.
If you really want to remove an asset use DestroyImmediate (theObject, true);
UnityEngine.Object:DestroyImmediate (UnityEngine.Object)
Arbor.ComponentUtility:Destroy (UnityEngine.Object) (at Assets/Plugins/Arbor/Internal/Scripts/ComponentUtility.cs:120)
Arbor.NodeGraph:Destroy (Arbor.NodeGraph) (at Assets/Plugins/Arbor/Internal/Scripts/NodeGraph.cs:3404)
ArborEditor.Clipboard:DestroyChildGraphs (Arbor.NodeBehaviour) (at Assets/Plugins/Arbor/Internal/Editor/Clipboard.cs:474)
ArborEditor.Clipboard:DoCopyNodeBehaviour (Arbor.NodeBehaviour,Arbor.NodeBehaviour,bool) (at Assets/Plugins/Arbor/Internal/Editor/Clipboard.cs:629)
ArborEditor.BehaviourTree.ActionBehaviourClipboardProcessor:MoveBehaviour (Arbor.Node,Arbor.NodeBehaviour) (at Assets/Plugins/Arbor/Internal/Editor/BehaviourTree/Clipboards/ActionBehaviourClipboardProcessor.cs:33)
ArborEditor.Clipboard:MoveBehaviour (Arbor.Node,Arbor.NodeBehaviour) (at Assets/Plugins/Arbor/Internal/Editor/Clipboard.cs:701)
ArborEditor.ComponentEditorProcessor:MoveBehaviour (Arbor.Node,Arbor.NodeBehaviour) (at Assets/Plugins/Arbor/Internal/Editor/UndoComponentInitializer.cs:67)
Arbor.ComponentUtility:MoveBehaviour (Arbor.Node,Arbor.NodeBehaviour) (at Assets/Plugins/Arbor/Internal/Scripts/ComponentUtility.cs:231)
Arbor.BehaviourTree.TreeBehaviourNode:OnGraphChanged () (at Assets/Plugins/Arbor/Internal/Scripts/BehaviourTree/TreeBehaviourNode.cs:365)
Arbor.Node:ChangeGraph (Arbor.NodeGraph) (at Assets/Plugins/Arbor/Internal/Scripts/Node.cs:214)
Arbor.NodeGraph:OnValidateDelay () (at Assets/Plugins/Arbor/Internal/Scripts/NodeGraph.cs:1801)
ArborEditor.ComponentEditorProcessor:OnDelayCall () (at Assets/Plugins/Arbor/Internal/Editor/UndoComponentInitializer.cs:112)
UnityEditor.EditorApplication:Internal_CallDelayFunctions ()

Re: prefabとprefab instanceの同期が失敗してグラフが壊れてしまう問題

Posted: 2024/03/07 05:07
by caitsithware
ご報告ありがとうございます。

「Modified Component > Apply to Prefab 'Name'」はそのコンポーネントのみをプレハブに適用する機能ですが、Arbor3では内部的にStateBehaviourなどのコンポーネントを同GameObjectに追加している関係で、ArborFSMやBehaviourTreeに対して行った場合正常動作いたしません。
その機能についてUnityエディタ拡張もできないため、現時点では仕様ということでご理解ください。
お手数おかけしますが、毎度プレハブモードで編集するかInsepectorのヘッダ部にある「Overrides」から「Apply All」ですべてのコンポーネントを適用するようにしてください。

Re: prefabとprefab instanceの同期が失敗してグラフが壊れてしまう問題

Posted: 2024/03/07 07:01
by Boily
お返事ありがとうございます。
仕様ということで承知いたしました。