动态加载的资源一定要直接放在Resource目录下吗

动态加载的资源一定要直接放在Resource目录下吗?

TP:B3669293

【除了AssetBundle】要通过Resources.Load加载的资源,不一定要放在Resources目录下。可以用放置关联资源的Prefab代替。texture、material、font等都可以这么处理,Resources目录下保留引用关系即可,资源本身可以放在Resource外面。这样做的好处:1.方便将一些资源快速改为动态加载方式;2.利于资源管控,大家都不直接操作Resources目录,只通过脚本处理自动生成Resources下的内容。

受启发来源:
这两个图片是我是在Editor模式下预先拖入Hierarchy视图中的,可是如果我想运行时根据图片的名子来动态创建精灵该如何?可是unity根本没有提供加载图集的方法,也没有提供加载图集上某个图片的方法。 因为UGUI就不像让开发者有图集的这个概念,可是我们肯定是要实现这个需求的。。怎么办呢?

第一个设想,先把散=小图打包成图集,然后再把所有散图拷贝在Resources文件夹下,这样运行时就能用Resources.load了。

第二个设想,还是先把小图打成图集,然后把所有小图关联在prefab上,拷贝在Resources文件夹下,这样运行时也能用Resources.load了。到底那个靠谱呢? 给大家看一个图大家就知道答案了。

如下图所示,打成图集的图片如果在放在Resources那么资源就变成双份了。。 所以我们只能把小图关联在Prefab上,把所有的Prefab放在Resources下面,这样就不占用多余的空间了。


UGUI研究院之全面理解图集与使用(三) - 雨松MOMO程序研究院 - 5

好了,现在方法我们已经掌握,那么就开始写工具吧。如下图所示可以按文件夹分,每一个文件夹就是一个图集。然后每一张小图创建一个Prefab,Prefab的名子就起小图的名子,文件关联在Resources下面。

UGUI研究院之全面理解图集与使用(三) - 雨松MOMO程序研究院 - 6

 

代码比较简单,我就不注释了。
static private void MakeAtlas ( )
{
string spriteDir = Application . dataPath + "/Resources/Sprite" ;
if ( ! Directory . Exists ( spriteDir ) ) {
Directory . CreateDirectory ( spriteDir ) ;
}
 
DirectoryInfo rootDirInfo = new DirectoryInfo ( Application . dataPath + "/Atlas" ) ;
foreach ( DirectoryInfo dirInfo in rootDirInfo . GetDirectories ( ) ) {
foreach ( FileInfo pngFile in dirInfo . GetFiles ( "*.png" , SearchOption . AllDirectories ) ) {
string allPath = pngFile . FullName ;
string assetPath = allPath . Substring ( allPath . IndexOf ( "Assets" ) ) ;
Sprite sprite = Resources . LoadAssetAtPath < Sprite > ( assetPath ) ;
GameObject go = new GameObject ( sprite . name ) ;
go . AddComponent < SpriteRenderer > ( ) . sprite = sprite ;
allPath = spriteDir + "/" + sprite . name + ".prefab" ;
string prefabPath = allPath . Substring ( allPath . IndexOf ( "Assets" ) ) ;
PrefabUtility . CreatePrefab ( prefabPath , go ) ;
GameObject . DestroyImmediate ( go ) ;
}
}
}

然后是运行时的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using UnityEngine ;
using System . Collections ;
using UnityEngine . UI ;
 
public class UIMain : MonoBehaviour {
 
void Start ( )
{
CreatImage ( loadSprite ( "image0" ) ) ;
CreatImage ( loadSprite ( "image1" ) ) ;
}
 
private void CreatImage ( Sprite sprite ) {
GameObject go = new GameObject ( sprite . name ) ;
go . layer = LayerMask . NameToLayer ( "UI" ) ;
go . transform . parent = transform ;
go . transform . localScale = Vector3 . one ;
Image image = go . AddComponent < Image > ( ) ;
image . sprite = sprite ;
image . SetNativeSize ( ) ;
}
 
private Sprite loadSprite ( string spriteName ) {
return Resources . Load < GameObject > ( "Sprite/" + spriteName ) . GetComponent < SpriteRenderer > ( ) . sprite ;
}
 
}
因为这两个图是在同一个图集上,所以drawcall就是1了。这样我们就可以根据图片的名子来运行时加载图片了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值