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); } }
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); }
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; } } } }
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); }
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); }
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]); } }
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); }
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); } }
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; } } } }
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); } }
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); }