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

Ориентир здесь, это отступы снизу и сверху, до прозрачного круга в центе. В зависимости от того как вы нарисуете центральный круг, больше или меньше, именно так потом это будет выглядеть в самой игре. Разумеется рисовать надо на прозрачном фоне и сохранять в формате png. Кроме того понадобится еще одна текстура черного цвета, для заполнения пустых областей по краям экрана.
Теперь скрипт OpticalSight, вешаем его на персонажа:
mouse - эту переменную надо использовать в скрипте, который отвечает за вращение головой/камерой с помощью мышки. А конкретно тут устанавливается чувствительность для мыши, потому что чем больше зум, тем меньше нужно делать чувствительность.
mainTex - текстура прицела.
background - текстура фона прицела.
mouseMax - чувствительность мышки по умолчанию, когда прицел отключен.
mouseMin - чувствительность мыши когда зум на максимуме.
_camera - камера персонажа.
maxFOV - поле зрение по умолчанию, при отключенном зуме. Стандартное значение - 60.
minFOV - минимально допустимое значение поля зрения (максимальный зум).
В блоке OnGUI мы рисуем наш прицел, если удерживается правая кнопка мыши. Порядок рисования такой: сначала идет текстура прицела по центру экрана и так как это квадрат то неизбежно останутся пустые области, далее, текстура фона заполняет область справа от прицела, затем слева.
Ниже можно скачать проект, где есть привязка на чувствительность мышки:
Как правильно нарисовать прицел? Нужно учитывать, что регулировать размер конечной текстуры нельзя, она будет автоматически подстраиваться по вертикали, то есть это будет квадрат у которого стороны равны разрешению по вертикали экрана. Например:

Ориентир здесь, это отступы снизу и сверху, до прозрачного круга в центе. В зависимости от того как вы нарисуете центральный круг, больше или меньше, именно так потом это будет выглядеть в самой игре. Разумеется рисовать надо на прозрачном фоне и сохранять в формате 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
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.