[英]Unity Check overlap of rect works except if in gridlayoutgroup
所以對於我的場景,我有一個Item
和一個Slot
腳本。 如果Slot
腳本應用於GridLayoutGroup
UI, GridLayoutGroup
它不會讀取,即使它是否懸停。 但是,如果 Slot UI 對象不在GridLayoutGroup
內, GridLayoutGroup
它讀取重疊很好。
下面是腳本。 我目前基於 35px 進行測試。
插槽.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)
{
}
}
項目_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();
}
}
RectTransform 非常棘手。 您的 localPosition 將根據您設置的錨點而有所不同。 您應該調試並檢查 localPosition 是否返回所需的值,在使用 RectTransform 時,localPosition 也從未對我有用,我認為您不應該將它與 RectTransform 一起使用,我想它是從 Transform 繼承的屬性,您可能應該使用 anchoredPosition 和 pivot 來計算你的正確位置。
查看圖像。 我只是記錄了那個 rectTransform 的 localPosition,這完全是胡說八道,我不知道 146,-300 是如何變成 -574, 1180,我的 CanvasScaller 的比例是 4.95 所以它不會以任何方式計算
原來這是因為父對象通過將其添加到當前位置取消了它的變換,所以添加了一個簡單的檢查,看看插槽父對象是否有 gridlayoutgrid 如果是這樣,以消除差異
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 RectTransform rectParent;
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>();
if(GetComponentInParent<GridLayoutGroup>() != null)
{
rectParent = GetComponentInParent<GridLayoutGroup>().GetComponent<RectTransform>();
}
else
{
rectParent = null;
}
}
// Update is called once per frame
public void FixedUpdate()
{
DisplayRect = new Rect(rectTransform.transform.position.x, rectTransform.transform.position.y, rectTransform.rect.width, rectTransform.rect.height);
if (Item_DragRect != null)
{
CurrItem = Item_DragRect.gameObject;
if(rectParent != null)
{
Rect myRect = new Rect(rectTransform.localPosition.x + rectParent.localPosition.x, rectTransform.localPosition.y + rectParent.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
{
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)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.