Движение камеры мышкой + указатель

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


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

А вот на родительский объект вешаем скрипт:

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

public class CameraControl : MonoBehaviour {

	public Sprite cursorNormal, cursorMove;
	public RectTransform _cursor;
	public float sensitivity = 10;
	public float speed = 3;

	private Image img;
	private Vector3 offset, direction;
	private Sprite current;

	void Start()
	{
		img = _cursor.GetComponent<Image>();
		Cursor.visible = false;
	}

	void LateUpdate()
	{
		direction = Vector3.zero;

		if(CheckMouse())
		{
			current = cursorMove;
		}
		else
		{
			offset = new Vector3(_cursor.sizeDelta.x/2, -_cursor.sizeDelta.y/2, 0);
			current = cursorNormal;
		}

		_cursor.anchoredPosition = Input.mousePosition + offset;
		float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
		_cursor.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
		direction = Camera.main.transform.TransformDirection(direction);
		direction.y = 0;
		transform.Translate(direction * speed * Time.deltaTime);
		img.sprite = current;
	}

	bool CheckMouse()
	{
		bool left = false, right = false, down = false, up = false;

		if(Input.mousePosition.x < sensitivity)
		{
			offset = new Vector3(_cursor.sizeDelta.x/2, 0, 0);
			direction = Vector3.left;
			left = true;
		}

		if(Input.mousePosition.x > Screen.width - sensitivity)
		{
			offset = new Vector3(-_cursor.sizeDelta.x/2, 0, 0);
			direction = Vector3.right;
			right = true;
		}

		if(Input.mousePosition.y < sensitivity)
		{
			offset = new Vector3(0, _cursor.sizeDelta.y/2, 0);
			direction = Vector3.down;
			down = true;
		}

		if(Input.mousePosition.y > Screen.height - sensitivity)
		{
			offset = new Vector3(0, -_cursor.sizeDelta.y/2, 0);
			direction = Vector3.up;
			up = true;
		}

		if(left && up)
		{
			offset = new Vector3(_cursor.sizeDelta.x/2, -_cursor.sizeDelta.y/2, 0);
			direction = new Vector3(-1, 1, 0);
			return true;
		}
		else if(left && down)
		{
			offset = new Vector3(_cursor.sizeDelta.x/2, _cursor.sizeDelta.y/2, 0);
			direction = new Vector3(-1, -1, 0);
			return true;
		}
		else if(right && down)
		{
			offset = new Vector3(-_cursor.sizeDelta.x/2, _cursor.sizeDelta.y/2, 0);
			direction = new Vector3(1, -1, 0);
			return true;
		}
		else if(right && up)
		{
			offset = new Vector3(-_cursor.sizeDelta.x/2, -_cursor.sizeDelta.y/2, 0);
			direction = new Vector3(1, 1, 0);
			return true;
		}

		if(left || up || right || down) return true;

		return false;
	}
}

В роли курсора у нас, обычный UI Image, нужно лишь настроить его размер и всё.

Еще нужно нарисовать указатели. Стандартный курсор, рисуем так чтобы он указывал на верхний левый угол:

Движение камеры мышкой + указатель

Указатель направления, рисуем так чтобы он "смотрел" вправо, то есть, ориентирован по оси Х:


Всё, готово. Тестируем.

Скачать готовый пример:

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

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

Офлайн
datodavita1212 16 октября 2018
spasibaa bravo vi luchshie :) kissing_heart
Офлайн
Golden50k 23 ноября 2017
Спасибо, как всегда выручаете! smirk
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика