Взаимодействие с UI объектами

Несколько иной способ перемещения UI объектов, нежели тот, что мы публиковали ранее. Здесь мы отказались от использования как EventTrigger, так и EventSystems в частности. В следствии чего у разработчика будет больше возможностей, поскольку подобные элементы он сможет применять в тех или иных случаях на свое усмотрение. Кроме того, EventTrigger не работает с пустым RectTransform, а в нашем варианте данного ограничения нет. Нам нужно научится определять, перекрывает ли курсор нужный нам объект, и сохранить оригинальную иерархию элементов, то есть, если в случаи, когда один объект перекрыт другим, активен должен быть тот, что на переднем плане.

Решение вопроса заключается в следующем.

На дочерней объект Canvas, который мы можем двигать, вешаем скрипт:

using UnityEngine;
using System.Collections;

public class MoveUIComponent : MonoBehaviour {

	private RectTransform _rect;

	void Awake()
	{
		_rect = GetComponent<RectTransform>();
	}

	public RectTransform rect
	{
		get{ return _rect; }
	}
}

А на сам Canvas цепляем:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MoveUI : MonoBehaviour {

	private List<MoveUIComponent> rect = new List<MoveUIComponent>();
	private Vector3 offset;
	private RectTransform current;

	void Start()
	{
		for(int i = 0; i < transform.childCount; i++)
		{
			MoveUIComponent comp = transform.GetChild(i).GetComponent<MoveUIComponent>();
			if(comp)
			{
				rect.Add(comp);
			}
		}
	}

	void Update()
	{
		if(Input.GetMouseButtonDown(1))
		{
			int index = -1;
			for(int i = 0; i < rect.Count; i++)
			{
				if(IsMouseOverUI(rect[i].rect))
				{
					index = i;
				}
			}
			if(index < 0) return;
			offset = rect[index].rect.position - Input.mousePosition;
			current = rect[index].rect;
		}

		if(Input.GetMouseButtonUp(1))
		{
			current = null;
		}

		if(current)
		{
			current.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0) + new Vector3(offset.x, offset.y, 0);
		}
	}

	bool IsMouseOverUI(RectTransform rectTransform)
	{
		Vector2 mousePosition = Input.mousePosition;
		Vector3[] worldCorners = new Vector3[4];
		rectTransform.GetWorldCorners(worldCorners);

		if(mousePosition.x >= worldCorners[0].x && mousePosition.x < worldCorners[2].x 
			&& mousePosition.y >= worldCorners[0].y && mousePosition.y < worldCorners[2].y)
		{
			return true;
		}

		return false;
	}
}

Принцип работы, очень прост. На старте, создается массив объектов, у которых есть компонент MoveUIComponent. Затем, когда нажимаем ПКМ, происходит проверка в функции IsMouseOverUI, если курсор на нужном объекте, передаем ему координаты мышки. Просто и удобно.

Скачать и потестить:

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