You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.8 KiB
122 lines
3.8 KiB
|
|
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine; |
|
|
|
public class LoadAssetBundles : MonoBehaviour |
|
{ |
|
|
|
// Use this for initialization |
|
private static LoadAssetBundles instance; |
|
private static string localFilePath; |
|
private AssetBundleManifest manifest; |
|
private static string ManifestName; |
|
void Start() |
|
{ |
|
|
|
} |
|
|
|
// Update is called once per frame |
|
void Update() |
|
{ |
|
|
|
} |
|
public void GetAssetBundleManifest() |
|
{ |
|
AssetBundle bundle = AssetBundle.LoadFromFile(localFilePath + ManifestName); |
|
if (bundle == null) |
|
{ |
|
Debug.Log("Failed to load AssetBundle!"); |
|
} |
|
else |
|
{ |
|
manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); |
|
bundle.Unload(false); |
|
} |
|
} |
|
public static LoadAssetBundles getInstance() |
|
{ |
|
if (instance == null) |
|
{ |
|
instance = new LoadAssetBundles(); |
|
localFilePath = Application.dataPath + "/AssetBundles/"; |
|
ManifestName = "AssetBundles"; |
|
} |
|
return instance; |
|
} |
|
public IEnumerator LoadAssetByName<T>(string fileName, Action<T> callback) where T : UnityEngine.Object |
|
{ |
|
AssetManager manager=AssetManager.getInstance(); |
|
//先从资源管理器取,如果没有再从资源包中加载 |
|
if (manager.assetObject.ContainsKey(fileName)) |
|
{ |
|
//Debug.Log("从资源管理器中加载了"); |
|
T obj = manager.assetObject[fileName] as T; |
|
callback(obj); |
|
} |
|
else |
|
{ |
|
//Debug.Log("从资源包加载了"); |
|
if (manifest == null) |
|
{ |
|
GetAssetBundleManifest(); |
|
} |
|
string[] dependencies = manifest.GetAllDependencies(fileName); |
|
AssetBundle[] dpsBundles = new AssetBundle[dependencies.Length]; |
|
for (int i = 0; i < dpsBundles.Length; i++) |
|
{ |
|
string path = localFilePath + dependencies[i]; |
|
Debug.Log(path); |
|
dpsBundles[i] = AssetBundle.LoadFromFile(path); |
|
} |
|
string mainPath = localFilePath + fileName; |
|
AssetBundle mainBundle = AssetBundle.LoadFromFile(mainPath); |
|
if (mainBundle == null) |
|
{ |
|
Debug.Log("Failed to load AssetBundle!"); |
|
yield return null; |
|
} |
|
|
|
T obj = mainBundle.LoadAsset<T>(fileName); |
|
manager.assetObject.Add(fileName, obj);//加入到资源管理器 |
|
callback(obj); |
|
//yield return new WaitForSeconds(1f); |
|
mainBundle.Unload(false); |
|
for (int j = 0; j < dependencies.Length; j++) |
|
{ |
|
dpsBundles[j].Unload(false); |
|
} |
|
} |
|
} |
|
public IEnumerator LoadSceneByName(string fileName, Action callback) |
|
{ |
|
if (manifest == null) |
|
{ |
|
GetAssetBundleManifest(); |
|
} |
|
string[] dependencies = manifest.GetAllDependencies(fileName); |
|
AssetBundle[] dpsBundles = new AssetBundle[dependencies.Length]; |
|
for (int i = 0; i < dpsBundles.Length; i++) |
|
{ |
|
string path = localFilePath + dependencies[i]; |
|
dpsBundles[i] = AssetBundle.LoadFromFile(path); |
|
} |
|
string mainPath = localFilePath + fileName; |
|
AssetBundle mainBundle = AssetBundle.LoadFromFile(mainPath); |
|
if (mainBundle == null) |
|
{ |
|
Debug.Log("Failed to load AssetBundle!"); |
|
yield return null; |
|
} |
|
|
|
//mainBundle.LoadAsset<GameObject>(fileName); |
|
callback(); |
|
yield return new WaitForSeconds(1f); |
|
mainBundle.Unload(false); |
|
for (int j = 0; j < dependencies.Length; j++) |
|
{ |
|
dpsBundles[j].Unload(false); |
|
} |
|
} |
|
}
|
|
|