请选择 进入手机版 | 继续访问电脑版

Unity3D 动态加载资源方式

[复制链接]
冰宇 发表于 2021-1-1 18:30:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
在Unity3d游戏开辟中,我们经常需要频仍创建物体,而此中的资源读取就是个问题。此中Unity为我们资源读取提供了几种根本方法,总的来说分为从内部读取和从外部读取。
1.Resources.Load()

该方法是从项目资源的Resources文件夹举行读取,为内部读取的方法。在项目打包时,Resources文件夹的所有资源会被压缩并加密,并打包进APK中,该文件为只读范例。发起只把需要的预制体打包进去,因为不需要的资源如果放进该文件夹会一起打包出去,造成空间的浪费。在路径参数上,参数默认为Resources/ + "(需要的资源路径)",根据需要输入即可。
2.WWW类读取

该方法是从外部读取,即从外部下载,会比从内部读取的时间要稍微慢一点。在安卓开辟中,在打包时会自动生成一个名为StreamingAssets的文件夹,而我们可以手动生成该文件夹并把资源放进去,该文件与Resources对比,并没有举行加密,是完全打包到发布包中,而该文件夹可以通过www方式举行读取。
示例:
  1.         string localPath;//界说资源路径        #if UNITY_ANDROID//预处置惩罚语句 差别平台StreamingAssets的目次差别        //Appication.streamingAssetsPath为文件目次                localPath = Application.streamingAssetsPath + "/" + cfgName + ".txt";        #else                localPath = "file:///" + Application.streamingAssetsPath + "/" + cfgName + ".txt";        #endif                //通过www读取                WWW www = new WWW(localPath);                if (www.error != null)                {                    Debug.LogError("error : " + localPath);                }                //因为www是异步方法,所以通过while判断是否完成下载                //也可以通过协程举行读取                while (!www.isDone)                {                }
复制代码
3.UnityWebRequest

当然,在现在的Unity高版本中,www这种方法已经被弃用了,对于StreamingAssets文件,我们可以通过UnityWebRequest这个Unity封装的方法举行读取。引入定名空间UnityEngine.Networking即可使用。在使用前,我们想相识一下这个类的组成。
UnityWebRequest组成的三个元素
  UploadHandler 处置惩罚数据将数据发送到服务器的对象

  DownloadHandler 从服务器吸收数据的对象

  UnityWebRequest 负责 HTTP通信流量控制来管理上面两个对象的对象

为了方便路径的寻找,我们引入一个System.Uri类,使用该类的Path.Combine方便我们拼接路径,因为差别的平台StreamingAssets文件的路径不尽相同。
  Windows平台 file:///D:/DATA/StreamingAssets/data.json
WebGl平台 http://localhost/StreamingAssets/data.json
Android平台 jar:file:///data/app/xxx!/assets/data.json
iOS平台 Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

示例:加载文本
  1. public class JsonTest : MonoBehaviour{    private void Start()    {        StartCoroutine(GetData());    }     IEnumerator GetData()    {        var  uri = new  System.Uri(Path.Combine(Application.streamingAssetsPath,"test.txt"));        UnityWebRequest www = UnityWebRequest.Get(uri);        yield return www.SendWebRequest();         if(www.isNetworkError || www.isHttpError) {            Debug.Log(www.error);        }        else        {            Debug.Log(www.downloadHandler.text);            string jsonStr  = www.downloadHandler.text;             TestData data = JsonMapper.ToObject(jsonStr);                        Debug.Log("姓名:" + data.userName + "\n年事:" + data.age);        }    }} [System.Serializable]public class TestData{    public string userName;    public int age;}
复制代码
测试效果
  1. {   "userName":"王武",   "age":26}
复制代码
示例:加载AssetBundle
  1. IEnumerator GetAssetBundle(string url)    {        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path);        yield return request.SendWebRequest();         if (request.isDone)        {            AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);             if (ab)            {                Instantiate(ab.LoadAsset("Cube"));            }        }        request.Dispose();//记得使用完要释放呀     }
复制代码
参考:
https://blog.csdn.net/Glow0129/article/details/104982681
https://blog.csdn.net/qq_33994566/article/details/100015041
https://blog.csdn.net/gaojinjingg/article/details/53128802

来源:https://blog.csdn.net/the_shy33/article/details/111994120
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )