public void SaveGraph(BTDataContainer containerCache) { // Generate data container BTDataContainer btContainer = ScriptableObject.CreateInstance <BTDataContainer>(); // Save nodes to container if (!SaveNodes(btContainer, containerCache.name)) { return; } btContainer.globalData = _targetGraphView.contextField.value as GlobalData; // Put savefile in Assets/BTResources if (!AssetDatabase.IsValidFolder("Assets/BehaviourTrees")) { AssetDatabase.CreateFolder("Assets", "BehaviourTrees"); } if (!AssetDatabase.IsValidFolder("Assets/BehaviourTrees/Resources")) { AssetDatabase.CreateFolder("Assets/BehaviourTrees", "Resources"); } AssetDatabase.CreateAsset(btContainer, $"Assets/BehaviourTrees/Resources/{containerCache.name}.asset"); AssetDatabase.SaveAssets(); }
public void ConstructBehaviourTree(BaseAI owner) { btDataInstance = ScriptableObject.Instantiate(btData); CreateNewContext(owner); topNodeInstance = InitializeNodes(GetTopNode()).compositeInstance; }
// Saves nodes private bool SaveNodes(BTDataContainer btContainer, string fileName) { // If there are no connections then display error if (!edges.Any()) { EditorUtility.DisplayDialog("No connections", "Create some connections in your tree before saving!", "Ok"); return(false); } // Save node connections Edge[] connectedPorts = edges.Where(x => x.input.node != null).ToArray(); for (int i = 0; i < connectedPorts.Length; i++) { BTEditorNode outputNode = connectedPorts[i].output.node as BTEditorNode; BTEditorNode inputNode = connectedPorts[i].input.node as BTEditorNode; btContainer.nodeLinks.Add(new NodeLinkData { BaseNodeGuid = outputNode.GUID, PortName = connectedPorts[i].output.portName, TargetNodeGuid = inputNode.GUID }); } // Save individual node data foreach (BTEditorNode node in nodes) { NodeData temp = new NodeData { nodeTitle = node.title, nodeName = node.nodeName, GUID = node.GUID, Position = node.GetPosition().position, nodeType = (int)node.nodeType, topNode = node.topNode }; if (node.compositeInstance != null) { temp.compositeInstance = (Composite)SaveNode(node.title + node.GUID, node.compositeInstance, fileName); } else if (node.decoratorInstance != null) { temp.decoratorInstance = (Decorator)SaveNode(node.title + node.GUID, node.decoratorInstance, fileName); } else if (node.actionInstance != null) { temp.actionInstance = (Action)SaveNode(node.title + node.GUID, node.actionInstance, fileName); } btContainer.nodeData.Add(temp); } return(true); }
public void LoadGraph(BTDataContainer containerCache) { // Load data based on filename _containerCache = containerCache; if (_containerCache == null) { EditorUtility.DisplayDialog("File Not Found", "Given file does not exist :(", "Ok"); return; } ClearGraph(); CreateNodes(); ConnectNodes(); _targetGraphView.contextField.value = _containerCache.globalData; }
/// <summary> /// Loads savedata into graph view (overwrites active graph) /// </summary> /// <param name="fileName"></param> public void LoadGraph(string fileName) { // Load data based on filename _containerCache = Resources.Load <BTDataContainer>(fileName); BTEditorWindow.SetFileLoadFieldValue(_containerCache); if (_containerCache == null) { EditorUtility.DisplayDialog("File Not Found", "Given file does not exist :(", "Ok"); return; } ClearGraph(); CreateNodes(); ConnectNodes(); _targetGraphView.contextField.value = _containerCache.globalData; }
/// <summary> /// Returns list of child nodes based on node GUID /// </summary> /// <param name="nodeGUID"></param> /// <returns></returns> public List <BTEditorNode> GetChildNodes(string nodeGUID, string fileName) { // Update cache to contain current nodes SaveGraph(fileName); _containerCache = Resources.Load <BTDataContainer>(fileName); List <NodeLinkData> connections = _containerCache.nodeLinks.Where(x => x.BaseNodeGuid == nodeGUID).ToList(); // Get connections from active container cache List <BTEditorNode> childNodes = new List <BTEditorNode>(); // Loop through connections for a given node and find its child nodes via GUID matching for (int i = 0; i < connections.Count; i++) { string targetNodeGUID = connections[i].TargetNodeGuid; BTEditorNode targetNode = nodes.First(x => x.GUID == targetNodeGUID); childNodes.Add(targetNode); } return(childNodes); }
public static void SetFileLoadFieldValue(BTDataContainer btContainer) { fileLoadField.value = btContainer; }