UNITY 5 2019.3.1f1 - это версия, которую я использую.
Два сценария, один для слота, один для предмета.
Выпуск
Один раз масштаб предмета превышает 4х4, обнаружение перекрытия сработает примерно на 16,5f. В идеале обнаружение должно быть правильным и точным, независимо от масштаба даже при 100х100. Я считаю, что основная проблема находится внутри Slot Script между строками (58-61).
SetUp
Панель
GridLayoutGroup применяются следующие настройки
- CellSize (X = 35, Y = 35)
- StartCorner (верхний левый)
- ChildAlignment (UpperLeft)
Image
Применить нижеприведенный сценарий слота и прикрепить его как дочерний элемент к панели
Кнопка
Прикрепление сценария элемента того же уровня на панели НЕ РЕБЕНОК ПАНЕЛИ
Моя шкала (X = 5, Y = 5) или больше
Цвета кнопок = Hex 1C1C1 C
Исходное изображение = UISprite
СКРИПТЫ
Slot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Slot : MonoBehaviour, IDragHandler, IDropHandler
{
//[HideInInspector]
public Rect itemRect;
[HideInInspector]
public Rect myRect;
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 RectTransform rectParent;
public Rect DisplayRect;
public Color D_Color;
public Color O_Color;
public Color T_Color;
public Item_CS CurrItem;
// Start is called before the first frame update
void Start()
{
rectTransform = this.GetComponent<RectTransform>();
if(GetComponentInParent<GridLayoutGroup>() != null)
{
rectParent = GetComponentInParent<GridLayoutGroup>().GetComponent<RectTransform>();
}
else
{
rectParent = null;
}
}
// Update is called once per frame
public void FixedUpdate()
{
if (Item_DragRect != null)
{
CurrItem = Item_DragRect.GetComponent<Item_CS>();
Vector3[] sCorners = new Vector3[4];
rectTransform.GetWorldCorners(sCorners);
Vector2 MyPos = ((Vector2)sCorners[0] * 1);
Vector3[] iCorners = new Vector3[4];
Item_DragRect.GetWorldCorners(iCorners);
Vector2 ItemPos = ((Vector2)iCorners[0]);
if(rectParent != null)
{
Vector3[] pCorners = new Vector3[4];
rectParent.GetWorldCorners(pCorners);
Vector2 ParentPos = ((Vector2)pCorners[0]);
}
myRect = new Rect(MyPos.x, MyPos.y, rectTransform.rect.width, rectTransform.rect.height);
itemRect = new Rect(ItemPos.x + (CurrItem.MyScale.x), ItemPos.y + (CurrItem.MyScale.y), Item_DragRect.rect.width, Item_DragRect.rect.height);
if (!myRect.Overlaps(itemRect))
{
GetComponent<Image>().color = D_Color;
}
else
{
GetComponent<Image>().color = O_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;
using System.Linq;
public class Item_CS : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public static GameObject Item_Dragged;
public GameObject CurrID;
public Vector2 MyScale;
private Vector3 ItemPos;
public Rect myRect;
public List<Slot> Slots;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
RectTransform rectTransform = this.GetComponent<RectTransform>();
myRect = new Rect(rectTransform.localPosition.x, rectTransform.localPosition.y, rectTransform.rect.width, rectTransform.rect.height);
rectTransform.sizeDelta = new Vector2(MyScale.x * 35f, MyScale.y * 35f);
DragFunction();
CurrID = Item_Dragged;
if(Slots.Count != MyScale.x * MyScale.y)
{
Slots = new Slot[Mathf.RoundToInt(MyScale.x * MyScale.y)].ToList();
}
}
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)
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
}
}
public void OnPointerExit(PointerEventData eventData)
{
//throw new System.NotImplementedException();
}
}