Unity Check перекрывает прямоугольные работы, кроме случаев, когда в gridlayoutgroup - PullRequest
0 голосов
/ 28 февраля 2020

Так что для моей сцены у меня есть сценарий 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Оказывается, это потому, что родительский объект отменил свое преобразование до позиции, добавив его к текущему, поэтому добавил простую проверку, если родительский слот имеет 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)
    {

    }
}
0 голосов
/ 28 февраля 2020

RectTransform довольно сложно. Ваша локальная позиция будет меняться в зависимости от установленных якорей. Вы должны отладить и проверить, возвращает ли localPosition желаемые значения, также localPosition никогда не работал для меня при использовании RectTransform, я не думаю, что вы должны использовать его с RectTransform, я предполагаю, что это свойство унаследовано от Transform, и вам, вероятно, следует использовать anchoredPosition и pivot для вычисления Ваша прямая позиция.

Проверьте изображение. Я просто регистрирую localPosition этого rectTransform, и это полная чушь, я понятия не имею, как 146, -300 стал -574, 1180, масштаб моего CanvasScaller равен 4,95, поэтому он никак не рассчитывается Example1 localPosition on Awake

С другой стороны, якорная позиция работает точно так, как ожидалось: Example2 anchoredPosition on Awake

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...