Делаем компас как в Skyrim или вроде того

Компас наподобие как в игрушке The Elder Scrolls V Skyrim, или например, Fallout 3. Не полная копия, конечно, тем не менее, что-то похожее в качестве примера. Далеко не в каждой игре нужна полноценная мини карта, порой, вполне достаточно компаса, для указания точки назначения, врагов и прочее. Кстати, если вам нужна именно мини карта, то ищите ее у нас на сайте. Итак, компас, что он у нас будет делать? Кроме как указывать цель, само собой. Смена цвета, то есть, если смотреть прямо на цель, то допустим стрелка будет белого цвета, если отклониться в любую сторону, то цвет меняется на серый. Плюс, будет меняется размер указателя, в зависимости от расстояния до цели, что служит дополнительной подсказкой, насколько близко игрок к цели.


Подготовка. Нам понадобится во первых стрелка-указатель, нарисуем ее. Еще можно нарисовать фон, на котором будет бегать указатель. Затем добавим несколько UI объектов. Добавляем Canvas с настройками по умолчания.

В него добавляем Image и назовем это CompassBG, будет фоном, настраиваем позицию:

Делаем компас как в Skyrim или вроде того

Внимание! Картинка должна быть закреплена по центру экрана вверху, либо внизу!

Теперь добавляем еще одну картинку, наш указатель, назовем его Arrow, и делаем его дочерним к CompassBG:


Настраиваем размеры и обязательно ставим галочку Preserve Aspect!

Вешаем на Canvas скрипт Compass и указываем в нем необходимые объекты:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Compass : MonoBehaviour {

	public Transform player;
	public Transform target;

	public RectTransform arrow; // изображение UI, указатель цели, дочерний объект фона
	public RectTransform compassBG; // изображение UI, фон компаса, в пределах которого будет двигаться указатель

	public Color arrowIn = Color.white;
	public Color arrowOut = Color.gray;

	private float minSize;
	private float maxSize;

	void Start () 
	{
		arrow.anchoredPosition = new Vector2(0, 0);
		maxSize = arrow.sizeDelta.x;
		minSize = maxSize / 2;
	}
	
	void LateUpdate ()
	{
		float posX = Camera.main.WorldToScreenPoint(target.position).x; // находим позицию цели в пространстве экрана, по оси Х
		float center = Screen.width / 2; // определяем центр экрана

		Vector3 forward = Camera.main.transform.TransformDirection(Vector3.forward);
		Vector3 toOther = target.position - Camera.main.transform.position;
		if (Vector3.Dot(forward, toOther) < 0) posX = 0; // если цель позади нас - позиция равна нулю

		float minPos = center - compassBG.sizeDelta.x / 2;
		float maxPos = center + compassBG.sizeDelta.x / 2;
		posX = Mathf.Clamp(posX, minPos, maxPos); // фиксируем позицию цели в приделах бэкграунда компаса

		posX = center - posX; // корректируем позицию, относительно центра
		arrow.anchoredPosition = new Vector2(-posX, 0); // инвертируем

		Color tmp = Color.Lerp(arrowIn, arrowOut, Mathf.Abs(posX)/(compassBG.sizeDelta.x / 2));
		arrow.GetComponent<Image>().color = tmp; // переключаем цвета, значения от 0 до 1, центр экрана = 0

		// определяем размер указателя, относительно расстояния до цели
		float dis = Vector3.Distance(player.position, target.position);
		float size = maxSize - dis / 4;
		size = Mathf.Clamp(size, minSize, maxSize);
		arrow.sizeDelta = new Vector2(size, arrow.sizeDelta.y);
	}
}

Собственно вот и всё.

Еще одно примечание, у камеры игрока должен быть стандартный тег MainCamera.

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

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