✅ 启动时检测机型性能,判定设备等级
✅ 同一资源有高配/中配/低配不同压缩格式
✅ 根据设备等级,加载对应资源包(AB)
✅ 支持动态切换(可用来切换特效/贴图分辨率/模型LOD)
✅ 保证:
DeviceLevelDetector (设备检测器)
↓
ResourceVersionManager(资源版本管理)
↓
AssetBundleLoader(AB加载器)
↓
Resource (Texture/Model/Shader/Prefab)
模块 | 作用 |
---|---|
DeviceLevelDetector | 启动时检测设备性能,判定设备等级 |
ResourceVersionManager | 根据设备等级,确定要加载的资源版本(高配/中配/低配) |
AssetBundleLoader | 按需加载正确版本的AssetBundle(带缓存机制、异步加载) |
版本化资源命名规则 | 每份资源分高/中/低版本,按规则命名: xxx_high.ab , xxx_mid.ab , xxx_low.ab |
(同之前提供的)
→ 返回设备等级:Low / Mid / High / Ultra
public class ResourceVersionManager
{
public enum DeviceLevel
{
Low,
Mid,
High,
Ultra
}
private static DeviceLevel _deviceLevel;
private static Dictionary<string, string> _resourceMap = new Dictionary<string, string>();
public static void Init()
{
_deviceLevel = DeviceLevelDetector.GetDeviceLevel();
Debug.Log($"[ResourceVersionManager] Device Level: {
_deviceLevel}");
}
// 根据资源名返回对应版本的资源路径
public static string GetResourcePath(string baseName)
{
if (_resourceMap.TryGetValue(baseName, out var path))
{
return path;
}
string suffix = GetSuffix();
string versionedName = $"{
baseName}_{
suffix}";
_resourceMap[baseName] = versionedName;
return versionedName;
}
private static string GetSuffix()
{
switch (_deviceLevel)
{
case DeviceLevel.Low: return "low";
case DeviceLevel.Mid: return "mid";
case DeviceLevel.High:
case DeviceLevel.Ultra: return "high";
default: return "mid";
}
}
}
using System.Collections;
using UnityEngine;
public class AssetBundleLoader : MonoBehaviour
{
private string abBasePath = Application.streamingAssetsPath + "/AssetBundles/";
public IEnumerator LoadAssetAsync<T>(string baseName, string assetName, System.Action<T> onLoaded) where T : UnityEngine.Object
{
string versionedName = ResourceVersionManager.GetResourcePath(baseName);
string abPath = abBasePath + versionedName;
AssetBundleCreateRequest abRequest = AssetBundle.LoadFromFileAsync(abPath);
yield return abRequest;
AssetBundle bundle = abRequest.assetBundle;
if (bundle == null)
{
Debug.LogError($"[AssetBundleLoader] Failed to load AB: {
abPath}");
yield break;
}
AssetBundleRequest assetRequest = bundle.LoadAssetAsync<T>(assetName);
yield return assetRequest;
if (assetRequest.asset != null)
{
onLoaded?.Invoke(assetRequest.asset as T);
}
else
{
Debug.LogError(