Перемещение через миникарту / RTS версия

Миникарта в стратегии или допустим в пошаговой игре с элементами стратегии, это как правило статическая картинка, которая вот так сюрприз и есть мини версия игровой карты. Ранее мы уже делали миникарту динамического типа, она может вращаться и показывает лишь определенную область вокруг персонажа. Но для стратегии нам нужны несколько иные задачи. Отображение юнитов, так же как и в варианте динамической карты, вместо персонажа – икона камеры. Плюс, если игрок кликает мышкой по миникарте, то камера должна перемещаться в указанную точку, относительно игровой карты. То есть, перенос координат из UI в мировые.


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

Позиция Plane, который используется в миникарте, должна быть по нулям (и потом менять нельзя - это важно!), а игровое поле надо центрировать. То бишь, если вы создавали игровое поле, где-то вдалеке от центра мировых координат, то соответственно поле нужно передвинуть. Затем подогнать размеры Plane, чтобы накрыть всё поле.

Вносим изменения в скрипт MiniMap:

using UnityEngine;
using System.Collections;

public class MiniMap : MonoBehaviour {

	public Transform target;
	public float zoom = 10;
	public GameObject mainCamera;
	public enum Mode {topLeft = 0, topRight = 1, bottomLeft = 2, bottomRight = 3};
	public Mode minimapMode = Mode.bottomLeft;

	private Vector2 XRot = Vector2.right;
	private Vector2 YRot = Vector2.up;
	private RectTransform myTransform;
	private bool isMouse;

	void Awake () 
	{
		myTransform = GetComponent<RectTransform>();
	}
	
	public Vector2 TransformPosition(Vector3 position)
	{
		Vector3 offset = position - target.position;
		Vector2 pos = offset.x * XRot;
		pos += offset.z * YRot;
		pos *= zoom;
		return pos;
	}

	public Vector3 TransformRotation(Vector3 rotation)
	{
		return new Vector3(0, 0, target.eulerAngles.y - rotation.y);
	}

	public Vector2 MoveInside(Vector2 point)
	{
		Rect rect = GetComponent<RectTransform>().rect;
		point = Vector2.Max(point, rect.min);
		point = Vector2.Min(point, rect.max);
		return point;
	}

	void LateUpdate()
	{
		XRot = new Vector2(target.right.x, -target.right.z);
		YRot = new Vector2(-target.forward.x, target.forward.z);

		if(isMouse)
		{
			if(Input.GetMouseButtonDown(0))
			{
				SetWorldPosition(mainCamera);
			}	
		}
	}

	public void SetMouse(bool state)
	{
		isMouse = state;
	}

	void SetWorldPosition(GameObject obj)
	{
		Vector2 mouse = Input.mousePosition;
		float X = 0;
		float Y = 0;
		Vector3 curPos = Vector3.zero;

		X = myTransform.anchoredPosition.x - myTransform.sizeDelta.x / 2;
		Y = myTransform.anchoredPosition.y - myTransform.sizeDelta.y / 2;

		switch(minimapMode)
		{
		case Mode.topLeft:
			Y += Screen.height;
			break;
		case Mode.topRight:
			X += Screen.width;
			Y += Screen.height;
			break;
		case Mode.bottomRight:
			X += Screen.width;
			break;
		}

		curPos = new Vector3(mouse.x - X, mouse.y - Y, 0);

		X = myTransform.sizeDelta.x / 2;
		Y = myTransform.sizeDelta.y / 2;
		Vector3 pos = new Vector3((curPos.x - X) / zoom, 0, (curPos.y - Y) / zoom);
		pos = new Vector3(pos.x, mainCamera.transform.position.y, pos.z);
		obj.transform.position = pos;
	}
}

Данные изменения позволят нам управлять позицией камеры в мировых координатах, когда мы кликаем по миникарте. В target теперь указываем наш Plane. Масштаб карты zoom выкручиваем так, чтобы она вся помещалась в окошке. Камеру помещаем в mainCamera.

Опция minimapMode выбирается в зависимости от расположения миникарты и якоря, например:

Перемещение через миникарту / RTS версия

Если нижний левый угол, то выбираем опцию Bottom Left.

Затем на UI объект MiniMap добавляем компонент Event Trigger и устанавливаем функцию SetMouse на вход и выход курсора:


Когда курсор попадает на миникарту, разрешаем клик.

В целом это все основные изменения. По такому же принципу можно перемещать указатель цели для юлнитов допустим, чтобы можно было кликнуть по миникарте в нужное место и юниты сами туда поедут. Стоит более подробно поковырять проект в живую, чтобы понять как и что.

Скачать можно тут:

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