判断AssetBundle是否已经加载如果已经加载就不要重新加载了

本文详细介绍了如何使用Unity3D引擎通过自定义脚本来加载Logo资源,并实现场景之间的平滑过渡,包括加载纹理、初始化对象、场景切换逻辑等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using UnityEngine;
using System.Collections;

public class LoadLogoAsset : MonoBehaviour {
    public string _prefabName;
    public int _BundleIndex=0;
    //public string _nextScenesName;
    //public string _previousScenesName;
    public int _nextSceneIndex;
    public int _previousSceneIndex;
    public bool _isReload;
    public GameObject _loadTexture;
    WWW _www;
    GameObject _insObjA;
    //------------------
    static AssetBundle _BunA;
    static AssetBundle _BunB;
    static AssetBundle _BunC;
    static AssetBundle _BunD;
    static AssetBundle _BunE;
    static AssetBundle _BunF;
    //------------------
    static AssetBundle[] _LogoBundle={_BunA,_BunB,_BunC,_BunD,_BunE};
    IEnumerator Start() {
        Debug.Log(_LogoBundle[_BundleIndex]);
            if(_LogoBundle[_BundleIndex]==null){
                if(Application.platform == RuntimePlatform.Android)
                {
                     _www = new WWW(Application.streamingAssetsPath+"/"+_prefabName+".unity3d");
                }
                else
                {
                    _www = new WWW("file://" +Application.dataPath + "/StreamingAssets" + "/"+_prefabName+".unity3d");
                }
                yield return _www;
                _LogoBundle[_BundleIndex]=_www.assetBundle;
                if(_www.progress==1){
                    OnIns();
                }
            }else{
                OnIns();
            }
    }
    void OnGUI(){
        GUI.color = Color.red;
        if(_LogoBundle[_BundleIndex]==null)GUI.Label(new Rect(10,10,500,100),(" "+(int)(_www.progress*100)));
    }
    public void OnIns(){
        _loadTexture.SetActive(false);
        _insObjA=Instantiate(_LogoBundle[_BundleIndex].mainAsset)as GameObject;;
    }
    public void LoadNextScene(){
        Destroy(_insObjA);
        if(_isReload){
            _LogoBundle[_BundleIndex].Unload(false);
        }
        Application.LoadLevel(_nextSceneIndex);
    }
    public void LoadPreviousScene(){
        Destroy(_insObjA);
        if(_isReload){
            _LogoBundle[_BundleIndex].Unload(false);
        }
        Application.LoadLevel(_previousSceneIndex);
    }
}

 

转载于:https://www.cnblogs.com/sy88/p/3389608.html

Unity中,卸载已经加载到内存中的AssetBundle并不像直接删除文件那么简单,因为AssetBundle的内容通常是作为资源缓存在内存中的,以便快速访问。如果你想要停止使用或清除特定AssetBundle的内存占用,可以采取以下步骤: 1. **取消异步加载**:如果你是通过`LoadFromFileAsync`、`LoadFromMemoryAsync`等异步加载的方式,你可以调用对应的`UnloadAsync`方法来取消加载操作,但这并不会真正卸载AssetBundle,只是解除了资源的内存关联。 ```csharp if (assetBundleHandle != null) { assetBundleHandle.Unload(false); } ``` 这里的`false`表示仅取消异步加载,保留AssetBundle的内存缓存。 2. **手动清空引用**:如果有明确的对象引用了AssetBundle的资源,确保这些引用被设置为null,这有助于垃圾回收器释放内存关联。 3. **卸载所有AssetBundles**:如果需要彻底卸载所有已加载AssetBundles,可以遍历`Resources.FindObjectsOfType<AssetBundle>()`并调用`UnloadAll()`方法。但是要注意,这可能会导致游戏中依赖于这些资源的部分暂时不可用。 ```csharp foreach (var bundle in Resources.FindObjectsOfType<AssetBundle>()) { bundle.Unload(true); // 这里true表示卸载并清理内存 } ``` 4. **资源池管理**:在大型项目中,通常会对AssetBundles进行更精细的管理,例如使用资源池技术,当资源不再使用时将其放回资源池供其他部分复用,而非简单地卸载。 需要注意的是,频繁卸载和加载AssetBundle会影响性能,因此应尽量优化资源加载策略,确保资源仅在必要时加载和卸载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值