Так что для моей сцены у меня есть сценарий Item
и Slot
. Если сценарий Slot
применяется к пользовательскому интерфейсу в GridLayoutGroup
, он не читает, даже если он завис или нет. Однако, если объект Slot UI находится не внутри GridLayoutGroup
, он отлично читается.
Ниже приведены сценарии. Сейчас я использую масштаб на 35 пикселей для тестирования.
Slot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Slot : MonoBehaviour, IDragHandler, IDropHandler
{
public RectTransform Item_DragRect
{
get
{
if(Item_CS.Item_Dragged != null)
{
return Item_CS.Item_Dragged.GetComponent<RectTransform>();
}
else
{
return null;
}
}
}
public RectTransform rectTransform;
public Rect DisplayRect;
public Color D_Color;
public Color O_Color;
public Color T_Color;
public GameObject CurrItem;
// Start is called before the first frame update
void Start()
{
rectTransform = this.GetComponent<RectTransform>();
}
// Update is called once per frame
public void FixedUpdate()
{
DisplayRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
if (Item_DragRect != null)
{
CurrItem = Item_DragRect.gameObject;
Rect myRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
Rect ItemRect = new Rect(Item_DragRect.localPosition.x, Item_DragRect.localPosition.y, Item_DragRect.rect.width, Item_DragRect.rect.height);
if (ItemRect.Overlaps(myRect))
{
GetComponent<Image>().color = O_Color;
}
else
{
GetComponent<Image>().color = D_Color;
}
}
else
{
CurrItem = null;
GetComponent<Image>().color = D_Color;
}
}
public void OnDrag(PointerEventData eventData)
{
}
public void OnDrop(PointerEventData eventData)
{
}
}
Item_CS.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Item_CS : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public static GameObject Item_Dragged;
public GameObject CurrID;
public Vector2 MyScale;
private Vector3 ItemPos;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
RectTransform rectTransform = this.GetComponent<RectTransform>();
rectTransform.sizeDelta = new Vector2(MyScale.x * 35, MyScale.y * 35);
DragFunction();
CurrID = Item_Dragged;
}
public void DragFunction()
{
if(Item_Dragged != null)
{
Item_Dragged.transform.SetAsLastSibling();
}
}
public void OnBeginDrag(PointerEventData eventData)
{
if(Item_Dragged == null)
{
Item_Dragged = gameObject;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
else
{
Item_Dragged = gameObject;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
}
public void OnDrag(PointerEventData eventData)
{
this.transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
Item_Dragged = null;
GetComponent<CanvasGroup>().blocksRaycasts = true;
}
public void OnPointerEnter(PointerEventData eventData)
{
//throw new System.NotImplementedException();
}
public void OnPointerExit(PointerEventData eventData)
{
//throw new System.NotImplementedException();
}
}