Как склеить спрайты?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как склеить спрайты?

Сообщение hommer345 10 авг 2018, 17:04

Доброго времени суток.
Есть несколько объектов с компонентом SpriteRenderer, объединённых пустым родительским объектом. Как сделать так, чтобы это был один drawcall?
hommer345
UNец
 
Сообщения: 11
Зарегистрирован: 19 май 2017, 20:08

Re: Как склеить спрайты?

Сообщение 1max1 10 авг 2018, 20:38

а сразу их в фотошопе нельзя склеить? можно текстуру програмно сделать и нацепить на один спрайт
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как склеить спрайты?

Сообщение hommer345 11 авг 2018, 23:27

В фотошопе не вариант - эти объекты раскидываются рэндомно.
Что я хочу получить - составной спрайт, собранный случайным образом из базовых декораций. Спрайт разбит на 9 областей (3 по вертикали и 3 по горизонтали), в каждой области находится декорация.
Сейчас это реализовано как 9 спрайтов, объединённых пустым родительским объектом, но я понимаю, что это плохое решение.
Пытаюсь собрать текстуру програмно, но она получается как мешанина белых и прозрачных участков.
Вот скрипт, подскажите, пожалуйста, в чём может быть проблема?
Синтаксис:
Используется csharp
GameObject decor = new GameObject ();//объект, к которому будем цеплять спрайт с итоговой текстурой
decor.AddComponent<SpriteRenderer> ();
Texture2D newTexture = new Texture2D (256, 256);
int decCount = 3;//количество декораций по каждой оси
for (int i = 0; i < decCount; i++)
{
        for (int j = 0; j < decCount; j++)
        {
                int random = Random.Range (0, avalibleObstacles.Count);
                string prefabName = avalibleObstacles [random].prefabName;
                GameObject newDec = Resources.Load("GlobalMapPrefabs/Decorations/MiniDecorations/" + prefabName) as GameObject;
                Texture2D newDecTexture = newDec.GetComponent<SpriteRenderer> ().sprite.texture;
                int xShift = Mathf.RoundToInt (newTexture.width / decCount) * i + Random.Range (0, Mathf.RoundToInt (newTexture.width / decCount));
                int yShift = Mathf.RoundToInt (newTexture.height / decCount) * j + Random.Range (0, Mathf.RoundToInt (newTexture.height / decCount));
                for (int x = 0; x < newDecTexture.width; x++)
                {
                        for (int y = 0; y < newDecTexture.height; y++)
                        {
                                newTexture.SetPixel (x + xShift, y + yShift, newDecTexture.GetPixel (x, y));
                        }
                }
        }
}
decor.GetComponent<SpriteRenderer> ().sprite = Sprite.Create (newTexture, new Rect (0, 0, 256, 256), new Vector2 (0, 0));
 
hommer345
UNец
 
Сообщения: 11
Зарегистрирован: 19 май 2017, 20:08

Re: Как склеить спрайты?

Сообщение ilkalawson 12 авг 2018, 00:00

Хотите себе облегчить жизнь!? - чтобы не перебирать каждый пиксель на текстуре (256*256 = дохера) и заменять ее декорацией, возьмите и создайте префаб с двумя спрайтами, один спрайт это тот куда будете пихать часть текстуры, а другой в виде декорации как накладка на первый. Так вам не придется перебирать каждый пиксель, а сделать это всего 9 раз(по 3 части горизонтали и вертикали).
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Как склеить спрайты?

Сообщение getAlex 12 авг 2018, 13:43

А юнитивский атлас не подходит?
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Как склеить спрайты?

Сообщение AABB 12 авг 2018, 14:35

getAlex писал(а):А юнитивский атлас не подходит?

Что это вообще такое? Вчера попробовал включить его в настройках чтобы был всегда. Поставил в ассетах спрайтов одинаковый тэг и... в плеймоде открыл "статс". ровным счётом ничего не меняется
AABB
UNIт
 
Сообщения: 134
Зарегистрирован: 05 фев 2014, 15:52

Re: Как склеить спрайты?

Сообщение AABB 12 авг 2018, 19:32

Нечего ответить? Или вы думаете "хаха, лох, меряет производительность игры в редакторе". Но не я же его придумал.
AABB
UNIт
 
Сообщения: 134
Зарегистрирован: 05 фев 2014, 15:52

Re: Как склеить спрайты?

Сообщение Anonymyx 12 авг 2018, 19:36

Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Как склеить спрайты?

Сообщение getAlex 12 авг 2018, 20:37

https://docs.unity3d.com/Manual/SpriteAtlas.html

Неудобен только тем, что нет прелоадера в эдиторе. А значит нужно писать свой скрипт, который будет отображать спрайт в эдитор моде до нажатия Run. Но возможно я тупой и достаточно просто напихать текстуры в атлас, а в спрайт рендер указать одну из мелких текстур, а атлас сам во время запуска поменяет ссылки с текстуры спрайта на атлас(если у кого-то есть какая-то инфа -делитесь).

А Sprite Packer уже вроде бы легайз и скоро его удалят из юнити.



Неймспейс для работы с атласами https://docs.unity3d.com/2018.2/Documen ... ility.html
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23