簡體   English   中英

Unity 檢查 rect 的重疊工作,除非在 gridlayoutgroup 中

[英]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 所以它不會以任何方式計算Example1 localPosition on Awake

另一方面,錨定位置完全按預期工作: Example2 喚醒時的錨定位置

原來這是因為父對象通過將其添加到當前位置取消了它的變換,所以添加了一個簡單的檢查,看看插槽父對象是否有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM