teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

取得後のスプライト配列を並べ替えることについて追記

2018/09/17 19:53

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -6,4 +6,52 @@
6
6
  __パッキングアルゴリズムの性質のため、リスト内のスプライトは面積により降順で並べられます。__
7
7
 
8
8
  とのことですので、大きいスプライトから順番に入っているのではないでしょうか。
9
- 面積が同じならどうなのか...といったことも気になりますが、もうこの際リストの順番はあてにならないものとして、スプライト名をもとに[GetSprite](https://docs.unity3d.com/ScriptReference/U2D.SpriteAtlas.GetSprite.html)で取り出すのがいいかもしれません。
9
+ 面積が同じならどうなのか...といったことも気になりますが、もうこの際リストの順番はあてにならないものとして、スプライト名をもとに[GetSprite](https://docs.unity3d.com/ScriptReference/U2D.SpriteAtlas.GetSprite.html)で取り出すのがいいかもしれません。
10
+
11
+ ### 追記
12
+ スプライト名の頭に連番を付けているのでしたら、[GetSprites](https://docs.unity3d.com/ja/current/ScriptReference/U2D.SpriteAtlas.GetSprites.html)で得たバラバラの配列をあらためて名前順に並べ替えることができそうです。
13
+
14
+ 下記のようなコードで実験してみたところ...
15
+ ```C#
16
+ using System.Linq;
17
+ using UnityEngine;
18
+ using UnityEngine.U2D;
19
+
20
+ public class GetSpritesTest : MonoBehaviour
21
+ {
22
+ public SpriteAtlas Atlas;
23
+ public Sprite[] Sprites;
24
+
25
+ private void Start()
26
+ {
27
+ if (this.Atlas == null)
28
+ {
29
+ return;
30
+ }
31
+
32
+ // GetSpritesによるスプライト取り出し
33
+ var spriteCount = this.Atlas.spriteCount;
34
+ var sprites = new Sprite[spriteCount];
35
+ this.Atlas.GetSprites(sprites);
36
+
37
+ // 取得したばかりの配列内のスプライト名を表示
38
+ Debug.Log("Obtained sprites:");
39
+ for (var i = 0; i < spriteCount; i++)
40
+ {
41
+ Debug.Log("\t" + sprites[i].name);
42
+ }
43
+
44
+ // スプライトを名前で昇順にソートし、結果をSpritesに入れる
45
+ this.Sprites = sprites.OrderBy(sprite => sprite.name).ToArray();
46
+
47
+ // ソート後の配列内のスプライト名を表示
48
+ Debug.Log("Sorted sprites:");
49
+ for (var i = 0; i < spriteCount; i++)
50
+ {
51
+ Debug.Log("\t" + this.Sprites[i].name);
52
+ }
53
+ }
54
+ }
55
+ ```
56
+ 下図のような結果になりました。
57
+ ![並べ替え結果](43b17eb6d733e25813597baacac703f5.png)