feat(cordis): 完成阶段5配置与调试工具

This commit is contained in:
2026-08-17 01:58:46 +08:00
parent 8738e633ee
commit 5765f411e9
29 changed files with 1322 additions and 18 deletions
@@ -5,6 +5,7 @@
"ShrinkApp.Starter.Basic.Runtime",
"ShrinkApp.Core.Runtime",
"ShrinkApp.Core.Editor",
"ShrinkContext.AppAdapter.Runtime",
"ShrinkDataSaver.Runtime",
"ShrinkDataSaver.Integration.App",
"UnityEngine.UI"
@@ -1,5 +1,6 @@
#if UNITY_EDITOR
using ShrinkApp.Editor;
using ShrinkContext.AppAdapter;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
@@ -10,6 +11,8 @@ namespace ShrinkApp.Starter.Basic.Editor
public static class ShrinkAppBasicStarterGenerator
{
private const string MenuPath = "ShrinkApp/Starter/生成 Basic Entry 场景";
private const string CompositionMenuPath = "ShrinkApp/Starter/创建默认 Cordis Composition";
private const string CompositionPath = "Assets/Resources/ShrinkAppComposition.asset";
[MenuItem(MenuPath)]
public static void Generate()
@@ -21,13 +24,34 @@ namespace ShrinkApp.Starter.Basic.Editor
Debug.Log("[ShrinkApp.Starter.Basic] 已生成 Basic Entry 场景与配置。");
}
[MenuItem(CompositionMenuPath)]
public static void CreateDefaultCompositionAsset()
{
EnsureResourcesDirectory();
var existing = AssetDatabase.LoadAssetAtPath<ShrinkAppCompositionProfile>(CompositionPath);
if (existing != null)
{
Selection.activeObject = existing;
return;
}
// 修复脚本/asmdef 变更期间可能留下的无主 .asset,而不是在同一路径叠加创建。
if (!string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(CompositionPath)))
AssetDatabase.DeleteAsset(CompositionPath);
var composition = ScriptableObject.CreateInstance<ShrinkAppCompositionProfile>();
composition.SetDocument(ShrinkAppBasicContextComposition.CreateDefaultDocument());
AssetDatabase.CreateAsset(composition, CompositionPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Selection.activeObject = composition;
}
private static void EnsureAssets()
{
ShrinkAppEditorMenu.CreateSettingsAsset();
const string resourcesDir = "Assets/Resources";
if (!AssetDatabase.IsValidFolder(resourcesDir))
AssetDatabase.CreateFolder("Assets", "Resources");
EnsureResourcesDirectory();
const string dataSaverSettingsPath = "Assets/Resources/ShrinkDataSaverSettings.asset";
if (AssetDatabase.LoadAssetAtPath<ScriptableObject>(dataSaverSettingsPath) == null)
@@ -51,6 +75,15 @@ namespace ShrinkApp.Starter.Basic.Editor
starterAsset.maxCommandOutputLines = 12;
AssetDatabase.CreateAsset(starterAsset, starterSettingsPath);
}
CreateDefaultCompositionAsset();
}
private static void EnsureResourcesDirectory()
{
const string resourcesDir = "Assets/Resources";
if (!AssetDatabase.IsValidFolder(resourcesDir))
AssetDatabase.CreateFolder("Assets", "Resources");
}
private static void BuildScene()
@@ -9,10 +9,13 @@
- 生成 `ShrinkAppSettings.asset`
- 生成或补齐 `ShrinkDataSaverSettings.asset`
- 生成 `ShrinkAppBasicStarterSettings.asset`
- 生成 `ShrinkAppComposition.asset`(7 个默认 Cordis 条目;组件工厂仍由代码组合根提供)
- 生成 `Assets/Scenes/ShrinkAppEntry.unity`
- 生成最小示例 UI 与 `ShrinkAppBasicSampleController`
- 演示 `ShrinkApp + ShrinkDataSaver + Command + Network` 的最小闭环
可以单独执行 `ShrinkApp/Starter/创建默认 Cordis Composition` 创建或修复组合资产,不需要重建场景。
当前示例场景内置的最小入口已经扩成一个小型调试台,包括:
- `Save Slot 0`
@@ -1,5 +1,6 @@
#nullable enable
using System.Collections.Generic;
using ShrinkCommand.Integration.App;
using ShrinkCommand.Integration;
using ShrinkContext.AppAdapter;
@@ -17,6 +18,19 @@ namespace ShrinkApp.Starter.Basic
/// </summary>
public static class ShrinkAppBasicContextComposition
{
private static readonly string[] DefaultModuleIdValues =
{
"shrink.network",
"shrink.command",
"shrink.datasaver",
"shrink.integration.command-network",
"shrink.integration.command-eventbus",
"shrink.integration.datasaver-eventbus",
"shrink.integration.network-eventbus"
};
public static IReadOnlyList<string> DefaultModuleIds => DefaultModuleIdValues;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void RegisterDefaultComposition()
{
@@ -40,5 +54,13 @@ namespace ShrinkApp.Starter.Basic
host.AddModuleComponent("shrink.integration.network-eventbus",
static () => new ShrinkNetworkEventBusComponent());
}
public static ShrinkAppCompositionDocument CreateDefaultDocument()
{
var entries = new List<ShrinkAppCompositionEntry>(DefaultModuleIdValues.Length);
foreach (var moduleId in DefaultModuleIdValues)
entries.Add(new ShrinkAppCompositionEntry(moduleId));
return new ShrinkAppCompositionDocument(includeUnlistedEntries: false, entries);
}
}
}