Страница 1 из 1

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

СообщениеДобавлено: 10 авг 2018, 17:04
hommer345
Доброго времени суток.
Есть несколько объектов с компонентом SpriteRenderer, объединённых пустым родительским объектом. Как сделать так, чтобы это был один drawcall?

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

СообщениеДобавлено: 10 авг 2018, 20:38
1max1
а сразу их в фотошопе нельзя склеить? можно текстуру програмно сделать и нацепить на один спрайт

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

СообщениеДобавлено: 11 авг 2018, 23:27
hommer345
В фотошопе не вариант - эти объекты раскидываются рэндомно.
Что я хочу получить - составной спрайт, собранный случайным образом из базовых декораций. Спрайт разбит на 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));
 

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

СообщениеДобавлено: 12 авг 2018, 00:00
ilkalawson
Хотите себе облегчить жизнь!? - чтобы не перебирать каждый пиксель на текстуре (256*256 = дохера) и заменять ее декорацией, возьмите и создайте префаб с двумя спрайтами, один спрайт это тот куда будете пихать часть текстуры, а другой в виде декорации как накладка на первый. Так вам не придется перебирать каждый пиксель, а сделать это всего 9 раз(по 3 части горизонтали и вертикали).

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

СообщениеДобавлено: 12 авг 2018, 13:43
getAlex
А юнитивский атлас не подходит?

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

СообщениеДобавлено: 12 авг 2018, 14:35
AABB
getAlex писал(а):А юнитивский атлас не подходит?

Что это вообще такое? Вчера попробовал включить его в настройках чтобы был всегда. Поставил в ассетах спрайтов одинаковый тэг и... в плеймоде открыл "статс". ровным счётом ничего не меняется

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

СообщениеДобавлено: 12 авг 2018, 19:32
AABB
Нечего ответить? Или вы думаете "хаха, лох, меряет производительность игры в редакторе". Но не я же его придумал.

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

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

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

СообщениеДобавлено: 12 авг 2018, 20:37
getAlex
https://docs.unity3d.com/Manual/SpriteAtlas.html

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

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



Неймспейс для работы с атласами https://docs.unity3d.com/2018.2/Documen ... ility.html