Unity UI – Drag and Drop

Witam w kolejnym wpisie poświęconym IL.

W końcu mój roboczy inwentarz doczekał się własnego rozwiązania Drag and Drop, można je na starcie włączyć/wyłączyć w skrypcie Inventory.

Poza tym musiałem rozszerzyć klasę ItemData o parę interfejsów, oraz stworzyć zupełnie nową klasę Slot, którą posiada każdy SlotPrefab.

Slot.cs


public class Slot : MonoBehaviour,IDropHandler
{
 public int ID;
 private Inventory inv;

 void Start()
 {
 inv = transform.parent.parent.GetComponent<Inventory>();
 ID = transform.GetSiblingIndex();
 }
 public void OnDrop(PointerEventData eventData)
 {
 ItemData droppedItemData = eventData.pointerDrag.GetComponent<ItemData>();
 if (inv.SlotList[ID].childCount == 0)
 { droppedItemData.transform.SetParent(transform);
 droppedItemData.GetComponent<RectTransform>().anchoredPosition3D =
droppedItemData.startPosition;
 droppedItemData.startParent = transform;
 }
 }
}

Według hierarchii ustalonej przeze mnie, każdy slot jest dzieckiem slotPanelu, a
slotPanel musi być dzieckiem GameObjectu ze skryptem Inventory.

Co do kodu klasy slot to jedyną ważną rzeczą jest tu tajemnicza funkcja OnDrop która jest wynikiem
implementacji interfejsu IDropHandler. Aktywuje się ona wtedy i tylko wtedy gdy zakończę przeciąganie obiektu myszką.

Zmianom uległa klasa ItemData, od teraz implementuje ona również interfejsy IBeginDragHandler oraz IDragHandler.
Pierwszy wykonuje się raz, przy przeciąganiu, a drugi co chwile (trochę jak znana wszystkim metoda Update).

ItemData.cs

public class ItemData : MonoBehaviour, IBeginDragHandler,IDragHandler,IEndDragHandler
{
public Item HoldedItem;
public int Amount;
public int Slot;

public List<ItemProperty> Properties;
private Inventory inv;

[HideInInspector]
public Vector3 startPosition;

[HideInInspector] public Transform startParent;

void Start()
{
inv = transform.parent.parent.parent.GetComponent<Inventory>();

Properties = new List<ItemProperty>();
foreach (ItemProperty property in HoldedItem.ItemProperties)
{
Properties.Add(new ItemProperty(property.PropertyName, property.PropertyValue));
}
}
public void OnBeginDrag(PointerEventData eventData)
{
if (HoldedItem != null)
{
startPosition = transform.GetComponen<RectTransform>().anchoredPosition3D;
startParent = transform.parent;
this.transform.SetParent(transform.parent.parent);
this.transform.position = eventData.position;

GetComponent<CanvasGroup>().blocksRaycasts = false;
}
}
public void OnDrag(PointerEventData eventData)
{
if (HoldedItem != null)
{
this.transform.position = eventData.position;
}
}
public void OnEndDrag(PointerEventData eventData)
{
GetComponent<CanvasGroup>().blocksRaycasts = true;
transform.GetComponent<RectTransform>().anchoredPosition3D = startPosition;

bool FoundParent = false;
for (int i = 0; i &lt; inv.SlotList.Count; i++)
{
if (transform.parent == inv.SlotList[i])
{
FoundParent = true;
}
}
if (FoundParent == false)
{
transform.SetParent(startParent);
transform.GetComponent<RectTransform>().anchoredPosition3D = startPosition;
}
}
}

Każdy Slot ma swoje unikalne ID równe jegp „Indeksowi rodzeństwa” (Sibling Index).
W ten sposób mogę łatwiej sprawdzać już w tym etapie czy Item może powędrować do tego slota.

To by było na tyle z kolejnych zmian. W tym tygodniu postaram się dodać Tooltipy, czyli
bardzo popularne przypisy wyświetlane po najechaniu na Item w ekwipunku.
Tooltipy te będą w pełni rozszerzalne z poziomu edytora, bez zbędnych linijek kodu. Jedyne ograniczenia jakie chce początkowo
wprowadzić to narzucenie wyświetlania opisu i tytułu Itemu w sposób dowolny, ale obowiązkowy. Jest to zrozumiałe ponieważ do tego właśnie powinny służyć.
Wykryłem również parę istotnych błędów w Bazie Danych, które nie mogą zwlekać więc zabiorę się za to jak najszybciej.
Pozdrawiam i zapraszam do oczekiwania na kolejny wpis.

 

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s