Целеуказатель с использованием проектора

Данный материал предназначен для новичков, на примере стандартного проектора, мы рассмотрим способ, как сделать целеуказатель. Такого вида указатель подойдет для любой игры с видом сверху. Как следует из названия темы, преимущество тут в том, что это проекция, а значит, текстура указателя будет накладываться на любую поверхность. Чтобы разобраться с вопросом, нам понадобится простенький скрипт, для отслеживания позиции курсора, и научится правильно настроить материал проектора. Плюс, необходимо нарисовать текстуру самого указателя так, чтобы изображение корректно отображалось на объектах.

Первым делом, нам нужно импортировать в проект шейдеры для проектора, они находятся в стандартном пакете Effects, можно импортировать весь ассет, если не хочется искать там необходимое. Теперь на сцену, нужно добавить пустой объект поднять его примерно на высоту как у камеры над поверхностью, затем, к этому объекту добавляем еще один дочерний и сразу устанавливаем вращение по оси Х на 90, чтобы наш проектор смотрел на поверхность. Далее, на дочерний объект добавляем компонент Projector, ставим галочку Orthographic, а размер, то есть Orthographic Size настроим позже.

Создаем новый материал с шейдером Projector > Light и добавляем его в наш проектор.

Целеуказатель с использованием проектора

В списке Ignore Layers нам нужно выбрать слои, которые игнорируются проектором. А это все, кроме слоя, который назначен для террейна, это важно, поэтому заранее создайте слой для "земли" и укажите исключение проектора.

Теперь о том, как нарисовать для материалы текстуры Falloff и Cookie.

Falloff для всех типов указателя одинаковый, это белая полоска с черными краями слева и справа:


То есть, тут мы делаем видимую только середину и отсекаем края.



Cookie это текстура для наложения, она должна иметь следующий вид:


Черный фон и белая картинка на нем. Обратите внимание, что холст (фон) должен быть немного больше, чем нужно. То есть, должны оставаться отступы по краям изображения. Если этого не будет, то проекция наложиться некорректно.

Когда всё готово добавляем текстуры в проект и в опции Wrap Mode ставим на Clamp.


Итак, теперь возвращаемся к проектору на сцену и на родительский объект вешаем скрипт:

using UnityEngine;
using System.Collections;

public class ProjectorComponent : MonoBehaviour {

	public Projector _projector;
	public LayerMask layerMask;
	private Transform myTransform;

	void Start()
	{
		myTransform = transform;
	}

	void Update()
	{
		RaycastHit hit;
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		if(Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
		{
			myTransform.position = new Vector3(hit.point.x, ray.origin.y, hit.point.z);
			_projector.farClipPlane = hit.distance * 2;
		}
	}
}

Здесь у нас так же имеется опция LayerMask, где мы указываем слой террайна.

Скачать демо сцену:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 5

Офлайн
Arik 4 мая 2016
Спасибо, то что надо.
Офлайн
AlxDsx 9 февраля 2019
Отлично работает, Спасибо!
Офлайн
sashan 25 марта 2019
Здравствуйте! не могу понять как делать этот этап" Когда всё готово добавляем текстуры в проект и в опции Wrap Mode ставим на Clamp".нету в Texture Type -Texture.Что делать ? Помогите !
Офлайн
Light 25 марта 2019
Цитата: sashan
Здравствуйте! не могу понять как делать этот этап" Когда всё готово добавляем текстуры в проект и в опции Wrap Mode ставим на Clamp".нету в Texture Type -Texture.Что делать ? Помогите !

Texture Type - Default
Офлайн
sashan 26 марта 2019
Light,
Спасибо!
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика