Обрезка спрайта
| |
Cmaujluk | Дата: Пятница, 15 Мая 2015, 18:59 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Всем привет! Столкнулся с такой проблемкой, гугл помочь не смог. Суть в чем, есть 2Dспрайт, например, кольца, можно каким либо способом вырезать из него кусок кодом? Т.е. например если обрезать все что больше оси Х получим букву С Если взять например все что выше оси y+3 то получим букву U, и т.д. Или вообще сделать отверстия через каждые 10 пикселей. С меня как всегда +.
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
|
|
| |
Aevien | Дата: Пятница, 15 Мая 2015, 19:12 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Этого добиться можно при помощи написания своего шейдера. Для этого нужно изучить документацию по их программированию. Понятно, что трудно, но направление я тебе дал точное. Успехов!
|
|
| |
HardcoreCoder | Дата: Пятница, 15 Мая 2015, 19:33 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Программирую с нуля, без движков типа Юнити, так что не знаю че да как там :). Обрезка спрайтов называется Rect, когда программа вырезает часть картинки и выводит ее на экран. Так что ищи подобное для Юнити
SimpleMoscowGuy
С++ & C# programmer PAWN scripter Всегда буду рад вам помочь, обращайтесь.
Сообщение отредактировал HardcoreCoder - Пятница, 15 Мая 2015, 19:34 |
|
| |
Cmaujluk | Дата: Пятница, 15 Мая 2015, 19:44 | Сообщение # 4 |
участник
Сейчас нет на сайте
| быстрый паинт. Нужно именно прозрачный т.к. видимая часть будет тригером. Похоже что Aevien прав, придется пилить шейдер.
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
Сообщение отредактировал Cmaujluk - Пятница, 15 Мая 2015, 19:45 |
|
| |
beril | Дата: Пятница, 15 Мая 2015, 23:26 | Сообщение # 5 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Как уже было сказано выше: шейдерами + маска. Смотри в сторону Transparent Cutout шейдеров
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Tymonr | Дата: Суббота, 16 Мая 2015, 00:23 | Сообщение # 6 |
With OpenSource forever♥
Сейчас нет на сайте
| Я в юнити, конечно, ничего не понимаю, но неужели в движке такого уровня нет функций типа rect() и системы tile(sprite) sheet'a?
Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
|
|
| |
beril | Дата: Суббота, 16 Мая 2015, 06:45 | Сообщение # 7 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата Tymonr ( ) Я в юнити, конечно, ничего не понимаю, но неужели в движке такого уровня нет функций типа rect() и системы tile(sprite) sheet'a? Я так понимаю автору нужно обрезать не прямоугольную илли овальную область, а произвольную.
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Tymonr | Дата: Суббота, 16 Мая 2015, 10:35 | Сообщение # 8 |
With OpenSource forever♥
Сейчас нет на сайте
| beril, а, да, извиняюсь, что-то я протупил.
Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
|
|
| |
D0N | Дата: Суббота, 18 Июля 2015, 06:29 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Всем привет!Собственно у меня примерно такая-же проблема, необходимо обрезать спрайт по маске.Полезной информации очень мало, буквально по крупицам приходится собирать и сложить все это в одно целое у меня не получилось.Есть предположение, что нужно наложить маску на текстуру, добавив альфа канал, либо с шейдером нужно как-то шаманить, однако все на уровне догадок.Может кто направить в правильное русло? Куда дальше то плыть?
Сообщение отредактировал D0N - Суббота, 18 Июля 2015, 15:49 |
|
| |
Tymonr | Дата: Суббота, 18 Июля 2015, 08:22 | Сообщение # 10 |
With OpenSource forever♥
Сейчас нет на сайте
| Оно, не?
Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
|
|
| |
D0N | Дата: Суббота, 18 Июля 2015, 16:01 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата Tymonr ( ) Оно, не? Возможно, позже нужно будет потестить.А если стоит задача разделить один объект на несколько дочерних, причем срезы должны быть произвольные. В этом случае так-же необходимо маскировать спрайт, создавая дочерние объекты, либо же проще юзать меши? Например, как здесь реализовано - Sprite Slicer?
Сообщение отредактировал D0N - Суббота, 18 Июля 2015, 16:02 |
|
| |
KamiRonin | Дата: Суббота, 18 Июля 2015, 16:43 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Версия 1 - просто отрезать: Код
// создаем спрайт из исходного, с урезанным или тем же размером (Rect) Sprite newSpr = Sprite.Create(OriginalSprite.sprite.texture, new Rect(startX, startY, width, height), new Vector2(0.5f, 0.5f), 100f);
// заменяем в оригинальном спрайте урезанный спрайт OriginalSprite.sprite = newSpr;
где переменные startX, startY, width, height - задаются до этого участка согласно нужному расположению
Версия 2 - сложная модификация: Код // создаем текстуру для модификации... Texture2D newTexture = new Texture2D(width, height);
Color newColor = Color.clear; newTexture.SetPixel(x, y, newColor); <- тут в цикле по известным координатам (нужно посчитать отдельно) - стираем цвет
// создаем спрайт из исходного, с урезанным или тем же размером (Rect) Sprite newSpr = Sprite.Create(newTexture, new Rect(startX, startY, width, height), new Vector2(0.5f, 0.5f), 100f);
// заменяем в оригинальном спрайте урезанный спрайт OriginalSprite.sprite = newSpr;
все.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Суббота, 18 Июля 2015, 16:45 |
|
| |
D0N | Дата: Суббота, 18 Июля 2015, 18:28 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| @KamiRonin, спасибо вторая версия подойдет, однако как это повлияет на производительность? Все-таки циклически проверять каждый пиксель, по-моему не очень продуктивно, или это обычная практика в Unity?
|
|
| |
KamiRonin | Дата: Суббота, 18 Июля 2015, 18:37 | Сообщение # 14 |
почти ветеран
Сейчас нет на сайте
| Цитата D0N ( ) однако как это повлияет на производительность? на самом деле ожидается что будет это делаться не так часто.. т.е. отрисовал свое U или C и дальше не занимаешь этим процесс. а так, доступ к элементам массива очень быстрый. вообще тормоза начинаются при большом размере исходной текстуры и очень частой перерисовке. поэтому думаю это вполне оптимальный алгоритм при небольших спрайтах и рациональном режиме смены спрайтов. быстрее только заготовить "алфавит" заранее и просто показывать другой спрайт. что обычно и делается
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
|