Unity Resource文件基础操作

Posted 高达打架用铁锹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Resource文件基础操作相关的知识,希望对你有一定的参考价值。

Unity Resource文件的基本概念

本篇文章主要讲解Resource文件在Unity场景中的使用以及他的基本概念。


文章目录


前言

随着我们对Unity的操作不断的熟练,对于一些更具有挑战性的东西我们也要不断的去了解,说到操作文件大家应该都不陌生,(如果有不会的小伙伴可以去参考我的系列文章,里边讲解了在C#中我们对于文件的一些操作以及概念!!!!!)而在Unity中我们如果想让程序去自动寻找我们文件夹下的某些东西此时我们该怎么办?下面开始介绍Resource文件的概念以及使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Resource文件是什么鬼?

Resource文件在Unity中是需要我们自己创建的,我们要在Assets文件下新建一个名字命名为Resource。(注意!!!一定要命名正确)但是注意!!!Resource文件夹,用于在运行时加载资源。使用Resource.Load(“path”)的方式加载,简单方便。但是值得注意的是我们的Resource文件夹在打包出来是没有的。
但是尽量不要使用它,
1:它使内存管理变得困难;
2:不恰当的使用Resource文件夹,会增加程序启动时间和打包时间;
3:降低了工程中的内容转换到特定平台的能力,使内容更新困难
4:随着Resources文件夹数量的增加,对这些文件夹中的Assets的管理变得非常困难
5:资源系统降低了项目向特定平台提供自定义内容的能力,并消除了增量内容升级的可能性
6:unity为了兼容所有平台,Resources文件下的资源使用的统一打包,这就会对资源的优化有一定的限制,比如说把图片放在Resource文件夹下,unity不会对这些图片做压缩,这无异是增加了包体大小。
在一些特殊情况下也是可以使用的

二、Resource常用方式

1.Resource.Load<>

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

代码如下(示例):

public class ExampleClass : MonoBehaviour 
public Audiosource _myAudioSource;
  void Start()
   
      string namePath = "MyAudioClips/十年";
   	  AudioClip clip = Resources.Load<AudioClip>(namePath);
	  _myAudioSource.clip = clip;
	  if( _myAudioSource.clip!=null)
	  
	   _myAudioSource.Play();
	  
	 
    

此时我们的文件路径是Assets/Resources/MyAudioClips/十年.wav
值得我们注意的是如果加载文件名字在整个资源中有两个的话,是加载目录路径层次高的那个Resource文件夹中的资源,可以在Resource文件夹下添加文件夹然后可以指定搜索某一个文件夹中的文件。

2.Resource.LoadAll<>

1该方法的使用跟上边的使用方法基本上大同小异,只不过Resource.LoadAll返回的是一个数组,所以我们就要定义一个数组对象去接收我们得到的值

代码如下(示例):

public class ExampleClass : MonoBehaviour 
public AudioSource _myAudioSource;
  void Start()
   
      string namePath = "MyAudioClips";
   	  AudioClip[] clip = Resources.LoadAll(namePath);
	  _myAudioSource.clip = clip.[0];
	  if( _myAudioSource.clip!=null)
	  
	   _myAudioSource.Play();
	  
	 
    

3.Resources.UnloadUnusedAssets

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


总结

主要讲解了一下Unity中Resource文件夹的使用方法,大家可以新建一个Unity工程去尝试一下。

【Unity】Resource加载浅析

参考技术A

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

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

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

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

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

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

2018年11月11日更新

unity官方不推荐我们使用Resources加载方式,更加推荐使用AssetBundle的加载。给出的几个原因是:

也不是说我们完全不能使用Resource文件夹,我们在快速开发中使用或者模型项目中使用,或者是小型项目。或者我们可以在开发是使用Resource然后在打包的时候把这里面的文件打包成AssetBundle并删除。

关于Resource文件夹下的序列化:

在unity打包时,Resource文件夹下的文件会生一个类似AssetBundle打包时的依赖文件,这个文件存储的资源文件的一些信息,其中有File GUID和Local ID这个两个id来代表那个文件及文件位置。然后再运行中的时候会生成一个Instance Id,我们在游戏中加载时,就是使用的该id。但是File GUID的效率并不高,这也是为了兼容不同平台。这个过程就是我们打开应用时黑屏的哪个阶段,官方给出的时间复杂度是O(n log(n))。关于unity的序列化可以看看这篇文章 https://www.jianshu.com/p/0b9ed3bcffef 。

参考文章:

https://unity3d.com/cn/learn/tutorials/topics/best-practices/resources-folder
https://www.jianshu.com/p/0b9ed3bcffef
https://unity3d.com/cn/learn/tutorials/topics/best-practices/assets-objects-and-serialization

原文链接: http://ban-ming.com/article/22

以上是关于Unity Resource文件基础操作的主要内容,如果未能解决你的问题,请参考以下文章

Unity 基础 之 目录结构解析

【Unity】Resource加载浅析

Unity HTFramework框架Resource资源管理器

Unity路径(抄录)

unity 序列帧播放

Unity常用文件夹