在unity开发中,我们经常要用到动态去创建物体,这里最常见的一种就是把我们的资源做成预制物体放在Resources文件夹下,然后用Resources.Load()去动态加载出来。在Resources文件夹下的所有资源都是会被打包一起发布出去的,因此不必担心资源丢失或者路径不一样的问题,注意只有Resources文件件下的资源才会被打包,如果你放在此工程(*/Assets)的其他文件夹下然后发布,到时候会造成资源加载不出来的哈!。
加载资源的方式有用Resources的方式从内部加载,还有就是可以用WWW的方式从外部去加载。
1.Resources文件夹::
Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤到这两张不被用的贴图,这样发布包就会小一些了。
2.StreamingAssets文件夹:
StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密。但是StreamingAssets文件夹就不一样,它下面的所有资源不会被加密,是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件。StreamingAssets 只能用过www类来读取!!
1. 在内部加载就要新建一个Resources的文件夹。我做的测试就是把一张图片显示出来,目录结构如图:
2.在外部加载就是把资源放在外部,我在外部放了一张图片,就是在Assets同目录下新建了一个文件夹Data.,结构目录如图:
我想从外部加载的图片就是在Data/Image/outside.jpg这张图片
好了,现在我们准备工作都做好了,现在我们来把它们个加载显示出来,代码如下:
using UnityEngine;using System.Collections;using System.IO;public class LoadAssets : MonoBehaviour { //从内部加载的图片 public Texture inside; //从外部加载的图片 public Texture outside; void OnGUI() { if (GUILayout.Button("从内部用Resources加载资源")) { LoadAssetsFromInside(); } else if (GUILayout.Button("从外部用WWW加载资源")) { StartCoroutine(LoadAssetsFromOutside()); } Rect rect1 = new Rect(300, 0, 200, 200); GUI.DrawTexture(rect1, inside); Rect rect2 = new Rect(300, 300, 200, 200); GUI.DrawTexture(rect2, outside); } /// <summary> /// 从外部加载资源 /// </summary> void LoadAssetsFromInside() { //图片路径 不带后缀 string url = "Data/Image/inside"; inside = Resources.Load(url) as Texture; } /// <summary> /// 从外部加载资源 /// </summary> IEnumerator LoadAssetsFromOutside() { //图片路径 带后缀 /* 要注意 WWW是要带后缀才能找到从而加载到资源,Resources是不用带后缀的*/ string url = "Data/Image/outside.jpg"; //引用 using System.IO; FileInfo fileInfo = new FileInfo(url); WWW www = new WWW("file://" + fileInfo.FullName); //等待资源加载完成 yield return www; outside = www.texture; } }
补充:
1.Application.dataPath 的路径是指当前工程下的Assets文件夹的路径,如图:
2.Application.persistentDataPath 的路径是(这个是隐藏文件夹),如图:
一般情况下Application.persistentDataPath是移动平台的路径,经常我们是这样用的:
string CurrentDataPath() { string path = ""; if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android) { path = Application.persistentDataPath; } else if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer) { path = Application.dataPath; } return path; }