地图系统
This commit is contained in:
@@ -75,6 +75,7 @@ namespace BaseGames.Editor
|
||||
// ── UI ────────────────────────────────────────────────────────────
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_PauseRequested");
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_PauseResumed");
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_UICancelPressed"); // ESC / 手柄 B·Circle 全局关闭栈顶面板
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_FastTravelOpen");
|
||||
CreateAsset<StringEventChannelSO> ("UI", "EVT_ShopOpen");
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_MapOpen");
|
||||
@@ -82,6 +83,14 @@ namespace BaseGames.Editor
|
||||
CreateAsset<BoolEventChannelSO> ("UI", "EVT_InputDeviceChanged");
|
||||
CreateAsset<BoolEventChannelSO> ("UI", "EVT_SaveIndicatorVisible");
|
||||
|
||||
// ── UI / 背包菜单(InventoryHub Tab 容器)──────
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Inventory", "EVT_InventoryOpen"); // 请求打开统一背包菜单
|
||||
CreateAsset<IntEventChannelSO> ("UI/Inventory", "EVT_InventoryTabChanged"); // 当前激活 Tab 索引变化
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Inventory", "EVT_InventoryTabNext"); // L/R 肩键:切换到下一 Tab
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Inventory", "EVT_InventoryTabPrev"); // L/R 肩键:切换到上一 Tab
|
||||
CreateAsset<StringEventChannelSO> ("UI/Inventory", "EVT_ItemAcquired"); // 道具首次获得(itemId)
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Inventory", "EVT_InventoryChanged"); // 背包内容变化(无负载)
|
||||
|
||||
// ── 启动流程 / Splash ─────────────────────────────────────────────
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Splash", "EVT_SplashStartRequest");
|
||||
CreateAsset<VoidEventChannelSO> ("UI/Splash", "EVT_SplashComplete");
|
||||
@@ -121,15 +130,16 @@ namespace BaseGames.Editor
|
||||
|
||||
// ── 玩家能力 ──────────────────────────────────────────────────────
|
||||
CreateAsset<TransformEventChannelSO> ("Player", "EVT_PlayerSpawned");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_HPChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_MaxHPChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SoulPowerChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SpiritPowerChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SpringChargesChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_LingZhuChanged");
|
||||
// 状态值频道开启粘性:延迟订阅的 HUD 等 UI 立即获得当前 HP/灵珠/形态等
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_HPChanged", stickyReplay: true);
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_MaxHPChanged", stickyReplay: true);
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SoulPowerChanged", stickyReplay: true);
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SpiritPowerChanged", stickyReplay: true);
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_SpringChargesChanged", stickyReplay: true);
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_LingZhuChanged", stickyReplay: true);
|
||||
CreateAsset<AbilityTypeEventChannelSO> ("Player", "EVT_AbilityUnlocked");
|
||||
CreateAsset<StringEventChannelSO> ("Player", "EVT_AbilityUnlockedStr");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_FormChanged");
|
||||
CreateAsset<IntEventChannelSO> ("Player", "EVT_FormChanged", stickyReplay: true);
|
||||
CreateAsset<VoidEventChannelSO> ("Player", "EVT_SkillSetChanged");
|
||||
|
||||
// ── 音频 ──────────────────────────────────────────────────────────
|
||||
@@ -176,14 +186,16 @@ namespace BaseGames.Editor
|
||||
Debug.Log($"[CreateEventChannelAssets] 已重导入 {count} 个事件资产。");
|
||||
}
|
||||
|
||||
private static void CreateAsset<T>(string subfolder, string assetName) where T : ScriptableObject
|
||||
private static void CreateAsset<T>(string subfolder, string assetName, bool stickyReplay = false) where T : ScriptableObject
|
||||
{
|
||||
string folderPath = $"{RootPath}/{subfolder}";
|
||||
EnsureDirectory(folderPath);
|
||||
|
||||
string fullPath = $"{folderPath}/{assetName}.asset";
|
||||
if (AssetDatabase.LoadAssetAtPath<T>(fullPath) != null)
|
||||
var existing = AssetDatabase.LoadAssetAtPath<T>(fullPath);
|
||||
if (existing != null)
|
||||
{
|
||||
if (stickyReplay) ApplyStickyReplay(existing); // 已存在也确保粘性正确(幂等)
|
||||
Debug.Log($"[CreateEventChannelAssets] 已跳过(已存在): {fullPath}");
|
||||
return;
|
||||
}
|
||||
@@ -197,9 +209,26 @@ namespace BaseGames.Editor
|
||||
|
||||
T asset = ScriptableObject.CreateInstance<T>();
|
||||
AssetDatabase.CreateAsset(asset, fullPath);
|
||||
if (stickyReplay) ApplyStickyReplay(asset);
|
||||
Debug.Log($"[CreateEventChannelAssets] 已创建: {fullPath}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 对"状态值"频道开启粘性回放(BaseEventChannelSO._replayLastValueToNewSubscribers=true)。
|
||||
/// 使延迟启用的 UI(如 HUD 在加载阶段未启用、进入 Gameplay 后才订阅)订阅时立即收到当前值。
|
||||
/// </summary>
|
||||
private static void ApplyStickyReplay(UnityEngine.Object asset)
|
||||
{
|
||||
var so = new SerializedObject(asset);
|
||||
var prop = so.FindProperty("_replayLastValueToNewSubscribers");
|
||||
if (prop != null && !prop.boolValue)
|
||||
{
|
||||
prop.boolValue = true;
|
||||
so.ApplyModifiedProperties();
|
||||
EditorUtility.SetDirty(asset);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>递归创建所有缺失的中间文件夹(使用 AssetDatabase API)。</summary>
|
||||
private static void EnsureDirectory(string path)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user