Esempio n. 1
0
        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();
        }
Esempio n. 2
0
    public void ConstructBehaviourTree(BaseAI owner)
    {
        btDataInstance = ScriptableObject.Instantiate(btData);

        CreateNewContext(owner);

        topNodeInstance = InitializeNodes(GetTopNode()).compositeInstance;
    }
Esempio n. 3
0
        // 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);
        }
Esempio n. 4
0
        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;
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
 public static void SetFileLoadFieldValue(BTDataContainer btContainer)
 {
     fileLoadField.value = btContainer;
 }