Я использую один код для карточек, что снизу -
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редать значение верхним картам?
EventSystem работает по принципу первого столкновения луча. Т.е. из камеры бросается луч, который сталкивается с объектом, после чего у этого объекта ищутся интерфейсы системы.
У вас на сцене есть объект EventSystem, если вы его выберете и раскроете окно внизу инспектора, то увидите все текущие значения из него - на что наведён ваш курсор, на что произошёл последний клик и т.д.
Могу предположить, что если вы это сделаете, то увидите, что всё время перетаскивания ваш курсор наведён на перетаскиваемую карту. Другими словами - карта вверху не узнает, что курсор в неё вошёл, потому что курсор в неё не входит - он всё время находится внутри перетягиваемой карты, т.к. луч системы всегда упирается в неё.
Судя по всему, карты сделаны через элемент UI - Image. У этого компонента есть буловая переменная - RaycastTarget
. Она отвечает за то, может ли луч столкнуться с этим объектом. Отключите её у объекта - перетаскиваемой карты. Скорее всего это решит проблему.
Так же, в качестве совета. Для перетаскивания существуют интерфейсы:
IBeginDragHandler
, IDragHandler
, IEndDragHandler
- для объекта, который перетаскиваете. Для работы необходимо обязательно реализовывать IDragHandler
IDropHandler
- для объекта, на который вы бросаете перетаскиваемый.
А из аргумента методов PointerEventData eventData
можно получить текущий перетаскиваемый объект, который хранится в eventData.pointerDrag
. На момент срабатывания метода IDropHandler
объект всё ещё будет там.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При таче персонаж двигается , но только один разПосле даже при повторном нажатии ничего не происходит
Совсем недавно начал программировать, столкнулся с трудностьюУ меня есть заполненный данными словарь, внутри которого ключи - названия нужных...
Как получить значение по ID, использую C#? может что-то в конце кода нужно добавить? по факту нужно чтобы в переменной result оказалось значение...