102 lines
2.9 KiB
C#
Raw Permalink Normal View History

2025-03-11 16:24:25 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;
using Object = UnityEngine.Object;
namespace ZXKFramework
{
public class ResAssetBundleSimple : IRes
{
Dictionary<string, AbItem> allAbItems = new Dictionary<string, AbItem>();
public void Load<T>(string assetName, Action<T> action = null) where T : Object
{
string tipType = typeof(T).Name;
switch (tipType)
{
case "Sprite":
break;
case "AudioClip":
break;
case "GameObject":
GameObject loObj = Load(new AssetBundleLoadData() { abName = assetName });
action?.Invoke(loObj as T);
break;
}
}
private GameObject Load(AssetBundleLoadData data)
{
if (!allAbItems.ContainsKey(data.abName))
{
AbItem temp = new AbItem(data);
allAbItems.Add(data.abName,temp);
return temp.obj;
}
return null;
}
public void UnLoadAll()
{
foreach (var o in allAbItems.Values)
{
o.asset.Unload(true);
if (o.obj != null)
{
GameObject.Destroy(o.obj);
}
}
allAbItems.Clear();
}
}
public class AbItem
{
public AssetBundle asset { get; set; }
public GameObject obj { get; set; } = null;
private AssetBundleLoadData mData;
public AbItem(AssetBundleLoadData data)
{
mData = data;
string path = GetPath(data.abName);
if (!File.Exists(path))
{
Debug.Log("<22><><EFBFBD><EFBFBD>AB<41><42><EFBFBD><EFBFBD><E5B2BB><EFBFBD>ڣ<EFBFBD>" + path);
return;
}
asset = AssetBundle.LoadFromFile(path);
obj = asset.LoadAsset<GameObject>(data.abName);
asset.Unload(false);
}
string GetPath(string theName)
{
string pos = "";
#if UNITY_ANDROID
pos = "Android";
#elif UNITY_IOS
pos = "IOS";
#elif UNITY_EDITOR_WIN
pos = "Windows";
#endif
if (string.IsNullOrEmpty(mData.path))
{
mData.path = Application.persistentDataPath;
}
string thePath = mData.path + "/Assetbundle/" + pos;
if (!Directory.Exists(thePath))
Directory.CreateDirectory(thePath);
thePath = thePath + "/" + theName.ToLower() + ".assetbundle";
return thePath;
}
}
public struct AssetBundleLoadData
{
public string abName { get; set; }
public string path { get; set; }
}
}