75 lines
2.6 KiB
C#
75 lines
2.6 KiB
C#
![]() |
using System;
|
||
|
using AI;
|
||
|
using Data;
|
||
|
|
||
|
namespace Utils
|
||
|
{
|
||
|
|
||
|
public static class BehaviorTree
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 将行为树定义转换为 AIBase 类型。
|
||
|
/// </summary>
|
||
|
/// <param name="behaviorTreeDef">行为树定义。</param>
|
||
|
/// <returns>转换后的 AIBase 实例。</returns>
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 使用反射根据类名创建 AIBase 的具体子类实例。
|
||
|
/// </summary>
|
||
|
/// <param name="className">类名。</param>
|
||
|
/// <returns>创建的 AIBase 子类实例。</returns>
|
||
|
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 的子类");
|
||
|
}
|
||
|
}
|
||
|
}
|