Курсор и анимация, на базе UI

В играх жанра «квест», где нужно заниматься поиском активных объектов, анимированные курсоры, штука крайне полезная. Впрочем, это касается не только «квеста», кроме чисто визуального эффекта, такой подход может нести и информативную нагрузку. Ранее, мы разбирали замены иконки системного курсора, но без возможности анимации. На этот раз воспользуемся средствами Unity UI, что позволит использовать стандартные возможности анимации спрайтов. Итак, нам нужно написать скрипт, который будет менять иконки курсора, в зависимости от тега объекта. А так же, разберемся, как правильно настроить элементы UI под нашу задачу.

Добавляем на сцену UI > Canvas и сразу удаляем компонент Graphic Raycaster, потому как нам не нужно взаимодействие UI рейкаста с нашими элементами. Теперь в Canvas картинку Image, настраиваем в ней спрайт и размеры, и если нужно, сразу делаем анимацию для этого курсора, плюс, настраиваем присет для RectTransform объекта:

Курсор и анимация, на базе UI

Внимание! Точно такой же присет должен быть установлен для всех курсоров.



После того как сделали нужные курсоры и анимацию к ним, вешаем на Canvas скрипт:

using UnityEngine;
using System.Collections;

public class MainCursor : MonoBehaviour {
	
	public RectTransform[] cursors;

	public enum ProjectMode {Project3D = 0, Project2D = 1};
	public ProjectMode mode = ProjectMode.Project3D;

	private Vector2 offset;
	private int index = -1;
	
	void Awake () 
	{
		Cursor.visible = false; // скрываем системный курсор

		// для 2D физики, нужно установить режим работы камеры Orthographic
		if(mode == ProjectMode.Project2D && !Camera.main.orthographic)
			Debug.LogError(this + " :: Выбранный режим > 2D > не соответствует настройкам камеры!");
	}
	
	void SetCursor(string tags)
	{
		int i = 0;
		bool center = false;

		switch(tags)
		{
		case "Player": // тег для переключения курсора
			center = true; // курсор по центру?
			i = 1; // номер иконки в массиве
			break;
		}

		if(index != i)
		{
			// выключаем все прочие иконки, кроме выбранной
			foreach(RectTransform obj in cursors)
			{
				obj.gameObject.SetActive(false);
			}
			cursors[i].gameObject.SetActive(true);

			if(center) offset = Vector2.zero; // курсор будет по центру иконки
			else offset = new Vector2(cursors[i].sizeDelta.x / 2, -cursors[i].sizeDelta.y / 2); // сдвиг иконки, курсор будет в верхнем левом углу (стандартное положение)
		}

		index = i;

		SetPosition(cursors[i]);
	}

	void SetPosition(RectTransform rectTransform)
	{
		rectTransform.anchoredPosition = new Vector2(Input.mousePosition.x + offset.x, Input.mousePosition.y + offset.y);
	}
	
	void LateUpdate () 
	{
		if(mode == ProjectMode.Project3D)
		{
			RaycastHit hit;
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

			if (Physics.Raycast(ray, out hit))
			{
				SetCursor(hit.transform.tag);
			}
			else // если луч никуда не попадет
			{
				SetCursor("Untagged");
			}
		}
		else
		{
			RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

			if(hit.transform != null)
			{
				SetCursor(hit.transform.tag);
			}
			else
			{
				SetCursor("Untagged");
			}
		}
	}
}

В массиве cursors указываем все наши курсоры, а в функции SetCursor прописываем нужные теги и соответствующие им номера в массиве. Собственно как то, так. Теперь можно использовать анимированные курсоры из спрайтов в своей игре.

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

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