mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 11:27:14 +08:00
(client) feat:支持定义实体的碰撞体大小和偏移;建筑支持定义实体建筑和瓦片建筑,建筑支持指定按钮回调;添加存档管理器;Dev支持设置是否暂停;实体允许定义事件组;添加基地界面 (#57)
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/57
This commit is contained in:
@@ -41,13 +41,13 @@ namespace Managers
|
||||
public void Init()
|
||||
{
|
||||
// 如果事件和故事定义已经加载,则直接返回,避免重复初始化。
|
||||
if (EventDefs != null && StoryDefs != null)
|
||||
if (EventDefs != null && StoryDefs != null)
|
||||
return;
|
||||
|
||||
// 从定义管理器查询并加载所有事件定义。
|
||||
var eventDefs = DefineManager.Instance.QueryDefinesByType<EventDef>();
|
||||
EventDefs = new Dictionary<string, EventWorkClassBase>();
|
||||
if(eventDefs==null)
|
||||
if (eventDefs == null)
|
||||
return;
|
||||
foreach (var def in eventDefs)
|
||||
{
|
||||
@@ -56,30 +56,35 @@ namespace Managers
|
||||
Debug.LogWarning($"警告:事件名称重复,已跳过加载名称为 '{def.defName}' 的事件定义。");
|
||||
continue;
|
||||
}
|
||||
var eventWorker = GetAndInstantiateEventWorker(def.workClass);
|
||||
|
||||
var eventWorker = Utils.StringUtils.GetAndInstantiateEventWorker(def.workClass);
|
||||
if (eventWorker == null)
|
||||
{
|
||||
Debug.LogWarning($"警告:未能找到或实例化名称为 '{def.workClass}' 的事件工作类,已跳过加载名称为 '{def.defName}' 的事件定义。");
|
||||
continue;
|
||||
}
|
||||
eventWorker.Init(def.parameter);
|
||||
|
||||
eventWorker.Init(def.parameter);
|
||||
EventDefs.Add(def.defName, eventWorker);
|
||||
}
|
||||
|
||||
// 从定义管理器查询并加载所有故事定义。
|
||||
var storyDefs = DefineManager.Instance.QueryDefinesByType<StoryDef>();
|
||||
StoryDefs = new Dictionary<string, StoryDef>();
|
||||
foreach (var storyDef in storyDefs)
|
||||
{
|
||||
if (StoryDefs.ContainsKey(storyDef.defName))
|
||||
if (storyDefs != null)
|
||||
foreach (var storyDef in storyDefs)
|
||||
{
|
||||
Debug.LogWarning($"警告:故事名称重复,已跳过加载名称为 '{storyDef.defName}' 的故事定义。");
|
||||
continue;
|
||||
if (StoryDefs.ContainsKey(storyDef.defName))
|
||||
{
|
||||
Debug.LogWarning($"警告:故事名称重复,已跳过加载名称为 '{storyDef.defName}' 的故事定义。");
|
||||
continue;
|
||||
}
|
||||
|
||||
StoryDefs.Add(storyDef.defName, storyDef);
|
||||
}
|
||||
StoryDefs.Add(storyDef.defName, storyDef);
|
||||
}
|
||||
|
||||
// 将自身注册到时钟系统,以便每帧更新故事播放。
|
||||
Clock.AddTick(this);
|
||||
Clock.AddTick(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -121,6 +126,22 @@ namespace Managers
|
||||
eventWorker.Run(dimensionID);
|
||||
}
|
||||
|
||||
public void Action(string eventName, Entity.Entity initiator)
|
||||
{
|
||||
if (!EventDefs.TryGetValue(eventName, out var eventWorker))
|
||||
{
|
||||
Debug.LogWarning($"警告:未能找到名称为 '{eventName}' 的事件定义,已跳过执行该事件。");
|
||||
return;
|
||||
}
|
||||
|
||||
eventWorker.Run(initiator.currentDimensionId, initiator);
|
||||
}
|
||||
|
||||
public void Action(EventDef eventDef, Entity.Entity initiator)
|
||||
{
|
||||
Action(eventDef.defName, initiator);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放指定名称的故事。
|
||||
/// </summary>
|
||||
@@ -201,69 +222,6 @@ namespace Managers
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据类名从指定命名空间和程序集下获取并实例化一个 <see cref="EventWorkClassBase"/> 的子类。
|
||||
/// </summary>
|
||||
/// <param name="className">要实例化的类的短名称(不包含命名空间)。</param>
|
||||
/// <param name="targetNamespace">目标类所在的完整命名空间。</param>
|
||||
/// <param name="assemblyToSearch">要搜索的程序集。如果为 null,将搜索 <see cref="EventWorkClassBase"/> 所在的程序集。</param>
|
||||
/// <returns>实例化后的 <see cref="EventWorkClassBase"/> 对象,如果找不到或不符合条件则返回 null。</returns>
|
||||
public static EventWorkClassBase GetAndInstantiateEventWorker(
|
||||
string className,
|
||||
string targetNamespace = "EventWorkClass", // 默认命名空间
|
||||
Assembly assemblyToSearch = null) // 默认程序集
|
||||
{
|
||||
// 1. 确定要搜索的程序集。
|
||||
if (assemblyToSearch == null)
|
||||
{
|
||||
// 默认从 EventWorkClassBase 所在的程序集查找,通常其实现类也位于此程序集。
|
||||
assemblyToSearch = typeof(EventWorkClassBase).Assembly;
|
||||
}
|
||||
|
||||
// 2. 构造完整的类型名称。
|
||||
var fullTypeName = $"{targetNamespace}.{className}";
|
||||
Type targetType = null;
|
||||
|
||||
// 3. 尝试直接从程序集获取类型。
|
||||
targetType = assemblyToSearch.GetType(fullTypeName);
|
||||
|
||||
// 4. 进行类型检查。
|
||||
if (targetType == null)
|
||||
{
|
||||
Debug.LogError($"错误:在程序集 '{assemblyToSearch.FullName}' 的命名空间 '{targetNamespace}' 中未找到类 '{className}'。");
|
||||
return null;
|
||||
}
|
||||
// 检查是否是 EventWorkClassBase 的子类。
|
||||
if (!typeof(EventWorkClassBase).IsAssignableFrom(targetType))
|
||||
{
|
||||
Debug.LogError($"错误:类 '{fullTypeName}' 不是 '{typeof(EventWorkClassBase).FullName}' 的子类。");
|
||||
return null;
|
||||
}
|
||||
// 检查是否可以实例化(非抽象类,非接口)。
|
||||
if (targetType.IsAbstract || targetType.IsInterface)
|
||||
{
|
||||
Debug.LogError($"错误:类 '{fullTypeName}' 是抽象类或接口,不能直接实例化。");
|
||||
return null;
|
||||
}
|
||||
|
||||
// 5. 实例化对象。
|
||||
try
|
||||
{
|
||||
// 使用 Activator.CreateInstance 实例化对象。它默认调用无参公共构造函数。
|
||||
var instance = Activator.CreateInstance(targetType);
|
||||
return instance as EventWorkClassBase;
|
||||
}
|
||||
catch (MissingMethodException ex)
|
||||
{
|
||||
Debug.LogError($"错误:类 '{fullTypeName}' 没有公共的无参构造函数。详细信息: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"实例化类 '{fullTypeName}' 时发生未知错误。详细信息: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 表示一个正在播放的故事实例的状态机。
|
||||
|
||||
Reference in New Issue
Block a user