Войти
ПрограммированиеФорум2D графика и изометрия

Unity: спрайты персонажей странно перекрывают друг друга

#0
9:54, 3 дек. 2014

Привет всем.
Борюсь с проблемой и не знаю как решить:
Есть несколько персонажей. Каждый персонаж состоит из нескольких спрайтов(игра 2D).
Допустим персонаж - это голова с глазами... Так вот, если сделать несколько голов с глазами и наложить их друг на друга, то они странно
перекроют друг друга: спрайт одной головы, допустим, перекроет спрайт другой головы, а глаза ничем не перекрываются(
Older in layers не помог, все спрайты находятся по оси Z в 0.
Как сделать так, чтобы персонажи правильно отрисовывались(сперва один, затем другой)???
Заранее благодарен за ответы)


#1
11:20, 3 дек. 2014

Убери order in layers, и вывстави персонажей в разницу 0.25 по Z в нужном порядке и все

#2
13:11, 3 дек. 2014

Спасибо)

#3
0:56, 4 дек. 2014
Edisoni
Убери order in layers, и вывстави персонажей в разницу 0.25 по Z в нужном порядке и все

Зачем даете такие советы человеку. Это же 2d игра, а значит z координата там точно не нужна. В unity для сортировки правильно использовать layers и order in layer. Для того чтобы персонажи не пересекались нужно проставить правильные order in layer для КАЖДОГО спрайта КАЖДОГО персонажа.
Пример:
Два персонажа, состоящие из двух спрайтов каждый: голова и глаза. Чтобы второй персонаж рисовался поверх первого нужно проставить такие order in layer:

голова первого персонажа - 0
глаза первого персонажа - 1

голова второго персонажа - 2
глаза второго персонажа - 4

Это самое простое решение, но оно правильнее чем использовать z координату.

Более сложный, но и более удобный способ - это объединить текстуры в атлас и создать из них один mesh. Тогда каждый персонаж может быть представлен одним mesh'ем и соответственно задавать order in layer нужно будет только для этих mesh'ей.

#4
10:16, 4 дек. 2014

Спасибо, проблема в том, что к=есть перфаб и много одинаковых персонажей...
Вот, по технологии
1 персонаж:
голова первого персонажа - 0
глаза первого персонажа - 1
2 персонаж:
голова первого персонажа - 0
глаза первого персонажа - 1

Получится что-то странное при пересечении персонажей( А где почитать про объединение текстур в атлас?

#5
18:15, 4 дек. 2014

Alerr
не 0 1 0 1, а 0 1 2 3, напиши пару строк при instanciate, чтобы order in layer прибавлялся каждый раз, это самый быстрый способ

#6
20:37, 4 дек. 2014

Cruelbob
А что не так с Z-координатой?
Юнити явно говорит, что для мешей в очереди Transparent (что в тексте "шейдера") будет явная сортировка по Z.
Так что использование Z здесь вполне логично и уместно

#7
16:09, 5 дек. 2014
dip
А что не так с Z-координатой?
Юнити явно говорит, что для мешей в очереди Transparent (что в тексте "шейдера") будет явная сортировка по Z.
Так что использование Z здесь вполне логично и уместно

Она тут не нужна. Зачем нам расстояние между объектами в трехмерном пространстве, если нам нужно всего лишь указать порядок отрисовки в двухмерной игре?

#8
22:27, 11 янв. 2015

Разбираюсь-разбираюсь со всеми этими мешами и прочим. Вообщем, есть спрайт. Этот спрайт содержится в нескольких материалах(Sprite/Default, изменен color).
По оси Z гейм обджекты с разными материалами одного спрайта на одном уровне(гейм обджекты содержат меш фильтер и меш рендер).
Мне нужно отрисовать одну текстуру поверх другой. Как это сделать??????(меши же отображают текстуру?)
До чего я дошел: есть много вариантов как это сделать: например сдвинуть по оси Z. Этот вариант отпадает.
Есть вариант Выставить гейм обджектам теги и задать порядок отрисовки в шейдере:
...
Tags { "Queue" = "Transparent" "G1"="1" "G2"="2"...
...
Этот способ, как я понимаю, аналогичен заданию older in layer для спрайтов. Это так???
Так вот, почему-то этот способ не работает( Почему, что не так????
Подскажите, как задать очередность отрисовки текстур.

#9
5:30, 12 янв. 2015

Alerr
Если тебе надо отрисовать в одном меше две/несколько разных текстур, то на помощь приходят шейдеры.
Правда, я в юньке только 2Д копаю, поэтому до шейдеров вряд ли скоро дойду.

#10
9:14, 12 янв. 2015

Ага, значит верно мыслю) Может кто-то и подскажет)
Насчет 2D, так в 2D это тоже нужно) Есть вещи, которые требуют этого и в 2D.
Например воду не отрисуешь спрайтами, некрасиво получится. Вот здесь-то и приходится
крутиться. Вот это(Tags { "Queue" = "Transparent" "Tag1"="1" "Tag2"="2"... ), я так понял, должно помочь решить
эту проблему, но почему-то GameObject-ы с Тег1 и Тег2 особо не перекрывают друг друга как нужно(

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.