Скрипт управления камерой для RTS

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

Итак, скрипт CameraControl, который вешаем на камеру:

using UnityEngine;
using System.Collections;

public class CameraControl : MonoBehaviour {

	public float speed = 5;

	public KeyCode left = KeyCode.A;
	public KeyCode right = KeyCode.D;
	public KeyCode up = KeyCode.W;
	public KeyCode down = KeyCode.S;
	public KeyCode rotCamA = KeyCode.Q;
	public KeyCode rotCamB = KeyCode.E;

	public Transform startPoint;
	public int rotationX = 70;
	public float maxHeight = 15;
	public float minHeight = 5;
	public int rotationLimit = 240;

	private float camRotation;
	private float height;
	private float tmpHeight;
	private float h, v;
	private bool L, R, U, D;

	void Start () 
	{
		height = (maxHeight + minHeight) / 2;
		tmpHeight = height;
		camRotation = rotationLimit / 2;
		transform.position = new Vector3(startPoint.position.x, height, startPoint.position.z);
	}

	public void CursorTriggerEnter(string triggerName)
	{
		switch(triggerName)
		{
		case "L":
			L = true;
			break;
		case "R":
			R = true;
			break;
		case "U":
			U = true;
			break;
		case "D":
			D = true;
			break;
		}
	}

	public void CursorTriggerExit(string triggerName)
	{
		switch(triggerName)
		{
		case "L":
			L = false;
			break;
		case "R":
			R = false;
			break;
		case "U":
			U = false;
			break;
		case "D":
			D = false;
			break;
		}
	}

	void Update () 
	{
		if(Input.GetKey(left) || L) h = -1; else if(Input.GetKey(right) || R) h = 1; else h = 0;
		if(Input.GetKey(down) || D) v = -1; else if(Input.GetKey(up) || U) v = 1; else v = 0;

		if(Input.GetKey(rotCamB)) camRotation -= 3; else if(Input.GetKey(rotCamA)) camRotation += 3;
		camRotation = Mathf.Clamp(camRotation, 0, rotationLimit);

		if(Input.GetAxis("Mouse ScrollWheel") > 0)
		{
			if(height < maxHeight) tmpHeight += 1;
		}
		if(Input.GetAxis("Mouse ScrollWheel") < 0)
		{
			if(height > minHeight) tmpHeight -= 1;
		}

		tmpHeight = Mathf.Clamp(tmpHeight, minHeight, maxHeight);
		height = Mathf.Lerp(height, tmpHeight, 3 * Time.deltaTime);

		Vector3 direction = new Vector3(h,v,0);
		transform.Translate(direction * speed * Time.deltaTime);
		transform.position = new Vector3(transform.position.x, height, transform.position.z);
		transform.rotation = Quaternion.Euler(rotationX, camRotation, 0);
	}
}

Стоит сразу отметить, что движение камеры будет по плоскости XZ, с наклоном по оси Х, за что отвечает переменная rotationX. Стартовая позиции в начале сцены, настраивается через другой объект, в startPoint, просто создаем пустой объект и ставим его туда, где нужна камера во время старта игры. Это сделано для того, что может понадобится, чтоб камера стартовала в одной из нескольких стартовых точек. Остается лишь один раз настроить основные переменные, а затем только менять стартовые точки в разных сценах.



Теперь, надо сделать рамку, которая будет ловить курсор и управлять движением камеры. Добавляем GameObject > UI > Image, далее, на картинку вешаем обработчик событий Add Component > Event > Event Trigger. В обработчик мы добавим два события PointerEnter и PointerExit, то есть когда курсор попадет на объект и уходит, соответственно. В самих событиях, указываем камеру и выбираем в списке скрипт с соответствующей функцией.

Скрипт управления камерой для RTS

Из картинки делаем полоску и размещаем ее например с левого края экрана, полоску переименовываем в L, чтобы не запутаться и такое же имя указываем в полях обработчика событий, как показано на скриншоте. Затем просто дублируем полоску, и делаем из них рамку экрана, с именами L, R, U, D (влево, вправо, вверх, вниз).


Настраиваем ширину рамки и делаем ее прозрачной. Получится, что как только курсор попадет на одну из полос, камера начнет движение. Всё достаточно просто.

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

Офлайн
datodavita1212 16 октября 2018
a skachat proekt nenada bilo? ((( pajalistaa
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика