在Unity3d游戏开发中,我们经常需要频繁创建物体,而其中的资源读取就是个问题。其中Unity为我们资源读取提供了几种基本方法,总的来说分为从内部读取和从外部读取。

1.Resources.Load()

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

2.WWW类读取

该方法是从外部读取,即从外部下载,会比从内部读取的时间要稍微慢一点。在安卓开发中,在打包时会自动生成一个名为StreamingAssets的文件夹,而我们可以手动生成该文件夹并把资源放进去,该文件与Resources对比,并没有进行加密,是完全打包到发布包中,而该文件夹可以通过www方式进行读取。

示例:

        string localPath;//定义资源路径#if UNITY_ANDROID//预处理语句 不同平台StreamingAssets的目录不同//Appication.streamingAssetsPath为文件目录localPath = Application.streamingAssetsPath + "/" + cfgName + ".txt";#elselocalPath = "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

示例:加载文本

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<TestData>(jsonStr);Debug.Log("姓名:" + data.userName + "\n年龄:" + data.age);}}
}[System.Serializable]
public class TestData
{public string userName;public int age;
}

测试结果


{"userName":"王武","age":26
}

示例:加载AssetBundle

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();//记得使用完要释放呀 }

总结

Resources.Load() 比较适合不需要更改的数据,一些固定数据的游戏,因为项目打包出来的Resources文件只是可读的,如果需要频繁更改包里的数据的话,每次打包都需要耗费一定的时间。如果项目的数据是上传到服务器上的,推荐使用WWW或者UnityWebRequest方法
参考:
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

Unity3D 动态加载资源方式相关推荐

  1. HTML5动态加载资源方式,动态加载JavaScript文件的两种方法

    这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval ...

  2. HTML5动态加载资源方式,动态加载JavaScript文件的3种方式

    以下是遇到的几种动态加载JavaScript文件的方式,持续更新中... 一.使用document.write/writeln()方式 该种方式可以实现js文件的动态加载,原理就是在重写文档流,这种方 ...

  3. Android RRO动态加载资源

    在 Android 8.0 的时候,Android 项目可以动态的加载资源而可以不用再overlay 中去静态处理,这样就可以方便的对 Android 资源进行处理了. 例如: 1. -- Andro ...

  4. 【Python_PySide2学习笔记(一)】PySide2动态加载UI方式,重写关闭窗体事件

    ** PySide2设置关闭提示窗口:动态加载UI方式,重写关闭窗体事件 ** ** 前言 ** 转载:https://blog.csdn.net/qq_44703282/article/detail ...

  5. 使用九宫格的方式加载动态加载资源

    动态加载分块地形 我在cadn上看了很多的关于unity的动态加载的大佬思路,我都是感觉思路很清晰,理论高大上,但是真的到我们自己去做的时候,才会发现其实不是很容易.我不如那些大佬,只写了一点浅薄的动 ...

  6. Unity—AssetBundle的打包及四种加载资源方式

    AssetBundle打包:脚本放在Editor文件夹内 具体代码如下: using UnityEditor; using System.IO;public class CreateAssetBund ...

  7. Wxwidget 动态加载资源文件

    一.创建自己的资源文件 你可以从一个xml文件中加载对话框,frame窗口,菜单条,工具条等等.不用c++代码去实现,这符合代码界面和代码分离的原则.我们可以使用DialogBlocks,XRCed和 ...

  8. vue系统权限(动态加载路由方式)

    目录 1.注册vue-router 2.声明 默认路由 和权限路由 3.用vuex实现全局登录.退出登录等方法 4.用vuex模块单独写权限路由的判断 5.监听路由跳转实现动态加载权限菜单 需要用到动 ...

  9. untiy Resorces目录动态加载资源

    首先文件夹必须叫Resources,名字不能错 Resources里的资源在程序启动时会全部加载一遍,如果内容过多过大,会对启动时间有比较大的影响,如果对性能比较在意不建议使用 但实际上我们经常用 这 ...

最新文章

  1. 电压放大倍数公式运放_【专题2:电子工程师 之 硬件】 之 【43.运算放大器详解e 运算放大器虚短和虚断】...
  2. php-fpm的pool,php-fpm慢执行日志,open_basedir,php-fpm进程管理
  3. python中协程与函数的区别_深入浅析python 协程与go协程的区别
  4. 95-40-055-java.util.concurrent-ConcurrentSkipListSet
  5. 学习强国---Android逆向及JS逆向
  6. 每日必读DZone News—什么是敏捷真实的含义?
  7. 亲自操作,有用的win10遇到“已禁用输入法”无法启动中文输入法的问题-提示已禁用输入法解决方案
  8. 教你如何关闭Win7视频预览节约资源
  9. CS224n Assignment4解读 · 上
  10. java租车_Java 哒哒租车系统(控制台)
  11. html代码 imgn,html代码大全
  12. Ubuntu安装NVIDIA 显卡驱动
  13. 抢购倒计时自定义控件的实现与优化
  14. 15必须掌握的win7快捷键
  15. char byte java_java byte与char互转原理-转 | 学步园
  16. 大数据开源框架技术汇总
  17. Link/Cut Tree学习笔记
  18. 青蛙与蚊子(C++结构体练习题)
  19. SSL/TLS类安全漏洞及SLB安全漏洞问题
  20. 如何在Fragment碎片中展示数据

热门文章

  1. html图片标签 imag
  2. Day215.课程详细页面功能完善、Echarts统计分析模块[生成统计数据+生成图表]前后端整合 -谷粒学院
  3. uniapp实现自定义相机
  4. c++敢死队问题代码(为大一而生)
  5. Scrapy 第一次爬虫
  6. 基于51单片机的智能窗帘设计
  7. 打猎游戏——HTML版(JavaScript的应用)
  8. 干货分享 | Windows系统下载SRA数据方法——生信小白亲测可行
  9. VMware拟收购云应用管理服务商Wavefront
  10. PSAM卡之常用APDU指令错误码【转】