unity加载本地资源

一.本地资源一般就是预制体,图片(jpg,png),音乐等文件。如何动态的加载我们需要的资源呢?有哪些方式。
二.加载本地资源的三种方式。
1.采用Resource.Load方法读取。


image.png

2.采用WWW类加载资源。


image.png

3.采用C#的Image类进行图片的加载。
image.png

4.这是一套加载本地资源的架构。

  public class LoadPrefebTool : MonoBehaviour
    {
        public static LoadPrefebTool Instance;

        private Queue<LoadPrefebDTO> _loadList = new Queue<LoadPrefebDTO>();
        private bool _isWaitting = false;
        //private string _assetBundleBasePath;
        private string _lockStr = "";

        //设置同时异步加载数
        //private int _waittingCount, _waittingMax = 1;

        void Awake()
        {
            if (Instance == null)
            {
                Instance = this;
            }
            else
            {
                Destroy(gameObject);
            }

            DontDestroyOnLoad(gameObject);
            //_assetBundleBasePath = Path.Combine(Application.persistentDataPath, ABConfigManager.BaseABPath);
        }

        public void LoadPrefeb(string path,Action<KeyValuePair<GameObject,object>> callBack, object returnPara = null,bool isCallWithNull = false)
        {
            //Debug.Log("LoadOnePrefeb:" + path);
            var dto = new LoadPrefebDTO
            {
                Path = path,
                ReturnPara = returnPara,
                CallBackGameObject = callBack,
                Type = LoadPrefabTypeEnum.GameObject,
                IsCallWithNull = isCallWithNull,
            };
            _loadList.Enqueue(dto);
            FixedUpdate();
        }

        public void LoadSprite(string path, Action<KeyValuePair<Sprite, object>> callBack, object returnPara = null, bool isCallWithNull = false)
        {
            //Debug.Log("LoadSprite:" + path);
            var dto = new LoadPrefebDTO
            {
                Path = path,
                ReturnPara = returnPara,
                CallBackSprite = callBack,
                Type = LoadPrefabTypeEnum.SpritePng,
                IsCallWithNull = isCallWithNull,
            };
            _loadList.Enqueue(dto);
            FixedUpdate();
        }

        public void LoadAtlas(string path, Action<KeyValuePair<SpriteAtlas, object>> callBack, object returnPara = null,
            bool isCallWithNull = false)
        {
            var dto = new LoadPrefebDTO
            {
                Path = path,
                ReturnPara = returnPara,
                CallBackAtlas = callBack,
                Type = LoadPrefabTypeEnum.Atlas,
                IsCallWithNull = isCallWithNull,
            };
            /*var a = Resources.Load<SpriteAtlas>(path);
            dto.CallBackAtlas(new KeyValuePair<SpriteAtlas, object>(a, dto.ReturnPara));*/
            _loadList.Enqueue(dto);
            FixedUpdate();
        }

        public void LoadTexture(string path, Action<KeyValuePair<Texture2D, object>> callBack, object returnPara = null, bool isCallWithNull = false)
        {
            //Debug.Log("LoadTexture:" + path);
            var dto = new LoadPrefebDTO
            {
                Path = path,
                ReturnPara = returnPara,
                CallBackTexture = callBack,
                Type = LoadPrefabTypeEnum.Texture2D,
                IsCallWithNull = isCallWithNull,
            };
            _loadList.Enqueue(dto);
            FixedUpdate();
        }

        public void LoadAudio(string path, Action<KeyValuePair<AudioClip, object>> callBack, object returnPara = null, bool isCallWithNull = false)
        {
            //Debug.Log("LoadOnePrefeb:" + path);
            var dto = new LoadPrefebDTO
            {
                Path = path,
                ReturnPara = returnPara,
                CallBackAudio = callBack,
                Type = LoadPrefabTypeEnum.Audio,
                IsCallWithNull = isCallWithNull,
            };
            _loadList.Enqueue(dto);
            FixedUpdate();
        }

        void FixedUpdate()
        {
            lock (_lockStr)
            {
                if (!_isWaitting && _loadList.Count > 0)
                {
                    _isWaitting = true;
                    StartCoroutine(LoadPrefabs());
                }
            }
        }

        private IEnumerator LoadPrefabs()
        {
            StartCoroutine(LoadOnePrefeb(_loadList.Dequeue()));
            yield return 0;
        }

        private IEnumerator LoadOnePrefeb(LoadPrefebDTO dto)
        {
            //Debug.Log("LoadOnePrefeb:" + dto.Path);
            Type loadType;
            switch (dto.Type)
            {
                case LoadPrefabTypeEnum.GameObject:
                    loadType = typeof(GameObject);
                    break;
                case LoadPrefabTypeEnum.Audio:
                    loadType = typeof(AudioClip);
                    break;
                case LoadPrefabTypeEnum.SpritePng:
                    loadType = typeof(Sprite);
                    break;
                case LoadPrefabTypeEnum.Texture2D:
                    loadType = typeof(Texture2D);
                    break;
                case LoadPrefabTypeEnum.Atlas:
                    loadType = typeof(SpriteAtlas);
                    break;
                default:
                    loadType = typeof(GameObject);
                    break;
            }
#if UNITY_EDITOR && !DEBUG_ASSETBUNDLE
            var r = Resources.LoadAsync(dto.Path, loadType);
#else
            var assetBundlePath = Path.Combine(_assetBundleBasePath, dto.Path);
            assetBundlePath += ".data";
            Debug.Log("Load prefab ab:" + assetBundlePath);
#if UNITY_EDITOR
            WWW www = new WWW("file:///" + assetBundlePath);
#elif UNITY_ANDROID
            WWW www = new WWW("file://" + assetBundlePath);
#else
            WWW www = new WWW("file:///" + assetBundlePath);
#endif
            while (!www.isDone && string.IsNullOrEmpty(www.error))
                yield return null;
            if (!string.IsNullOrEmpty(www.error))
                Debug.LogError(www.error);

            byte[] prefabAB;
            if (ABConfigManager.IsAssetBundleEncrypt)
            {
                prefabAB = CipherManager.Decrypt(www.bytes, ABConfigManager.EncryptKey, ABConfigManager.EncryptIV,
                    EnryptType.AES);
            }
            else
            {
                prefabAB = www.bytes;
            }

            var ab = AssetBundle.LoadFromMemoryAsync(prefabAB);
            yield return ab;

            AssetBundleRequest r = null;
            var myLoadedAssetBundle = ab.assetBundle;
            if (myLoadedAssetBundle == null && !dto.IsCallWithNull)
            {
                _isWaitting = false;
                Debug.LogError("Failed to load AssetBundle!" + dto.Path);
                yield break;
            }
            else if(myLoadedAssetBundle != null)
            {
                var fileName = Path.GetFileName(dto.Path);
                r = myLoadedAssetBundle.LoadAssetAsync(fileName, loadType);

            }
#endif
            yield return r;

            if (r == null || r.asset == null)
            {
                if (!dto.IsCallWithNull)
                {
                    _isWaitting = false;
                    Debug.Log("LoadOnePrefeb文件不存在:" + dto.Path);
                    yield break;
                }
            }

            object assetObj;
            if (r == null)
            {
                assetObj = null;
            }
            else
            {
                assetObj = r.asset;
            }

            //yield return new WaitForEndOfFrame();
            switch (dto.Type)
            {
                case LoadPrefabTypeEnum.GameObject:
                    var g = assetObj as GameObject;
                    try
                    {
                        dto.CallBackGameObject(new KeyValuePair<GameObject, object>(g, dto.ReturnPara));
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e);
                    }
                    break;
                case LoadPrefabTypeEnum.Audio:
                    var a = assetObj as AudioClip;
                    try
                    {
                        dto.CallBackAudio(new KeyValuePair<AudioClip, object>(a, dto.ReturnPara));
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e);
                    }
                    break;
                case LoadPrefabTypeEnum.SpritePng:
                    var s = assetObj as Sprite;
                    try
                    {
                        dto.CallBackSprite(new KeyValuePair<Sprite, object>(s, dto.ReturnPara));
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e);
                    }
                    break;
                case LoadPrefabTypeEnum.Texture2D:
                    var t = assetObj as Texture2D;
                    try
                    {
                        dto.CallBackTexture(new KeyValuePair<Texture2D, object>(t, dto.ReturnPara));
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e);
                    }
                    break;
                case LoadPrefabTypeEnum.Atlas:
                    var atlas = assetObj as SpriteAtlas;
                    try
                    {
                        dto.CallBackAtlas(new KeyValuePair<SpriteAtlas, object>(atlas, dto.ReturnPara));
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e);
                    }
                    break;
            }



