using System.IO;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.ResourceLocators;
using UnityEngine.ResourceManagement.AsyncOperations;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.AddressableAssets;
#endif
namespace Continentis
{
///
/// 负责在游戏启动时发现并加载所有Mod的资源目录 (catalog.json)
///
public static class ModLoader
{
public const string ModCatalogVersion = "1.0.0";
public static async Task LoadAllModsAsync()
{
#if UNITY_EDITOR
var settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
{
Debug.LogWarning("[ModLoader] Addressable Asset Settings not found. Skipping mod loading.");
return;
}
// 修正后的索引检查:0 = Use Asset Database, 1 = Use Existing Build
// 只有在 "Use Existing Build" (Index 1) 模式下才加载外部Mod
if (settings.ActivePlayModeDataBuilderIndex == 0)
{
Debug.Log($"[ModLoader] Play Mode is 'Use Asset Database'. No external mods will be loaded. Skipping.");
return;
}
Debug.Log($"[ModLoader] Play Mode is 'Use Existing Build'. Proceeding to load external mods...");
#endif
string serverDataPath = Path.Combine(Application.dataPath, "../ServerData");
// 修正后的平台路径构建方式
string platformName = GetPlatformName();
string platformSpecificPath = Path.Combine(serverDataPath, platformName);
Debug.Log($"[ModLoader] Searching for mods in: {platformSpecificPath}");
if (!Directory.Exists(platformSpecificPath))
{
Debug.LogWarning(
$"[ModLoader] Mod directory not found at: {platformSpecificPath}. No mods will be loaded. Did you build Addressables?");
return;
}
string catalogFileName = $"catalog_{ModCatalogVersion}.json";
string catalogPath = Path.Combine(platformSpecificPath, catalogFileName);
if (File.Exists(catalogPath))
{
Debug.Log($"[ModLoader] Found catalog at: {catalogPath}");
AsyncOperationHandle handle = Addressables.LoadContentCatalogAsync(catalogPath);
await handle.Task;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log($"[ModLoader] Successfully loaded mod catalog.");
}
else
{
Debug.LogError($"[ModLoader] Failed to load mod catalog at: {catalogPath}");
}
}
else
{
Debug.LogWarning($"[ModLoader] No catalog.json found in the mod directory: {platformSpecificPath}");
}
}
private static string GetPlatformName()
{
#if UNITY_EDITOR
// 在Editor中,我们可以直接从构建设置获取准确的平台名称字符串
return EditorUserBuildSettings.activeBuildTarget.ToString();
#else
// 在实际发布的游戏中,根据Application.platform来判断
switch (Application.platform)
{
case RuntimePlatform.WindowsPlayer:
case RuntimePlatform.WindowsServer:
return "StandaloneWindows64"; // 假设我们主要构建64位
case RuntimePlatform.OSXPlayer:
case RuntimePlatform.OSXServer:
return "StandaloneOSX";
case RuntimePlatform.LinuxPlayer:
case RuntimePlatform.LinuxServer:
return "StandaloneLinux64";
// ... 在这里添加对其他平台的支持
default:
return Application.platform.ToString(); // 作为一个备用选项
}
#endif
}
}
}