Показать содержимое по тегу: прыгающие значки
Unity3D - создание мест для перетаскивания объектов Drag&Drop и как сделать прыгающие значки
Сегодня я расскажу Вам как в Unity3D сделать перетаскивание объектов в предназначенные для них места с помощью Drag&Drop и как сделать анимацию прыгающих значков. Не претендую на истину в последней инстанции с точки зрения "как надо", пишу о том, как я сделал рабочее решение, работающее не только с мышкой, но и на мобильных устройствах с тачскринами. Для начала создаем под Main Camera - Canvas (область отображения интерфейса) Внутри него создаем 4 картинки (UI->image)
Две картинки переименовываем в place1 и place2 и задаем им цвета потемнее (это будут места, куда мы сможем перетащить объекты) Другие две переименовываем в item1 и item2 и задаем им цвета посветлее (это будут перетаскиваемые элементы, которые мы должны положить на соответствующие места)
Добавляем для наших item'ов компоненты: Phisics 2D->RigidBody 2D и Phisics 2D->Box Collider 2D
А на объекты place1 и place2 добавляем только коллайдеры Не забудьте откорректировать размер коллайдеров под размер объекта и поставить у них галку Is Trigger
Создаем C# скрипт DragHandler.
Добавляем:
using UnityEngine.EventSystems; using UnityEngine.UI;
видим класс:
public class DragHandler : MonoBehaviour {
добавляем интерфейсы:
public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
Добавляем переменные:
public static GameObject itemBeingDragged; Vector3 HomePosition; Rigidbody2D rb; GameObject ObjectUnder; string ObjectUnderName="";
Реализуем интерфейсы:
#region IBeginDragHandler implementation public void OnBeginDrag(PointerEventData eventData) { //Запоминаем перетаскиваемый объект и его начальную позицию itemBeingDragged = gameObject; ObjectUnderName = ""; } #endregion #region IDragHandler implementation public void OnDrag(PointerEventData eventData) { //используем RigidBody для отлова пересечений (collider) rb.MovePosition(eventData.position); } #endregion #region IEndDragHandler implementation public void OnEndDrag(PointerEventData eventData) { itemBeingDragged = null; //проверяем на место ли перетащили if (ObjectUnderName == "place1" && this.name == "item1") { transform.position = ObjectUnder.transform.position; //тут можем что то еще делать } else if (ObjectUnderName == "place2" && this.name == "item2") { transform.position = ObjectUnder.transform.position; //тут можем что то еще делать } else { //если нет пересечения возвращаем в исходное положение transform.position = HomePosition; } } #endregion
Добавляем обработку коллизий:
void OnTriggerEnter2D(Collider2D myCollision) { // определение столкновения с двумя разноименными объектами ObjectUnder = myCollision.gameObject; ObjectUnderName = ObjectUnder.name; } void OnTriggerExit2D(Collider2D myCollision) { // определение столкновения с двумя разноименными объектами ObjectUnder = myCollision.gameObject; ObjectUnderName = ""; }
Теперь добавляем наш скрипт к объектам item1 и item2
Проверяем, что все работает. Зеленый квадрат ложится только на зеленый, голубой на синий.
В принципе все, но добавим немного анимации для перетаскиваемых объектов (подпрыгивание)
Добавляем переменные:
//подпрыгивание объектов Vector3 placePosition; float DeltaPos; float MyVector;
В процедуру Start() добавляем сохранение начальных значений:
//подпрыгивание объектов placePosition = transform.position; MyVector = 0.2f;
И анимируем прыжки в процедуре Update void Update()
void Update() { //подпрыгивание объектов if (DeltaPos > 1) MyVector = -0.2f; if (DeltaPos < -1) MyVector = 0.2f; DeltaPos += MyVector; if (itemBeingDragged == null && ObjectUnderName == "") { transform.position = placePosition + new Vector3(0.0f, DeltaPos, 0.0f); ; } }
Вот теперь все. Если вдруг непонятно описал, то можете скачать рабочий проект для unity3D отсюда.