无论是UGUI中的Image,还是Unity2D中的SpriteRenderer都需要Sprite(精灵)类型的图片资源。不免就有获得子精灵的需求。
这个是老问题了,官方论坛提到很多次,用户也向官方提交了需求申请:
https://feedback.unity3d.com/suggestions/allow-access-to-sprite-packer-atlas-to-retrieve-sprites-by-name
网上找了很多,发现很多人的方案是使用Unity新提供的SpriteAtlas。
https://www.cnblogs.com/mcyushao/p/9670903.html
https://docs.unity3d.com/Manual/class-SpriteAtlas.html
相关代码如下:
SpriteAtlas sa = Resources.Load<SpriteAtlas>("path");
Sprite s = sa.GetSprite("name");
笔者这边的需求是依旧要使用老的图集方案,获得子精灵。
推荐方案
其实unity中已经提供了API,不知道为啥网上还是各种乱七八糟的方案。
1,根据子精灵获得父贴图
1.1 对于UGUI Image
img.mainTexture
或img.sprite.texture
都可获得父贴图
1.2 对于Unity2D SpriteRenderer
sr.sprite.texture
即可获得父贴图
2,根据父贴图获得子精灵
2.1 假设父贴图已经单独打为AssetBundle
Sprite[] sprites = ab.LoadAllAssets<Sprite>();
传入类型Sprite,则可以直接获得该ab中的子精灵
sprites[0].texture
可以获得父贴图
var res=ab.LoadAllAssets();
则获得该父贴图对应的ab的所有资源,其中res[0]为父贴图Texture2D,其它的为子精灵。
2.2 精灵放在Resources目录下
Sprite[] sprites = Resources.LoadAll<Sprite>(path);
补充
但是目前依旧没有直接API通过精灵的父物体(Texture2D类型)获得其子Sprites。
相关需求:https://forum.unity.com/threads/get-sprite-s-of-a-texture2d-at-runtime.1319121/