chore: initial commit
This commit is contained in:
141
Assets/Scripts/Editor/CreateEventChannelAssets.cs
Normal file
141
Assets/Scripts/Editor/CreateEventChannelAssets.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using BaseGames.Core.Events;
|
||||
using BaseGames.Combat;
|
||||
using BaseGames.Player;
|
||||
using BaseGames.Dialogue;
|
||||
using BaseGames.Progression;
|
||||
using System.IO;
|
||||
|
||||
namespace BaseGames.Editor
|
||||
{
|
||||
/// <summary>
|
||||
/// Editor 工具:一键在 Assets/Data/Events/ 下生成所有全局事件频道 .asset 资产。
|
||||
/// 菜单:BaseGames → Tools → Create Event Channel Assets
|
||||
/// 已存在的资产会自动跳过(幂等)。
|
||||
/// </summary>
|
||||
public static class CreateEventChannelAssets
|
||||
{
|
||||
private const string RootPath = "Assets/Data/Events";
|
||||
|
||||
[MenuItem("BaseGames/Tools/Create Event Channel Assets")]
|
||||
public static void CreateAll()
|
||||
{
|
||||
// ── Core 原始类型频道 ──────────────────────────────────────────────
|
||||
CreateAsset<VoidEventChannelSO> ("Core", "EVT_Void");
|
||||
CreateAsset<BoolEventChannelSO> ("Core", "EVT_Bool");
|
||||
CreateAsset<IntEventChannelSO> ("Core", "EVT_Int");
|
||||
CreateAsset<FloatEventChannelSO> ("Core", "EVT_Float");
|
||||
CreateAsset<StringEventChannelSO> ("Core", "EVT_String");
|
||||
CreateAsset<Vector2EventChannelSO> ("Core", "EVT_Vector2");
|
||||
CreateAsset<TransformEventChannelSO> ("Core", "EVT_Transform");
|
||||
CreateAsset<GameStateEventChannelSO> ("Core", "EVT_GameState");
|
||||
CreateAsset<SceneLoadRequestEventChannelSO>("Core", "EVT_SceneLoadRequest");
|
||||
|
||||
// ── 难度 ──────────────────────────────────────────────────────────
|
||||
CreateAsset<DifficultyChangedEventChannel>("Difficulty", "EVT_DifficultyChanged");
|
||||
|
||||
// ── 战斗 ──────────────────────────────────────────────────────────
|
||||
CreateAsset<HitConfirmedEventChannelSO> ("Combat", "EVT_HitConfirmed");
|
||||
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_PlayerDied");
|
||||
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_EnemyDied");
|
||||
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_ParrySuccess");
|
||||
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_PlayerRespawn");
|
||||
|
||||
// ── Boss ──────────────────────────────────────────────────────────
|
||||
CreateAsset<BossSkillEventChannelSO> ("Boss", "EVT_BossSkill");
|
||||
CreateAsset<BossPhaseEventChannelSO> ("Boss", "EVT_BossPhase");
|
||||
CreateAsset<StatusEffectEventChannelSO> ("Boss", "EVT_StatusEffect");
|
||||
|
||||
// ── 任务 ──────────────────────────────────────────────────────────
|
||||
CreateAsset<QuestStateChangedEventChannel>("Quest", "EVT_QuestStateChanged");
|
||||
CreateAsset<QuestObjectiveEventChannelSO> ("Quest", "EVT_QuestObjective");
|
||||
|
||||
// ── UI ────────────────────────────────────────────────────────────
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_PauseRequested");
|
||||
CreateAsset<VoidEventChannelSO> ("UI", "EVT_PauseResumed");
|
||||
CreateAsset<ColorblindModeEventChannelSO> ("UI", "EVT_ColorblindMode");
|
||||
|
||||
// ── 对话/商店 ─────────────────────────────────────────────────────
|
||||
CreateAsset<ShopPurchaseEventChannelSO> ("Dialogue", "EVT_ShopPurchase");
|
||||
CreateAsset<DialogueEventChannelSO> ("Dialogue", "EVT_DialogueStartRequest");
|
||||
CreateAsset<VoidEventChannelSO> ("Dialogue", "EVT_DialogueEnded");
|
||||
|
||||
// ── 玩家能力 ──────────────────────────────────────────────────────
|
||||
CreateAsset<AbilityTypeEventChannelSO> ("Player", "EVT_AbilityUnlocked");
|
||||
CreateAsset<StringEventChannelSO> ("Player", "EVT_AbilityUnlockedStr");
|
||||
|
||||
// ── 音频 ──────────────────────────────────────────────────────────
|
||||
CreateAsset<StringEventChannelSO> ("Audio", "EVT_BGMRequest");
|
||||
CreateAsset<VoidEventChannelSO> ("Audio", "EVT_BGMStop");
|
||||
|
||||
// ── 进度/成就 ─────────────────────────────────────────────────────
|
||||
CreateAsset<ToolUsedEventChannelSO> ("Progression", "EVT_ToolUsed");
|
||||
CreateAsset<AchievementEventChannelSO> ("Progression", "EVT_AchievementUnlocked");
|
||||
|
||||
AssetDatabase.SaveAssets();
|
||||
AssetDatabase.Refresh();
|
||||
|
||||
Debug.Log("[CreateEventChannelAssets] 所有事件频道资产生成完毕。");
|
||||
}
|
||||
|
||||
[MenuItem("BaseGames/Tools/Reimport Event Channel Assets")]
|
||||
public static void ReimportAllEventAssets()
|
||||
{
|
||||
if (!AssetDatabase.IsValidFolder(RootPath))
|
||||
{
|
||||
Debug.LogWarning($"[CreateEventChannelAssets] 未找到目录: {RootPath}");
|
||||
return;
|
||||
}
|
||||
|
||||
string absoluteRoot = Path.Combine(Directory.GetCurrentDirectory(), RootPath);
|
||||
string[] files = Directory.GetFiles(absoluteRoot, "*.asset", SearchOption.AllDirectories);
|
||||
|
||||
int count = 0;
|
||||
foreach (string file in files)
|
||||
{
|
||||
string relativePath = "Assets" + file.Replace('\\', '/').Substring(Directory.GetCurrentDirectory().Length);
|
||||
AssetDatabase.ImportAsset(relativePath, ImportAssetOptions.ForceUpdate);
|
||||
count++;
|
||||
}
|
||||
|
||||
AssetDatabase.SaveAssets();
|
||||
AssetDatabase.Refresh();
|
||||
Debug.Log($"[CreateEventChannelAssets] 已重导入 {count} 个事件资产。");
|
||||
}
|
||||
|
||||
private static void CreateAsset<T>(string subfolder, string assetName) where T : ScriptableObject
|
||||
{
|
||||
string folderPath = $"{RootPath}/{subfolder}";
|
||||
EnsureDirectory(folderPath);
|
||||
|
||||
string fullPath = $"{folderPath}/{assetName}.asset";
|
||||
if (AssetDatabase.LoadAssetAtPath<T>(fullPath) != null)
|
||||
{
|
||||
Debug.Log($"[CreateEventChannelAssets] 已跳过(已存在): {fullPath}");
|
||||
return;
|
||||
}
|
||||
|
||||
T asset = ScriptableObject.CreateInstance<T>();
|
||||
AssetDatabase.CreateAsset(asset, fullPath);
|
||||
Debug.Log($"[CreateEventChannelAssets] 已创建: {fullPath}");
|
||||
}
|
||||
|
||||
/// <summary>递归创建所有缺失的中间文件夹(兼容 AssetDatabase)。</summary>
|
||||
private static void EnsureDirectory(string path)
|
||||
{
|
||||
if (AssetDatabase.IsValidFolder(path))
|
||||
return;
|
||||
|
||||
string[] parts = path.Split('/');
|
||||
string current = parts[0];
|
||||
for (int i = 1; i < parts.Length; i++)
|
||||
{
|
||||
string next = $"{current}/{parts[i]}";
|
||||
if (!AssetDatabase.IsValidFolder(next))
|
||||
AssetDatabase.CreateFolder(current, parts[i]);
|
||||
current = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user