Esempio n. 1
0
        public MyBehaviorTree TryGetBehaviorTreeForBot(IMyBot bot)
        {
            BTData data = null;

            this.m_BTDataByName.TryGetValue(this.m_botBehaviorIds[bot], out data);
            return((data == null) ? null : data.BehaviorTree);
        }
Esempio n. 2
0
        BehaviourNodeGUI NewNode(BTData data)
        {
            BehaviourMeta meta = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(data.m_Type, data.m_Name);

            if (meta == null || (meta.NodeType != EBTNodeType.task && meta.NodeType != EBTNodeType.controller))
            {
                return(null);
            }
            BehaviourNodeGUI bnode = new BehaviourNodeGUI(this);

            bnode.Self = new BehaviourNodeGUI.Decorator(data.m_Id, meta);
            bnode.Self.ParseData(data.m_JsonData);
            if (data.m_Services != null)
            {
                for (int i = 0; i < data.m_Services.Length; i++)
                {
                    BTData serv = BehaviourAsset.GetDataById(data.m_Services[i]);
                    if (serv == null)
                    {
                        continue;
                    }
                    BehaviourMeta bm = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(EBTNodeType.service, serv.m_Name);
                    if (bm != null)
                    {
                        BehaviourNodeGUI.Decorator decor = new BehaviourNodeGUI.Decorator(serv.m_Id, bm);
                        decor.ParseData(serv.m_JsonData);
                        bnode.services.Add(decor);
                    }
                }
            }
            if (data.m_Conditions != null)
            {
                for (int i = 0; i < data.m_Conditions.Length; i++)
                {
                    BTData cond = BehaviourAsset.GetDataById(data.m_Conditions[i]);
                    if (cond == null)
                    {
                        continue;
                    }
                    BehaviourMeta bm = BehaviourModuleManager.GetOrNewInstance().FindBTMeta(EBTNodeType.condition, cond.m_Name);
                    if (bm != null)
                    {
                        BehaviourNodeGUI.Decorator decor = new BehaviourNodeGUI.Decorator(cond.m_Id, bm);
                        decor.NotFlag = cond.m_NotFlag;
                        decor.ParseData(cond.m_JsonData);
                        bnode.conditions.Add(decor);
                    }
                }
            }
            Rect r = new Rect();

            r.size          = bnode.CalculateLocalSize();
            r.position      = data.m_Pos - Vector2.right * r.size.x * 0.5f;
            bnode.LocalRect = r;
            return(bnode);
        }
Esempio n. 3
0
        void ImportTreeData()
        {
            for (int i = 0; i < BehaviourAsset.m_Datas.Length; i++)
            {
                BehaviourNodeGUI node = NewNode(BehaviourAsset.m_Datas[i]);
                if (node != null)
                {
                    TreeGraph.AddNode(node);
                    TreeCanvas.AddElement(node);
                }
            }
            int id = 0;
            FilterDelegate <PaintElement> filter = (x) =>
            {
                BehaviourNodeGUI bx = x as BehaviourNodeGUI;
                return(bx != null && bx.Self.BTId == id);
            };

            for (int i = 0; i < BehaviourAsset.m_Datas.Length; i++)
            {
                BTData data = BehaviourAsset.m_Datas[i];
                id = data.m_Id;
                BehaviourNodeGUI gnode = TreeGraph.FindNode(filter) as BehaviourNodeGUI;
                if (gnode == null)
                {
                    continue;
                }
                int len = data.m_Children == null ? 0 : data.m_Children.Length;
                for (int j = 0; j < len; j++)
                {
                    id = data.m_Children[j];
                    BehaviourNodeGUI gchild = TreeGraph.FindNode(filter) as BehaviourNodeGUI;
                    if (gchild != null)
                    {
                        TreeGraph.AddPath(0, gnode, gchild);
                    }
                }
            }
            id = BehaviourAsset.m_RootNodeId;
            BehaviourNodeGUI root = TreeGraph.FindNode(filter) as BehaviourNodeGUI;

            if (root != null)
            {
                TreeGraph.AddPath(0, mRootGUI, root);
            }

            for (int i = 0; i < BehaviourAsset.m_Comments.Length; i++)
            {
                BehaviourCommentGUI comment = new BehaviourCommentGUI(this);
                comment.Comment   = BehaviourAsset.m_Comments[i].m_Comment;
                comment.LocalRect = BehaviourAsset.m_Comments[i].m_Rect;
                CommentCanvas.AddElement(comment);
            }
        }
Esempio n. 4
0
        public MyBehaviorTree TryGetBehaviorTreeForBot(IMyBot bot)
        {
            BTData data = null;

            m_BTDataByName.TryGetValue(m_botBehaviorIds[bot], out data);
            if (data != null)
            {
                return(data.BehaviorTree);
            }
            Debug.Assert(false, "Behavior not found");
            return(null);
        }
