|
|
|
@ -196,15 +196,28 @@ namespace TNodeCore.Runtime.Components{ |
|
|
|
|
ModifyOrCreateInNode(linkData); |
|
|
|
|
ModifyOrCreateOutNode(linkData); |
|
|
|
|
} |
|
|
|
|
//iterate nodes and create runtime nodes |
|
|
|
|
foreach (var nodeData in graphData.NodeDictionary.Values){ |
|
|
|
|
CreateRuntimeNodeIfNone(nodeData); |
|
|
|
|
} |
|
|
|
|
var nodeList = RuntimeNodes.Values; |
|
|
|
|
_graphTool = new GraphTool(nodeList.ToList(),RuntimeNodes,this); |
|
|
|
|
var sceneNodes = RuntimeNodes.Values.Where(x => x.NodeData is SceneNodeData).Select(x => x.NodeData as SceneNodeData); |
|
|
|
|
foreach (var sceneNode in sceneNodes){ |
|
|
|
|
if (sceneNode != null) sceneNode.BlackboardData = runtimeBlackboardData; |
|
|
|
|
} |
|
|
|
|
#if UNITY_EDITOR |
|
|
|
|
BuildSceneNode(); |
|
|
|
|
#endif |
|
|
|
|
_build = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void CreateRuntimeNodeIfNone(NodeData nodeData){ |
|
|
|
|
if (RuntimeNodes.ContainsKey(nodeData.id)) return; |
|
|
|
|
var runtimeNode = new RuntimeNode(nodeData); |
|
|
|
|
RuntimeNodes.Add(nodeData.id,runtimeNode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Cast the node data to a runtime node |
|
|
|
|
/// </summary> |
|
|
|
@ -224,6 +237,8 @@ namespace TNodeCore.Runtime.Components{ |
|
|
|
|
/// <param name="id"></param> |
|
|
|
|
/// <returns></returns> |
|
|
|
|
public RuntimeNode Get(string id){ |
|
|
|
|
if(!_build) |
|
|
|
|
Build(); |
|
|
|
|
if (RuntimeNodes.ContainsKey(id)){ |
|
|
|
|
return RuntimeNodes[id]; |
|
|
|
|
} |
|
|
|
@ -246,6 +261,57 @@ namespace TNodeCore.Runtime.Components{ |
|
|
|
|
_graphTool.DirectlyTraversal(); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
#region build scene node data |
|
|
|
|
#if UNITY_EDITOR |
|
|
|
|
public void BuildSceneNodePersistentData(SceneNodeData sceneNodeData){ |
|
|
|
|
var tr = transform.Find("PersistentData"); |
|
|
|
|
GameObject go; |
|
|
|
|
if (tr == null){ |
|
|
|
|
go = new GameObject("PersistentData"); |
|
|
|
|
go.transform.SetParent(transform); |
|
|
|
|
go.AddComponent<SceneDataPersistent>(); |
|
|
|
|
} |
|
|
|
|
go = tr.gameObject; |
|
|
|
|
var persistentData = go.GetComponent<SceneDataPersistent>(); |
|
|
|
|
persistentData.SceneNodeDataDictionary.Add(sceneNodeData.id,sceneNodeData); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void BuildSceneNode(){ |
|
|
|
|
var fetchedSceneNode = graphData.NodeDictionary.Values.Where(x => x is SceneNodeData and not BlackboardDragNodeData); |
|
|
|
|
var scenePersistent = transform.Find("PersistentData").GetComponent<SceneDataPersistent>(); |
|
|
|
|
foreach (var nodeData in fetchedSceneNode){ |
|
|
|
|
if (scenePersistent.SceneNodeDataDictionary.ContainsKey(nodeData.id)){ |
|
|
|
|
var sceneNodeData = scenePersistent.SceneNodeDataDictionary[nodeData.id]; |
|
|
|
|
RuntimeNodes[nodeData.id].NodeData = sceneNodeData; |
|
|
|
|
} |
|
|
|
|
else if (nodeData.Clone() is SceneNodeData clonedNodeData){ |
|
|
|
|
clonedNodeData.BlackboardData = runtimeBlackboardData; |
|
|
|
|
RuntimeNodes.Remove(nodeData.id); |
|
|
|
|
RuntimeNodes.Add(nodeData.id,new RuntimeNode(clonedNodeData)); |
|
|
|
|
BuildSceneNodePersistentData(clonedNodeData); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
UpdatePersistentData(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void UpdatePersistentData(){ |
|
|
|
|
var persistentData = transform.Find("PersistentData")?.GetComponent<SceneDataPersistent>(); |
|
|
|
|
if (persistentData == null) return; |
|
|
|
|
var fetchedSceneNode = |
|
|
|
|
RuntimeNodes |
|
|
|
|
.Where(x => x.Value.NodeData is SceneNodeData and not BlackboardDragNodeData) |
|
|
|
|
.Select(x=>x.Value.NodeData).ToArray(); |
|
|
|
|
|
|
|
|
|
var dic = persistentData.SceneNodeDataDictionary; |
|
|
|
|
foreach (var sceneNodeData in dic.Values){ |
|
|
|
|
if(!fetchedSceneNode.Contains(sceneNodeData)){ |
|
|
|
|
persistentData.SceneNodeDataDictionary.Remove(sceneNodeData.id); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
#endregion |
|
|
|
|
|
|
|
|
|
private void ModifyOrCreateInNode(NodeLink linkData){ |
|
|
|
|
var inNodeId = linkData.inPort.nodeDataId; |
|
|
|
|
var inNode = graphData.NodeDictionary[inNodeId]; |
|
|
|
@ -329,6 +395,28 @@ namespace TNodeCore.Runtime.Components{ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class SceneDataPersistent:MonoBehaviour,ISerializationCallbackReceiver{ |
|
|
|
|
|
|
|
|
|
public readonly Dictionary<string,SceneNodeData> SceneNodeDataDictionary = new(); |
|
|
|
|
|
|
|
|
|
[SerializeReference] |
|
|
|
|
public List<SceneNodeData> sceneNodeData=new (); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void OnBeforeSerialize(){ |
|
|
|
|
sceneNodeData.Clear(); |
|
|
|
|
foreach(var node in SceneNodeDataDictionary.Values){ |
|
|
|
|
sceneNodeData.Add(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public void OnAfterDeserialize(){ |
|
|
|
|
SceneNodeDataDictionary.Clear(); |
|
|
|
|
foreach(var node in sceneNodeData){ |
|
|
|
|
SceneNodeDataDictionary.Add(node.id,node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public enum ProcessingStrategy{ |
|
|
|
|
BreadthFirst, |
|
|
|
|
DepthFirst |
|
|
|
|