(client) feat:添加基地界面到游玩界面的过程,添加存档管理,技能树变得可用 (#58)

Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com>
Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/58
This commit is contained in:
2025-10-03 00:31:34 +08:00
parent aff747be17
commit dd9d90439d
134 changed files with 10322 additions and 4872 deletions

View File

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