#if !UNITY_EDITOR || DEBUG_ASSETBUNDLE
            if (myLoadedAssetBundle!=null)
            {
                myLoadedAssetBundle.Unload(false);
            }
#endif
            //Debug.Log("LoadOnePrefeb:" + dto.Path+" finish");
            _isWaitting = false;
        }
     
        public void CreateCardPrefab(Action<KeyValuePair<GameObject, object>> action, object returnPara = null)
        {
            LoadPrefeb("Battle/HandCard/CardInit", action, returnPara);

/*            switch (cardTypeEnum)
            {
                case CardTypeEnum.Attack:
                    LoadPrefeb(PrefebLoadPath.AttackCardPrefab, action, returnPara);
                    break;
                case CardTypeEnum.Skill:
                    LoadPrefeb(PrefebLoadPath.SkillCardPrefab, action, returnPara);
                    break;
                case CardTypeEnum.Ability:
                    LoadPrefeb(PrefebLoadPath.AbilityCardPrefab, action, returnPara);
                    break;
                case CardTypeEnum.Curse:
                    LoadPrefeb(PrefebLoadPath.CurseCardPrefab, action, returnPara);
                    break;
                case CardTypeEnum.State:
                    LoadPrefeb(PrefebLoadPath.StateCardPrefab, action, returnPara);
                    break;
            }*/
        }
    }

    public class LoadPrefebDTO
    {
        public string Path;

        public object ReturnPara;

        public bool IsCallWithNull;

        public Action<KeyValuePair<GameObject, object>> CallBackGameObject;

        public Action<KeyValuePair<AudioClip, object>> CallBackAudio;

        public Action<KeyValuePair<Sprite, object>> CallBackSprite;

        public Action<KeyValuePair<Texture2D, object>> CallBackTexture;

        public Action<KeyValuePair<SpriteAtlas, object>> CallBackAtlas; 

        public LoadPrefabTypeEnum Type;
    }

    public enum LoadPrefabTypeEnum
    {
        GameObject,
        SpritePng,
        SpriteJpg,
        Audio,
        Texture2D,
        Atlas,
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容