2016-11-12 2 views
0

Есть ли способ проверить, содержит ли Rect-преобразование точку? Заранее спасибо. Я попробовал Bounds.Contains() и RectTransformUtility.RectangleContainsScreenPoint(), но это не помогло мнеUnity Recttransform содержит точку

private bool AreCoordsWithinUiObject(Vector2 coords, GameObject gameObj) 
{ 
    Bounds bounds = gameObj.GetComponent<Renderer>().bounds; 
    return bounds.Contains(new Vector3(coords.x, coords.y, 0)); 
} 

Таким образом, у меня есть ошибка «Там нет визуализатора прилагается к объекту», но я был прикреплен CanvasRenderer к нему.

RectTransformUtility.RectangleContainsScreenPoint(gameObj.GetComponent<RectTransform>(), coords); 

Этот метод всегда возвращает ложные

if (AreCoordsWithinUiObject(point, lines[i])) 
{ 
    print("contains"); 
} 

линии список геймобжекты

enter image description here

+0

Просьба указать код, который вы пробовали. То, что у вас есть в вашем вопросе, - это просто функция. Поместите код, который не работает. И «Bounds.Contains», и «RectTransformUtility.RectangleContainsScreenPoint», и кто-то может определить вашу проблему. – Programmer

+0

Я обновил сообщение с кодом –

+0

Может быть, потому, что вы пытаетесь получить «Renderer», а не «CanvasRenderer»? –

ответ

2

CanvasRenders не имеют переменную с bounds члена. Однако ваша задача может быть выполнена только с помощью переменной-члена RectTransform.rect, так как мы можем получить как ширину, так и высоту прямоугольника таким образом. Мой сценарий ниже предполагает, что ваш элемент холста привязан к центру вашего холста. Он печатает «TRUE», когда ваша мышь находится внутри элемента, к которому прикреплен скрипт.

void Update() 
{ 
    Vector2 point = Input.mousePosition - new Vector3(Screen.width/2, Screen.height/2); // convert pixel coords to canvas coords 
    Debug.Log(IsPointInRT(point, this.GetComponent<RectTransform>())); 
} 

bool IsPointInRT(Vector2 point, RectTransform rt) 
{ 
    // Get the rectangular bounding box of your UI element 
    Rect rect = rt.rect; 

    // Get the left, right, top, and bottom boundaries of the rect 
    float leftSide = rt.anchoredPosition.x - rect.width/2; 
    float rightSide = rt.anchoredPosition.x + rect.width/2; 
    float topSide = rt.anchoredPosition.y + rect.height/2; 
    float bottomSide = rt.anchoredPosition.y - rect.height/2; 

    //Debug.Log(leftSide + ", " + rightSide + ", " + topSide + ", " + bottomSide); 

    // Check to see if the point is in the calculated bounds 
    if (point.x >= leftSide && 
     point.x <= rightSide && 
     point.y >= bottomSide && 
     point.y <= topSide) 
    { 
     return true; 
    } 
    return false; 
} 
+0

Спасибо, это мне помогло! –

Смежные вопросы