Набор спрайтов для тем оформления комнат при генерации уровней. Unity3D

Поэтому мне было интересно, есть ли способ «переупаковать» спрайты в тему. У меня есть 1 изображение со всеми нужными мне сценическими спрайтами, и я в основном задавался вопросом, могу ли я сохранить их в этом 1 изображении, а затем иметь «ссылки» или что-то в отдельном пакете. Я подумал о том, чтобы создать класс «Тема», а затем создать его экземпляры, соответствующие моим темам, с жестко закодированными переменными для соответствия. Но я не могу поверить, что нет лучшего способа. Надеюсь, я объяснил это достаточно хорошо ^^


person Jomik    schedule 04.12.2014    source источник
comment
Может работать загрузка изображения (resources.loadall) и сортировка спрайтов по разным контейнерам (например, спискам) по префиксу в имени. Это, по крайней мере, позволит избежать жесткого кодирования всех отдельных спрайтов.   -  person Gunnar B.    schedule 04.12.2014
comment
Или вы создаете публичные массивы/списки и перетаскиваете в них спрайты в инспекторе.   -  person Gunnar B.    schedule 04.12.2014
comment
FTR, если вы используете 2dToolkit, это происходит автоматически — это одна из причин, по которой люди до сих пор так часто используют его, хотя сейчас в Unity есть 2D.   -  person Fattie    schedule 24.03.2016


Ответы (1)


Я закончил тем, что сделал это для тех, кто заинтересован, и, похоже, это работает. Хотя это оставляет мне необходимость кодировать текстуры в коде, например, я искал способ сделать это в структуре редактора/папки.

ThemePack t = new ThemePack(Room.Theme.Medbay);
t.walls.Add(sprites[6]);
t.floors.Add(sprites[32]);
t.floors.Add(sprites[66]);
t.floors.Add(sprites[67]);
t.floors.Add(sprites[68]);
t.floors.Add(sprites[69]);

using UnityEngine;
using System.Collections;

public class SpriteCollection {
    private Sprite[] sprites;
    private string[] names;

    public Sprite this[int i] {
        get {
            return sprites[i];
        }
    }

    public SpriteCollection(string spritesheet) {
        sprites = Resources.LoadAll<Sprite>(spritesheet);
        names = new string[sprites.Length];

        for(int i = 0; i < names.Length; i++) {
            names[i] = sprites[i].name;
        }
    }

    public Sprite GetSprite(string name) {
        return sprites[System.Array.IndexOf(names, name)];
    }
}

using UnityEngine;
using System.Collections.Generic;
using Level;

public class ThemePack {
    public List<Sprite> walls;
    public List<Sprite> floors;

    public Room.Theme name {get; set;} //Could use a string instead, but this is an enum already existing.

    private ThemePack() {
    }

    public ThemePack(Room.Theme n, List<Sprite> w, List<Sprite> f) {
        name = n;
        walls = w;
        floors = f;
    }

    public ThemePack (Room.Theme n) : this(n, new List<Sprite>(), new List<Sprite>()) {
    }

    public Sprite GetRandomWall() {
        return walls[Random.Range(0, walls.Count - 1)];
    }

    public Sprite GetRandomFloor() {
        return floors[Random.Range(0, floors.Count - 1)];
    }
}
person Jomik    schedule 04.12.2014