Оптический / снайперский прицел

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


Как правильно нарисовать прицел? Нужно учитывать, что регулировать размер конечной текстуры нельзя, она будет автоматически подстраиваться по вертикали, то есть это будет квадрат у которого стороны равны разрешению по вертикали экрана. Например:

Оптический / снайперский прицел

Ориентир здесь, это отступы снизу и сверху, до прозрачного круга в центе. В зависимости от того как вы нарисуете центральный круг, больше или меньше, именно так потом это будет выглядеть в самой игре. Разумеется рисовать надо на прозрачном фоне и сохранять в формате png. Кроме того понадобится еще одна текстура черного цвета, для заполнения пустых областей по краям экрана.

Теперь скрипт OpticalSight, вешаем его на персонажа:

using UnityEngine;
using System.Collections;

public class OpticalSight : MonoBehaviour {

	public static float mouse;

	public Texture2D mainTex;
	public Texture2D background;
	public float mouseMax = 10;
	public float mouseMin = 0.1f;
	public Camera _camera;
	public float maxFOV = 60;
	public float minFOV = 1;

	private float zoomLevel;
	private bool zoomStart;
	private bool zoom;

	void Start()
	{
		mouse = mouseMax;
	}

	void Update()
	{
		if(Input.GetMouseButton(1))
		{
			zoom = true;
			if(!zoomStart)
			{
				// стартовые, зум и чувствительность мыши, после включения прицела
				zoomStart = true;
				zoomLevel = maxFOV - 20;
				mouse -= 3.32f;
			}
		}
		else
		{
			zoomStart = false;
			zoom = false;
			zoomLevel = maxFOV;
			mouse = mouseMax;
		}

		if(Input.GetAxis("Mouse ScrollWheel") > 0)
		{
			if(zoomLevel > minFOV) 
			{
				mouse -= 0.83f; // шаг, регулировки чувствительности мышки
				zoomLevel -= 5; // шаг, регулировки зума
			}
		}
		if(Input.GetAxis("Mouse ScrollWheel") < 0)
		{
			if(zoomLevel < maxFOV)
			{
				mouse += 0.83f;
				zoomLevel += 5;
			}
		}

		mouse = Mathf.Clamp(mouse, mouseMin, mouseMax);
		zoomLevel = Mathf.Clamp(zoomLevel, minFOV, maxFOV);
		_camera.fieldOfView = Mathf.Lerp(_camera.fieldOfView, zoomLevel, 10 * Time.deltaTime);
	}

	void OnGUI()
	{
		if(zoom)
		{
			GUI.depth = 999;
			int hor = Screen.width;
			int ver = Screen.height;
			GUI.DrawTexture(new Rect((hor - ver) / 2, 0, ver, ver), mainTex);
			GUI.DrawTexture(new Rect((hor / 2) + (ver / 2), 0, hor / 2, ver), background);
			GUI.DrawTexture(new Rect(0, 0, (hor / 2) - (ver / 2), ver), background);
		}
	}
}


mouse - эту переменную надо использовать в скрипте, который отвечает за вращение головой/камерой с помощью мышки. А конкретно тут устанавливается чувствительность для мыши, потому что чем больше зум, тем меньше нужно делать чувствительность.

mainTex - текстура прицела.

background - текстура фона прицела.

mouseMax - чувствительность мышки по умолчанию, когда прицел отключен.

mouseMin - чувствительность мыши когда зум на максимуме.

_camera - камера персонажа.

maxFOV - поле зрение по умолчанию, при отключенном зуме. Стандартное значение - 60.

minFOV - минимально допустимое значение поля зрения (максимальный зум).

В блоке OnGUI мы рисуем наш прицел, если удерживается правая кнопка мыши. Порядок рисования такой: сначала идет текстура прицела по центру экрана и так как это квадрат то неизбежно останутся пустые области, далее, текстура фона заполняет область справа от прицела, затем слева.

Ниже можно скачать проект, где есть привязка на чувствительность мышки:

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

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

Офлайн
AlxDsx 10 февраля 2019
Спасибо, все работает.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика