Files
gold_dolphin/unity/Assets/Architecture/Editor/AssetBootstrap.cs
T
2026-07-07 03:34:56 +08:00

73 lines
2.7 KiB
C#

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