unity有几种特殊文件夹。其中一个文件是Resources文件夹。存储资源的简单概念已经在
官方文档中被很好的解释
:
通常,我们在场景中创建资源的实例以便在游戏设置中使用它们。不过unity还允许从脚本即时加载资源。通过将资源放在一个叫Resources 的文件夹或它的子文件夹(实际上可以有任意数量的Resources文件夹并可以放置在工程中的任意位置)中完成这步。用Resources.Loadfunction就可以加载这些资源。
对于为什么使用Resources文件件的原因或许还有些不清楚。首先要明白unity构建过程是如何工作的,还有就是unity怎样访问游戏资源。
Unity build process
unity构建过程
构建游戏之前,需要声明游戏中包括哪些场景。这些都可以在Build Settings窗口来完成。
至少有两个unity为什么会要求这样做原因:
它需要知道哪个场景被首先加载(最上边的场景)
它需要知道在构建的项目中包括哪些资源(相关性)
什么是场景相关性?他们是以任何方式连接到场景层级的资源,通常作为组件。
Unity Logo对象包括引用自Unity Logo资源的Sprite Renderer对象
依赖关系图表如下:
这种情况下有两个场景。Scene 1使用Asset 1 和Asset 2。Scene 2使用Asset 2 和 Asset 3。如果决定不构建Scene 2会发生什么?
由于Asset 3只是被Scene 2引用了,所以在构建时只包含了Asset 1 和 Asset 2,Asset3就不再被包括到构建中了。幸亏有了这种以来跟踪,unity会在构建中包括实际用到的资源。更不用说不需要担心存储暂时用不到的资源了。它不会影响构建项目的大小。
重写!
有一种方法可以绕过这个过程。如果把资源放入了Resources文件夹,它们就会被包括到你的构建中。不过要小心!这需要很好的理由才能做!
正如之前所说,大多数情况下当需要使用资源时,会在场景中做一个引用。这种方法可以很容易的使用任何附加资源。所以为什么要使用一个没有保持引用的资源?或许有一些原因并且每个原因都取决于特殊的需要,不过让我们看一个多数游戏都常见的案例。
当资源从场景中被直接引用时,在场景启动之前就会被加载到内存中。庆幸的是,玩家不会经历由于场景加载(伴随一些小的异常)导致的帧率下降。代价当然是需要时间来加载这些资源。有时也许是不可接受的。
示例——加载不同背景的场景
很多游戏加载场景时播放随机图片来显得不是很无聊
加载场景有时候也是一个场景。让我们想象一种情况,真正游戏加载的时候当你想在背景显示随机的图片时。收集了15张图并把它们添加到了加载场景图片旋转的脚本。它们工作的很棒,不过当玩游戏的时候会意识到加载场景需要的时间比通过实际游戏关卡的时间要长!这是由资源预加载机制引起的,并且可以通过使用Resources文件夹很容易修复这个问题。首先从场景中移除所有纹理的引用。然后把图片放到Resources/LoadingImages目录,如下:
然后在代码中可以使用如下代码:
[C#]
纯文本查看
复制代码
1
2
|
int
texturesCount = 3;
int
textureId = Random.Range(1, texturesCount + 1);
Texture2D texture = Resources.Load<Texture2D>(
"LoadingImages/"
+ textureId);
|
注意Random.Range()返回了一个介于包含第一个参数和不包含第二个参数之间的随机数,这就是为什么会有+1。
如果需要给这个纹理附加一个Image组件,你可以这样做:
[C#]
纯文本查看
复制代码
1
2
3
4
5
|
Sprite sprite = Sprite.Create(
texture,
new
Rect(0, 0, texture.width, texture.height),
new
Vector2(0.5f, 0.5f));
Image image = GetComponent<Image>();
image.sprite = sprite;
|
A word of caution
一个字的警告
Resources 文件夹只有在真正需要的时候才去用。即时加载资源会使FPS 下降,间接依赖关系会使工作更加困难。值得再次提到的是这些资源会一直存在于构建当中,即时没有使用它们。已经警告你啦!