Unity EventSystem

161
28 января 2020, 15:20

Я использую один код для карточек, что снизу -

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class ChooseCard : MonoBehaviour, IPointerDownHandler, 
IPointerUpHandler
{
GameObject moveCard;
Slot slot;
GameObject book;
int id;
void Start()
{
    moveCard = GameObject.Find("SlotMouseCard");
    moveCard.transform.position = Vector2.zero;
    slot = GetComponent<Slot>();
    book = GameObject.Find("Book");
}
public void OnPointerDown (PointerEventData eventData) 
{
    if(slot.card != null)
    {
        moveCard.GetComponent<Slot>().card = slot.card;
        id = slot.card.id;
        slot.card = null;
        moveCard.gameObject.SetActive(true);
    }
}
public void OnPointerUp (PointerEventData eventData) 
{
    moveCard.transform.position = Vector2.zero;
    if(slot.card == null)
    {
        slot.card = moveCard.GetComponent<Slot>().card;
        moveCard.GetComponent<Slot>().card = null;
    }
    else if(slot.card != null)
    {
        book.GetComponent<Book>().collection[id] = null;
    }
    id = -1;
    moveCard.gameObject.SetActive(false);
}
}

И другой код для карточек сверху -

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
public class CardOfCollaction : MonoBehaviour, IPointerEnterHandler
{
GameObject moveCard;
Slot slot;
void Start()
{
    moveCard = GameObject.Find("SlotMouseCard");
    slot = GetComponent<Slot>();
}
public void OnPointerEnter (PointerEventData eventData) 
{
    if(moveCard.GetComponent<Slot>().card != null)
    {
        slot.card = moveCard.GetComponent<Slot>().card;
        moveCard.GetComponent<Slot>().card = null;
    }
}
}

И вот что выходит - Как мне пeредать значение верхним картам?

Answer 1

EventSystem работает по принципу первого столкновения луча. Т.е. из камеры бросается луч, который сталкивается с объектом, после чего у этого объекта ищутся интерфейсы системы.

У вас на сцене есть объект EventSystem, если вы его выберете и раскроете окно внизу инспектора, то увидите все текущие значения из него - на что наведён ваш курсор, на что произошёл последний клик и т.д.

Могу предположить, что если вы это сделаете, то увидите, что всё время перетаскивания ваш курсор наведён на перетаскиваемую карту. Другими словами - карта вверху не узнает, что курсор в неё вошёл, потому что курсор в неё не входит - он всё время находится внутри перетягиваемой карты, т.к. луч системы всегда упирается в неё.

Судя по всему, карты сделаны через элемент UI - Image. У этого компонента есть буловая переменная - RaycastTarget. Она отвечает за то, может ли луч столкнуться с этим объектом. Отключите её у объекта - перетаскиваемой карты. Скорее всего это решит проблему.

Так же, в качестве совета. Для перетаскивания существуют интерфейсы: IBeginDragHandler, IDragHandler, IEndDragHandler - для объекта, который перетаскиваете. Для работы необходимо обязательно реализовывать IDragHandler
IDropHandler - для объекта, на который вы бросаете перетаскиваемый.
А из аргумента методов PointerEventData eventData можно получить текущий перетаскиваемый объект, который хранится в eventData.pointerDrag. На момент срабатывания метода IDropHandler объект всё ещё будет там.

READ ALSO
Тачи(touch) в юнити

Тачи(touch) в юнити

При таче персонаж двигается , но только один разПосле даже при повторном нажатии ничего не происходит

147
Получения интервала времени из словаря C#

Получения интервала времени из словаря C#

Совсем недавно начал программировать, столкнулся с трудностьюУ меня есть заполненный данными словарь, внутри которого ключи - названия нужных...

170
Как получить значение по ID, использую C#?

Как получить значение по ID, использую C#?

Как получить значение по ID, использую C#? может что-то в конце кода нужно добавить? по факту нужно чтобы в переменной result оказалось значение...

235