unity_优化征服Unity3dunity3D技术分享

【Unity】Resource加载浅析

2016-11-01  本文已影响1697人  黒可乐

Resource常用方法


Resource.Load<>

用于资源加载,常用Resource.Load<泛型>(加载文件名字)得到asset下的Resource文件中的目标文件,搜索方式是以asset目录下子目录为Resource名字的文件夹,再找需要加载文件的名字。返回的是泛型的对象。

public class ExampleClass : MonoBehaviour
{
  private void Start()
  {
    var go = GameObject.CreatePrimitive(PrimitiveType.Plane);
    var rend = go.GetComponent<Renderer>();
    rend.material.mainTexture = Resources.Load<Texture>("glass");
 }
}

值得一说的是如果加载文件名字在整个资源中有两个的话,是加载目录路径层次高的那个Resource文件夹中的资源,给我的感觉这个是逐层遍历的,Resource文件夹下面还有可以有Resource文件夹。可以在Resource文件夹下添加文件夹然后可以指定搜索某一个文件夹中的文件。

rend.material.mainTexture=Resource.Load<Testure>("Texture/glass");

这里文件夹路径必须是斜杠,而不是反斜杠,unity中的路径好像都是斜杠,如果你直接写路径的话,从外部输进来好像是可以的。


Resource.LoadAll<>

看这个名字就知道了,这个是去搜索目标路径内所有的泛型内容。返回一个数组

public class ExampleClass : MonoBehaviour {
  void Start()
   {
      GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
      Texture2D[] textures = (Texture2D[]) Resources.LoadAll("Textures");
      Texture2D texture = textures[Random.Range(0, textures.Length)];
      go.GetComponent<Renderer>().material.mainTexture = texture;
    }
}

Resources.UnloadUnusedAssets

这是用来释放内存用的,在使用Destroy后其实是没有把内存释放的。在destroy后再使用这个方法就释放了。值得注意的是如果你的Resource.Load()赋值给一个变量后,然后Destroy这个实例对象,在使用这个方法是无法在内存中删除的,需要把这个变量制为空就可以了,因为这个变量是一直引用着Resource.Load的,所以Resource.Load最好不要添加引用。在使用Destroy实例对象后没有使用此方法,再次实例新的对象是不会增加内存的消耗的。


Resource的好处

刚学unity的时候就听教程上说用这个方法好,可以优化资源,unity打包的时候可以把Resource文件夹的资源都打包。但是如果你在场景中引用的话也可以在打进包里啊,我知道这个时候你就会说像是texture2d这种不可能在场景中都用到嘛,这样的可以用这种方法,但是为啥要把场景所有的东西都动态加载呢?像场景模型这些固定的为什么也要动态加载呢?是要创建自己的对象池吗?但是这样的动态加载感觉很鸡肋啊,直接在场景中把这些固定的放好不就好了吗?还要自己去实例化,不是很明白。如果你换场景,不再用这个固定的模型,没去卸载他,岂不是有增加了内存的消耗。而且美术,策划那边如果要改场景中的一些东西也很不方便啊,有没有那个大神带发个车?
今天问问大哥知道了用这个方式是为了后面打包的时候方便分包用。

上一篇 下一篇

猜你喜欢

热点阅读