Esempio n. 5
0
        private bool BuildBehaviorTree(MyBehaviorDefinition behaviorDefinition)
        {
            if (this.m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId))
            {
                return(false);
            }
            MyBehaviorTree behaviorTree = new MyBehaviorTree(behaviorDefinition);

            behaviorTree.Construct();
            BTData data = new BTData(behaviorTree);

            this.m_BTDataByName.Add(behaviorDefinition.Id.SubtypeId, data);
            return(true);
        }
            public BTNodeBase Instantiate(BehaviourTreeRunner btree, BehaviourTreeAsset asset)
            {
                BTNodeBase node = null;

                if (m_Type == EBTNodeType.task)
                {
                    node = new BTTask(m_Id, BehaviourLibrary.NewTask(m_Name, m_Id));
                }
                else if (m_Type == EBTNodeType.controller)
                {
                    node = BehaviourLibrary.NewController(m_Name, m_Id);
                }
                if (node != null)
                {
                    node.InitData(btree, m_JsonData);
                    node.InitDecoratorSize(m_Conditions == null ? 0 : m_Conditions.Length, m_Children == null ? 0 : m_Children.Length, m_Services == null ? 0 : m_Services.Length);
                    for (int i = 0; i < node.ConditionLength; i++)
                    {
                        BTData data = asset.GetDataById(m_Conditions[i]);
                        if (data == null)
                        {
                            continue;
                        }
                        node.SetNotFlag(i, data.m_NotFlag);
                        BTConditionBase cond = BehaviourLibrary.NewCondition(data.m_Name, data.m_Id);
                        if (cond != null)
                        {
                            cond.OnInitData(btree, data.m_JsonData);
                            node.SetCondition(i, cond);
                        }
                    }
                    for (int i = 0; i < node.ServiceLength; i++)
                    {
                        BTData data = asset.GetDataById(m_Services[i]);
                        if (data == null)
                        {
                            continue;
                        }
                        BTServiceBase serv = BehaviourLibrary.NewService(data.m_Name, data.m_Id);
                        if (serv != null)
                        {
                            serv.OnInitData(btree, data.m_JsonData);
                            node.SetService(i, serv);
                        }
                    }
                }
                return(node);
            }
Esempio n. 7
0
        void ExportTreeData()
        {
            List <BTData>       nodes    = new List <BTData>();
            List <PaintElement> children = new List <PaintElement>();
            int rootId = 0;

            for (int i = 0; i < TreeCanvas.ElementCount; i++)
            {
                BehaviourNodeGUI bnode = TreeCanvas.GetElement <BehaviourNodeGUI>(i);
                if (bnode == null)
                {
                    continue;
                }
                if (TreeGraph.GetParent(0, bnode) == mRootGUI)
                {
                    rootId = bnode.Self.BTId;
                }
                BTData data = bnode.ExportNodeData(nodes);

                children.Clear();
                TreeGraph.GetAllChildren(0, bnode, children);
                GlobalUtil.Sort(children, (x, y) => x.LocalRect.center.x <= y.LocalRect.center.x ? -1 : 1);
                data.m_Children = new int[children.Count];
                for (int j = 0; j < children.Count; j++)
                {
                    BehaviourNodeGUI child = children[j] as BehaviourNodeGUI;
                    data.m_Children[j] = child == null ? 0 : child.Self.BTId;
                }
            }
            BehaviourAsset.m_RootNodeId = rootId;
            GlobalUtil.Sort(nodes, (x, y) => x.m_Id - y.m_Id);
            BehaviourAsset.m_Datas  = nodes.ToArray();
            BehaviourAsset.m_Sorted = true;

            BehaviourTreeAsset.Comment[] comments = new BehaviourTreeAsset.Comment[CommentCanvas.ElementCount];
            for (int i = 0; i < comments.Length; i++)
            {
                comments[i] = new BehaviourTreeAsset.Comment();
                BehaviourCommentGUI com = CommentCanvas.GetElement <BehaviourCommentGUI>(i);
                if (com != null)
                {
                    comments[i].m_Rect    = com.LocalRect;
                    comments[i].m_Comment = com.Comment ?? "";
                }
            }
            BehaviourAsset.m_Comments = comments;
            EditorUtility.SetDirty(BehaviourAsset);
        }
        private bool BuildBehaviorTree(MyBehaviorDefinition behaviorDefinition)
        {
            Debug.Assert(!m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId), "Tree with given behavior definition already exists.");
            if (m_BTDataByName.ContainsKey(behaviorDefinition.Id.SubtypeId))
            {
                return(false);
            }

            MyBehaviorTree newInstance = new MyBehaviorTree(behaviorDefinition);

            newInstance.Construct();
            BTData behaviorTreeData = new BTData(newInstance);

            m_BTDataByName.Add(behaviorDefinition.Id.SubtypeId, behaviorTreeData);
            return(true);
        }
        BTNodeBase InstBTNode(BehaviourTreeRunner btree, BTData info)
        {
            BTNodeBase node = info.Instantiate(btree, this);

            if (node != null)
            {
                for (int i = 0; i < info.m_Children.Length; i++)
                {
                    BTData child = GetDataById(info.m_Children[i]);
                    if (child != null)
                    {
                        BTNodeBase cnode = InstBTNode(btree, child);
                        node.SetChild(i, cnode);
                    }
                }
            }
            return(node);
        }
        /// <summary>
        /// 构造行为树
        /// </summary>
        /// <param name="runner"></param>
        /// <returns></returns>
        public BTNodeBase CreateBehaviourTree(BehaviourTreeRunner runner)
        {
            BTData root = GetDataById(m_RootNodeId);

            if (root == null)
            {
                return(null);
            }
            try
            {
                BTNodeBase rootNode = InstBTNode(runner, root);
                return(rootNode);
            }
            catch (System.Exception e)
            {
                Debug.LogError(e, this);
                return(null);
            }
        }