как проверить прямоугольник пользовательского интерфейса внутри прямоугольника холста - PullRequest
3 голосов
/ 10 июля 2020

Как проверить прямоугольник пользовательского интерфейса внутри прямоугольника холста?

rect.contains (Vector2) is Vector2 ...

rect.overlaps (Rect) Не будет ложным, если он не находится полностью снаружи ...

void Update()
{
    Vector2 pos;
    var screenPos = Camera.main.WorldToScreenPoint(targetTransform.position + offset);
    RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRectTransform, screenPos, uiCamera, out pos);
    if (!CheckInsideRect(myRectTransform.rect,canvasRectTransform.rect))
    {
        myRectTransform.localPosition = pos;
    }
}

Результаты, которые я хотел бы получить

I want1 Я хочу2

1 Ответ

1 голос
/ 10 июля 2020

Вы можете сделать это «вручную», используя некоторые методы расширения, например

public static class RectTransformExtensions
{
    ///<summary>
    /// Returns a Rect in WorldSpace dimensions using <see cref="RectTransform.GetWorldCorners"/>
    ///</summary>
    public static Rect GetWorldRect(this RectTransform rectTransform)
    {
        // This returns the world space positions of the corners in the order
        // [0] bottom left,
        // [1] top left
        // [2] top right
        // [3] bottom right
        var corners = new Vector3[4];
        rectTransform.GetWorldCorners(corners);

        Vector2 min = corners[0];
        Vector2 max = corners[2];
        Vector2 size = max - min;
 
        return new Rect(min, size);
    }
 
    ///<summary>
    /// Checks if a <see cref="RectTransform"/> fully encloses another one
    ///</summary>
    public static bool FullyContains (this RectTransform rectTransform, RectTransform other)
    {       
        var rect = rectTransform.GetWorldRect();
        var otherRect = other.GetWorldRect();

        // Now that we have the world space rects simply check
        // if the other rect lies completely between min and max of this rect
        return rect.xMin <= otherRect.xMin 
            && rect.yMin <= otherRect.yMin 
            && rect.xMax >= otherRect.xMax 
            && rect.yMax >= otherRect.yMax;
    }
}

См. RectTransform.GetWorldCorners

Таким образом, вы можете использовать его как

if (!canvasRectTransform.FullyContains(myRectTransform))
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...