Обнаружение перекрытия смещено примерно на 16,5f и увеличивается в зависимости от масштаба - PullRequest
0 голосов
/ 07 марта 2020

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

Применить нижеприведенный сценарий слота и прикрепить его как дочерний элемент к панели

  • D_Color = Hex B0B0B0

  • O_Color = Hex 2ACACF

  • Изображение источника изображения = UISprite

Кнопка

Прикрепление сценария элемента того же уровня на панели НЕ РЕБЕНОК ПАНЕЛИ

  • Моя шкала (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();
    }
}
...