在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的文件夹。我做的测试就是把一张图片显示出来,目录结构如图:

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

 

2.在外部加载就是把资源放在外部,我在外部放了一张图片,就是在Assets同目录下新建了一个文件夹Data.,结构目录如图:

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

 

我想从外部加载的图片就是在Data/Image/outside.jpg这张图片

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

 

好了,现在我们准备工作都做好了,现在我们来把它们个加载显示出来,代码如下:

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

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;

    }

}

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

 

补充:

1.Application.dataPath 的路径是指当前工程下的Assets文件夹的路径,如图:

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

 

2.Application.persistentDataPath 的路径是(这个是隐藏文件夹),如图:

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

 

一般情况下Application.persistentDataPath是移动平台的路径,经常我们是这样用的:

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

 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;
    }

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