using UnityEngine; using UnityEditor; using Architecture.Core; using Architecture.Variables; namespace Architecture.Editor { /// /// 一键生成 P1/P2 所需的 SO 通信资产(变量 / 事件 / 运行时集合)。 /// 运行方式:Unity 顶部菜单 Architecture > Bootstrap Core Assets。 /// 生成的资产位于 Assets/Architecture/Assets/,可安全删改、重新生成(已存在则跳过)。 /// /// 注意:本脚本仅生成"空壳资产",具体系统需在 Inspector 中将对应字段拖入这些资产实例, /// 才能建立解耦链路(详见 Docs/解耦架构重构方案.md)。 /// public static class AssetBootstrap { private const string Root = "Assets/Architecture/Assets"; [MenuItem("Architecture/Bootstrap Core Assets")] public static void Bootstrap() { if (!AssetDatabase.IsValidFolder(Root)) AssetDatabase.CreateFolder("Assets/Architecture", "Assets"); // 共享变量(同时设置 _value 与 _defaultValue,避免跨 Play Mode 状态泄漏) CreateInt("PlayerHealth", 5); CreateInt("Score", 0); // 无参事件通道 Create("OnPlayerDied"); Create("OnGameOver"); Create("OnGameWin"); Create("OnPlayerDamaged"); // 带载荷事件通道 Create("EchoReleased"); Create("ScoreChanged"); Create("ScoreSettled"); // 运行时集合(当前场景实体注册表) Create("Players"); Create("Enemies"); AssetDatabase.SaveAssets(); Debug.Log($"[AssetBootstrap] 已生成核心 SO 资产到 {Root}"); } private static T Create(string name) where T : ScriptableObject { var path = $"{Root}/{name}.asset"; var existing = AssetDatabase.LoadAssetAtPath(path); if (existing != null) { Debug.Log($"[AssetBootstrap] 已存在,跳过:{path}"); return existing; } var asset = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(asset, path); return asset; } private static void CreateInt(string name, int value) { var asset = Create(name); var so = new SerializedObject(asset); so.FindProperty("_value").intValue = value; so.FindProperty("_defaultValue").intValue = value; so.ApplyModifiedProperties(); } } }