分享

Unity 使用WWW类同步加载资源

 阿修罗之狮猿授 2016-04-22
Unity加载资源有两种方式:1.Resources.Load(). 2.AssetBundle前者属于同步加载,后者一般认为属于异步加载,Unity官方也只提供异步这种方式。(习惯按Ctrl + S

Unity加载资源有两种方式:1.Resources.Load(). 2.AssetBundle

前者属于同步加载,后者一般认为属于异步加载,Unity官方也只提供异步这种方式,其实也可以同步的哦。(习惯按Ctrl + S 好烦)

异步加载方式:

IEnumerator LoadAssets(string path)

{

WWW www = new WWW(path);

yield return www;

}

void StartLoad()

{

StartCoroutine(LoadAssets(path));

}

StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。在C#中协程要定义为IEnumerator (实现式接口)这个类型.它声明实现该接口的类就可以作为一个迭代器iterator。所以说属于异步加载

但是在开发项目前期使用Resources(同步)加载资源,到了后期项目需要做增量更新,那就得使用WWW类进行加载(听说还有其他非WWW加载方式,希望大家分享下),同步改成异步那可不是说改就能改的,很多逻辑都需要重新处理才行。其实使用WWW类进行加载并不一定是异步的,也可以处理成同步加载(也让我纠结一上午,浏览网页是突然想到可以使用IEnumerable试试,没想到成功了,哈哈(还是自己太懒,不想大面积改代码)),其实同学一看就明白,下面直接上代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class LoadAsset 
{
    private string m_sPath = string.Empty;//资源路径
    private WWW m_www = null;

    private int m_iCountRetry = 5;//重复下载次数

    public LoadAsset(string path)
    {
        m_sPath = path;
    }

    public UnityEngine.Object StarLoad()
    { 
        UnityEngine.Object result = null;

        while (result == null)
        { 
            foreach (UnityEngine.Object obj in LoadWWW())
            {
                result = obj;
            }
            if (m_iCountRetry > 0)
            {
                if (result != null)
                {
                    break;
                }
                m_iCountRetry--;
            }
            else
            {
                break;
            }
        }
        DeInit();
        return result;
    }


    public IEnumerable<UnityEngine.Object> LoadWWW()
    {
        m_www = new WWW(m_sPath);
        yield return m_;
    }


    private void DeInit()
    {
        if(m_www != null)
        {
            m_();
        }
        m_www = null;
    }
}


public class ResLoad
{
    private static ResLoad instance = null;
    public static ResLoad Instance 
    {
        get
        {
            if (instance == null)
            {
                instance = new ResLoad();
            }
            return instance;
        }
    }
    public UnityEngine.Object StarLoad(string path)
    {
        UnityEngine.Object obj = null;
        LoadAsset asset = new LoadAsset(path);
        obj = asset.StarLoad();
        return obj;
    }

    public T StarLoad<T>(string path)
    {
        LoadAsset asset = new LoadAsset(path);
        object obj = asset.StarLoad() as object;
        return ((T)obj);
    }
}

上面是我开发项目的源码,拷贝可以直接使用!是不是很简单,如有没说到的地方,,希望大家补充,多喷喷!

转载请说明输出:


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多