Email: Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Сегодня я расскажу Вам как в 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 отсюда.

(2131)
(2)