您的位置:首页 > 移动开发 > Unity3D

unity3d动态加载资源的2种方式

2015-01-10 01:15 483 查看
在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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息