Декали в Unity3D
Данная статья является переводом следующих статей:
Decals in Unity3D, Part 1 Decals in Unity3D, Part 2 Часть 1. В первой части мы используем самый простой способ создания декали: создание префаба в точке контакта. Первым делом мы должны создать составные части нашего префаба: примитив plane и материал. Затем нам нужна текстура с альфа-каналом для того чтобы использовать шейдеры семейства Transparent в Unity. Наконец мы должны применить текстуру с альфа-каналом к созданному материалу. Вот наш plane с использованием шейдера Transparent/Diffuse и нанесенной на него текстурой: Теперь мы просто создаем новый префаб в окне Project и перетаскиваем созданный plane на него. Создаем новый C# скрипт в окне Project и называем его как хотим. В этом примере имя файла Decal01.cs, поэтому имя класса должно быть Decal01: PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Зайдите в редактор тегов и добавьте новый тег, назовем его "DecalOn". Теперь давайте вернемся к коду и добавим простое условие создания декали: PHP код:
1) Луч должен пересекать объект на котором должна появиться декаль; 2) Объект должен иметь тег "DecalOn"; 3) Игрок должен нажать левую кнопку мыши. Когда все эти три условия выполняться префаб-декаль будет создан на объекте, как раз в точке контакта и с правильной ориентацией в пространстве. Часть 2. В этой части мы рассмотрим несколько проблем, возникающих при использовании метода с предыдущей части. Вы могли заметить одну большую проблему: на большой стене она работает отлично, но что делать если место контакта в углу объекта? Декаль будет выходить за пределы объекта: Итак, как мы можем избежать этой проблемы? Ответ достаточно прост, но он может не удовлетворить Вас. Чтобы избежать выход декали за пределы объекта нужно выполнить проверку на уровне вершин декали: если его вершины находятся за пределами, то мы перемещаем их обратно на границу за которую они вышли. На самом деле, это довольно простая задача, но она содержит много ограничений. Прежде всего, мы не можем использовать ее в другом месте, нежели в объектах типа plane и cube. Правда, стены и колонны в играх в основном состоят из кубов различной формы и размеров, но это все равно является ограничением. Еще большее ограничение в том что объекты должны быть выравнены по осям. К тому же декали не будут работать на вращающихся объектах. Я решил поделиться этим методом несмотря на ограничения описанные выше, потому что это может быть полезно в учебных целей, и может пригодиться для выполнения некоторых других задач. Давайте посмотрим финальную версию скрипта, а затем будем вдаваться в подробности: PHP код:
Прежде всего, мы создаем новую переменную с именем "decalInst", которая будет содержать наш префаб-декаль. Она будет обработана и возвращена в конце метода. Затем мы создаем префаб-декаль таким же способом как в первой части. Далее нам нужно взять некоторую из переменной "decalInst" информацию, для того чтобы сделать все необходимые проверки. Мы должны получить от "decalInst" MeshFilter префаба-декали, а затем его Mesh, так мы получим доступ ко всем его вершинам. Мы также создаем новый Vector3 массив для хранения вершин сетки префаба-декали и для операций на копии. Далее идет цикл, в котором мы проходим через все вершины сетки, преобразовываем их в локальных координатах, а также проверяем отдельно каждую Vector3 компоненту (х, у и z) на выход за пределы объекта. Если ни один из них не выходит за пределы объекта, то возвращаем их на свои оси. Затем мы преобразуем массив вершин Verts обратно в глобальное пространство, и передаем их на вершины сетки префаба-декали (мы работали с копией). Наконец, мы возвращаем наш префаб-декаль. Если сейчас попробовать запустить игру, вы заметите, что декали никогда не будут выходить за пределы объекта. Довольно мило, да? |
Ответ: Декали в Unity3D
Огромный респект! Как раз то, что мне сейчас нужно!
|
Ответ: Декали в Unity3D
в апдейте лучше проверку на нажатие мышки вынисти на самый верхний уровень, что бы проверять рейкаст только по клику а не каждый апдейт !!
|
Ответ: Декали в Unity3D
А не правильнее ли:
Instantiate(decalPrefab, hit.point, Quaternion.FromToRotation(-decalPrefab.transform.up, hit.normal)); Иначе поворачиваться будет тот объект, в котором находится этот скрипт, а не создаваемый из префаба объект. |
Ответ: Декали в Unity3D
Цитата:
|
Ответ: Декали в Unity3D
Очень неплохо для начала. Но можно использовать бесплатный ассет из ассетстора:
Simple decal system https://www.assetstore.unity3d.com/en/#!/content/13889 Качаем и используем. Очень удобно. |
Часовой пояс GMT +4, время: 08:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot