Вариант реализации лазерного луча в игре

Будем делать вроде как лазерный луч, на примере, для игры с видом сверху или от третьего лица. Нижеприведенный скрипт можно сразу использовать в своем проекте, если нужно что-то подобное. Разумеется, при желании можно переделать под игру от первого лица, главное понять как всё это работает, что мы разберем тоже, конечно же. Итак, в результате мы получим луч, который как бы вылетает из пушки и тянется до точки клика, при этом он будет сталкиваться с другими объектами, то бишь, определение препятствий. А сам луч, это обычный меш, который можно будет разукрасить как угодно и прицепить какие-нибудь плюшки для красоты, если есть такая необходимость.


Создадим сам лазер.
С начало добавляем пустой объект, назовем его Laser. А в нем создаем дочерний Cylinder из стандартных наборов.

Вариант реализации лазерного луча в игре

Настраиваем цилиндр так, чтобы он был похож на луч и разворачиваем его по вектору Z родительского объекта.


Внимание! У цилиндра, оставляем длину равной единице. Например;


Это важно, иначе будет некорректный расчет длинны луча.

Теперь, создаем C# скрипт Laser, вешаем его на персонажа и указываем переменные:

using UnityEngine;
using System.Collections;

public class Laser : MonoBehaviour {

	[SerializeField] private float size = 100; // длинна луча
	[SerializeField] private Transform laser; // родительский объект модели луча
	[SerializeField] private Transform gunPoint; // точка откуда должен вылетать луч
	[SerializeField] private LayerMask ignoreMask; // фильтр по слоям
	private float dist;

	void Create() 
	{
		dist = size;
		Vector3 hit = gunPoint.position + (gunPoint.localPosition + gunPoint.forward * dist);
		Vector3 center = (gunPoint.position + hit)/2;

		RaycastHit line;
		if(Physics.Linecast(gunPoint.position, hit, out line, ~ignoreMask))
		{
			if(!line.collider.isTrigger)
			{
				dist = Vector3.Distance(gunPoint.position, line.point);
				center = (gunPoint.position + line.point)/2;
			}
		}

		laser.localScale = new Vector3(1, 1, dist/2);
		laser.position = center;
		laser.localPosition = new Vector3(0, 0, laser.localPosition.z);
		laser.gameObject.SetActive(true);
	}

	void LateUpdate()
	{
		if(Input.GetMouseButton(0))
		{
			Create();
		}
		else
		{
			laser.gameObject.SetActive(false);
		}
	}
}

Стоит обратить внимание на иерархию объектов, вне зависимости от исходных моделей персонажа, его оружия и формы луча. Должны соблюдаться некоторые моменты:


Объект Gun Point (откуда вылетает луч) должен иметь масштаб в единицу по всем осям, тоже самое относится и к объекту Laser, кроме того, все они должны быть ориентированны по си Z.



Скачать демо проект:

У вас нет доступа!

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

Офлайн
Очень хорошо получилось. Теперь знаю как делать лазер!!! Спасибо!
Офлайн
А как сделать так, чтобы лазер всегда был одной длины и мог проходить сквозь объекты?
Офлайн
Light 6 января 2017
Андрей Федотов, немного обновил проект, нужно перекачать. А чтобы луч всегда был одной длинны, то надо просто выбрать все слои в ignoreMask.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика