地图系统
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEditor.AddressableAssets;
|
||||
using UnityEditor.AddressableAssets.Settings;
|
||||
using UnityEngine;
|
||||
using BaseGames.Core.Assets;
|
||||
|
||||
namespace BaseGames.Editor.Addressables
|
||||
{
|
||||
/// <summary>
|
||||
/// 一键将核心启动场景注册为 Addressable address,避免遗漏导致 Addressables.LoadSceneAsync 失败。
|
||||
/// 菜单:BaseGames/Addressables/Register Core Scenes
|
||||
///
|
||||
/// 约定映射(文件名 → address,address 取自 AddressKeys):
|
||||
/// Persistent.unity → "Scene_Persistent"
|
||||
/// MainMenu.unity → "Scene_MainMenu"
|
||||
/// 首个游戏场景(Scene_Game_Chapter1)因正式关卡命名待定,提供单独方法按需注册。
|
||||
///
|
||||
/// 仅扫描 Assets/_Game/Scenes 根目录(排除 Testings/ 测试场景,符合 AssetFolderSpec.md §5.2)。
|
||||
/// </summary>
|
||||
public static class CoreSceneRegistrar
|
||||
{
|
||||
private const string ScenesRoot = "Assets/_Game/Scenes";
|
||||
private const string GroupName = "Scenes";
|
||||
|
||||
[MenuItem("BaseGames/Addressables/Register Core Scenes")]
|
||||
public static void RegisterCoreScenes()
|
||||
{
|
||||
var settings = AddressableAssetSettingsDefaultObject.Settings;
|
||||
if (settings == null)
|
||||
{
|
||||
Debug.LogError("[CoreSceneRegistrar] Addressable Settings 未初始化。请先创建 Addressables 配置。");
|
||||
return;
|
||||
}
|
||||
|
||||
// 文件名(不含扩展名)→ Addressable address
|
||||
var map = new Dictionary<string, string>
|
||||
{
|
||||
{ "Persistent", AddressKeys.ScenePersistent },
|
||||
{ "MainMenu", AddressKeys.SceneMainMenu },
|
||||
};
|
||||
|
||||
var group = GetOrCreateScenesGroup(settings);
|
||||
int registered = 0;
|
||||
var report = new System.Text.StringBuilder("[CoreSceneRegistrar] 核心场景注册结果:\n");
|
||||
|
||||
// 仅扫描 ScenesRoot 根目录(不递归到 Testings/)
|
||||
foreach (var path in Directory.GetFiles(ScenesRoot, "*.unity", SearchOption.TopDirectoryOnly))
|
||||
{
|
||||
string assetPath = path.Replace('\\', '/');
|
||||
string name = Path.GetFileNameWithoutExtension(assetPath);
|
||||
if (!map.TryGetValue(name, out var address)) continue;
|
||||
|
||||
RegisterEntry(settings, group, assetPath, address);
|
||||
report.AppendLine($" ✓ \"{address}\" → {name}.unity");
|
||||
registered++;
|
||||
}
|
||||
|
||||
if (registered == 0)
|
||||
report.AppendLine(" (未找到 Persistent.unity / MainMenu.unity,请确认场景文件位于 Assets/_Game/Scenes 根目录)");
|
||||
|
||||
EditorUtility.SetDirty(settings);
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log(report.ToString());
|
||||
}
|
||||
|
||||
/// <summary>按指定路径与 address 注册首个游戏场景(正式关卡命名确定后调用)。</summary>
|
||||
public static void RegisterFirstGameScene(string sceneAssetPath, string address = null)
|
||||
{
|
||||
var settings = AddressableAssetSettingsDefaultObject.Settings;
|
||||
if (settings == null) { Debug.LogError("[CoreSceneRegistrar] Addressable Settings 未初始化。"); return; }
|
||||
address ??= AddressKeys.SceneGameChapter1;
|
||||
RegisterEntry(settings, GetOrCreateScenesGroup(settings), sceneAssetPath, address);
|
||||
EditorUtility.SetDirty(settings);
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log($"[CoreSceneRegistrar] 已注册首关场景 \"{address}\" → {sceneAssetPath}");
|
||||
}
|
||||
|
||||
// ── 内部 ──────────────────────────────────────────────────────────────
|
||||
|
||||
private static AddressableAssetGroup GetOrCreateScenesGroup(AddressableAssetSettings settings)
|
||||
{
|
||||
foreach (var g in settings.groups)
|
||||
if (g != null && g.name == GroupName) return g;
|
||||
return settings.CreateGroup(GroupName, false, false, false, null);
|
||||
}
|
||||
|
||||
private static void RegisterEntry(AddressableAssetSettings settings, AddressableAssetGroup group,
|
||||
string assetPath, string address)
|
||||
{
|
||||
string guid = AssetDatabase.AssetPathToGUID(assetPath);
|
||||
if (string.IsNullOrEmpty(guid)) return;
|
||||
var entry = settings.FindAssetEntry(guid) ?? settings.CreateOrMoveEntry(guid, group, false, false);
|
||||
settings.MoveEntry(entry, group, false, false);
|
||||
entry.address = address;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6473e1a628072a34b8cef9186f43d647
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user