示例#1
0
        void ParseAILibs(string scriptPath)
        {
            MonoScript mono = AssetDatabase.LoadAssetAtPath <MonoScript>(scriptPath);

            if (mono == null)
            {
                return;
            }
            System.Type t = mono.GetClass();
            if (t == null)
            {
                return;
            }
            // 解析数据类型
            if (System.Attribute.IsDefined(t, typeof(BTSharedTypeAttribute), false))
            {
                mSharedType.Add(t);
            }

            // 解析行为组件
            if (t.GetConstructor(new System.Type[] { typeof(int) }) == null)
            {
                return;
            }
            BehaviourMeta meta = new BehaviourMeta(t);

            if (meta.NodeType != EBTNodeType.invalid)
            {
                mModules.Add(meta);
            }
        }
示例#2
0
        public BehaviourNodeGUI AddChild(PaintElement parent, BehaviourMeta meta, Vector2 localPos)
        {
            if (parent != null && parent.Parent != TreeCanvas)
            {
                return(null);
            }
            BehaviourNodeGUI node = new BehaviourNodeGUI(this);

            node.Self = new BehaviourNodeGUI.Decorator(GenerateId, meta);
            node.Self.UpdatePropertiesInfo();
            Rect r = new Rect();

            r.size         = node.CalculateLocalSize();
            r.position     = localPos - Vector2.right * r.size.x * 0.5f;
            node.LocalRect = r;
            TreeCanvas.AddElement(node);
            TreeGraph.AddNode(node);
            if (parent != null)
            {
                TreeGraph.AddPath(0, parent, node);
            }
            RebuildExecutionOrder();

            return(node);
        }
示例#3
0
        public void RemoveDecorator(BehaviourMeta meta)
        {
            List <Decorator> lst = null;

            if (meta.NodeType == EBTNodeType.condition)
            {
                lst = conditions;
            }
            else if (meta.NodeType == EBTNodeType.service)
            {
                lst = services;
            }
            else
            {
                lst = null;
            }
            if (lst != null)
            {
                for (int i = lst.Count - 1; i >= 0; i--)
                {
                    if (lst[i].BTMeta == meta)
                    {
                        lst.RemoveAt(i);
                        return;
                    }
                }
            }
        }
示例#4
0
        public Decorator AddDecorator(BehaviourMeta meta)
        {
            List <Decorator> lst = null;

            if (meta.NodeType == EBTNodeType.service)
            {
                lst = services;
            }
            else if (meta.NodeType == EBTNodeType.condition && conditions.Count < 32)
            {
                lst = conditions;
            }
            else
            {
                lst = null;
            }
            if (lst == null)
            {
                return(null);
            }
            Decorator decor = new Decorator(mWindow.GenerateId, meta);

            lst.Add(decor);
            return(decor);
        }
示例#5
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);
        }
示例#6
0
 public Decorator(int id, BehaviourMeta meta)
 {
     BTId       = id;
     BTMeta     = meta;
     Properties = new BTInputProperty[meta.Properties.Length];
     for (int i = 0; i < meta.Properties.Length; i++)
     {
         Properties[i] = new BTInputProperty(meta.Properties[i]);
     }
 }
示例#7
0
        public BehaviourMeta FindBTMeta(EBTNodeType type, string bname)
        {
            List <BehaviourMeta> lst = mModules;

            for (int i = 0; i < lst.Count; i++)
            {
                BehaviourMeta meta = lst[i];
                if (meta.NodeType == type && meta.Name == bname)
                {
                    return(meta);
                }
            }
            return(null);
        }
示例#8
0
 public Decorator GetDecorator(BehaviourMeta meta)
 {
     if (meta.NodeType == EBTNodeType.condition)
     {
         return(GlobalUtil.Find(conditions, (x) => x.BTMeta == meta));
     }
     else if (meta.NodeType == EBTNodeType.service)
     {
         return(GlobalUtil.Find(services, (x) => x.BTMeta == meta));
     }
     else
     {
         return(null);
     }
 }
示例#9
0
        void LoadModules()
        {
            XmlElement cfg   = DevilCfg.CfgAtPath("behaviour-category");
            XmlElement child = cfg == null ? null : cfg.FirstChild as XmlElement;
            Color      c;

            while (child != null)
            {
                if (ColorUtility.TryParseHtmlString(DevilCfg.CfgValue("color", "#404040", child), out c))
                {
                    mCategoryStyle[child.Name] = c;
                }
                child = child.NextSibling as XmlElement;
            }
            mModules.Clear();
            mComposites.Clear();
            mDecorators.Clear();
            string[] scripts = AssetDatabase.FindAssets("t:script", DevilCfg.AIImportFolder);
            foreach (string guid in scripts)
            {
                string path = AssetDatabase.GUIDToAssetPath(guid);
                ParseAILibs(path);
            }
            GlobalUtil.Sort(mModules, (x, y) => x.Category.CompareTo(y.Category) * 10000 + (x.SortOrder - y.SortOrder));
            string dcate = null;
            string ccate = null;

            for (int i = 0; i < mModules.Count; i++)
            {
                BehaviourMeta meta = mModules[i];
                if (meta.NodeType == EBTNodeType.condition || meta.NodeType == EBTNodeType.service)
                {
                    mDecorators.Add(meta);
                    if (dcate != meta.Category)
                    {
                        dcate = meta.Category;
                    }
                }
                else
                {
                    mComposites.Add(meta);
                    if (ccate != meta.Category)
                    {
                        ccate = meta.Category;
                    }
                }
            }
        }
示例#10
0
            public MetaUI(BehaviourMeta meta)
            {
                BTMeta = meta;
                Installizer.contentStyle.fontSize = (int)BehaviourNodeGUI.SUB_FONT_SIZE;
                Vector2 size = Installizer.SizeOfContent(meta.DisplayName) + new Vector2(10, 10);

                size.y    = Mathf.Max(size.y, BehaviourNodeGUI.FONT_SIZE);
                TitleSize = size;
                if (string.IsNullOrEmpty(meta.SubTitle))
                {
                    DetailSize = new Vector2(TitleSize.x, 0);
                }
                else
                {
                    Installizer.contentStyle.fontSize = (int)(BehaviourNodeGUI.SUB_FONT_SIZE * 0.9f);
                    DetailSize = Installizer.SizeOfContent(meta.SubTitle) + new Vector2(6, 6);
                }
            }
示例#11
0
 public bool ContainsDecorator(BehaviourMeta meta)
 {
     if (meta.NodeType == EBTNodeType.condition)
     {
         for (int i = 0; i < conditions.Count; i++)
         {
             if (conditions[i].BTMeta.Name == meta.Name)
             {
                 return(true);
             }
         }
     }
     else if (meta.NodeType == EBTNodeType.service)
     {
         for (int i = 0; i < services.Count; i++)
         {
             if (services[i].BTMeta.Name == meta.Name)
             {
                 return(true);
             }
         }
     }
     return(false);
 }