打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Unity 使用WWW类同步加载资源
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);
    }
}

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

转载请说明输出:


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Unity3D研究院之Assetbundle的实战(六十三)
Unity5 Sprite 图集打包 AssetBundle 更新探索
修改unity变量名但不丢失序列化值
Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习
Unity里Shader的加载使用,AB包加载使用遇到一个坑
Unity3D自定义资源配置文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服