using System; using AI; using Data; namespace Utils { public static class BehaviorTree { /// /// 将行为树定义转换为 AIBase 类型。 /// /// 行为树定义。 /// 转换后的 AIBase 实例。 public static AIBase ConvertToAIBase(BehaviorTreeDef behaviorTreeDef) { if (behaviorTreeDef == null) return null; var aiBase = CreateAIBaseInstance(behaviorTreeDef.className); if (behaviorTreeDef.childTree != null) { foreach (var child in behaviorTreeDef.childTree) { if (child != null) { aiBase.children.Add(ConvertToAIBase(child)); } } } return aiBase; } /// /// 使用反射根据类名创建 AIBase 的具体子类实例。 /// /// 类名。 /// 创建的 AIBase 子类实例。 private static AIBase CreateAIBaseInstance(string className) { if (string.IsNullOrEmpty(className)) throw new ArgumentException("className 不能为空"); if (className.Equals("AIBase", StringComparison.OrdinalIgnoreCase)) { return (AIBase)Activator.CreateInstance(typeof(AIBase)); } // 定义可能的命名空间列表 var possibleNamespaces = new[] { "AI" }; foreach (var ns in possibleNamespaces) { try { // 获取当前程序集 var assembly = typeof(AIBase).Assembly; // 尝试查找类型 var type = assembly.GetType($"{ns}.{className}"); if (type != null && typeof(AIBase).IsAssignableFrom(type)) { // 如果找到合适的类型,则创建实例并返回 return (AIBase)Activator.CreateInstance(type); } } catch { // 忽略单个命名空间的错误,继续尝试下一个命名空间 } } // 如果所有命名空间都未找到对应的类型,抛出异常 throw new InvalidOperationException($"无法找到类型 {className} 或该类型不是 AIBase 的子类"); } } }