地图系统

This commit is contained in:
2026-06-05 18:41:33 +08:00
parent 613f2a4d13
commit fe4fd60083
234 changed files with 33090 additions and 4899 deletions

View File

@@ -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
///
/// 约定映射(文件名 → addressaddress 取自 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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6473e1a628072a34b8cef9186f43d647
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: