2017-02-04 16 views
1

Я хотел бы узнать, как я проверяю, перекрываются ли две панели пользовательского интерфейса на моем холсте Единства.Проверьте, перекрываются ли элементы пользовательского интерфейса/RectTransform

В настоящее время я делаю это путем сравнения элементов холст прямоугольникам

Холст Настройки

  • Рендер Mode: Screen Space - камера
  • Pixel Совершенная: [Да]
  • Рендер камеры : Основная камера
  • Дальность полета: 100
  • Сортировка Уровень: По умолчанию
  • Order В Layer: 0 Настройки

Холст Scaler

  • режим пользовательского интерфейса Масштаб: Constant Размер пикселя
  • Scale Factor: 1
  • Ссылка Pixels Per Единица измерения: 100

код, я использую для проверки

[Header("Check For Overlap")] 
public RectTransform PlayerBar; 
public RectTransform LeftBar; 
public Rect RectOne; 
public Rect RectTwo; 
public bool overlapping; 

//Check if the two canvas element Rects overlap each other 

public void CheckForOverlap() 
{ 
    overlapping = false; 
    // Convert Canvas RectTransforms to World Rects 
    RectOne = GetWorldRect(LeftBar); 
    RectTwo = GetWorldRect(PlayerBar); 

    if (RectOne.Overlaps(RectTwo)) 
    { 
     overlapping = true; 
    } 
} 


public Rect GetWorldRect(RectTransform rt) 
{ 
    // Get World corners, take top left 
    Vector3[] corners = new Vector3[4]; 
    rt.GetWorldCorners(corners); 
    Vector3 topLeft = corners[0]; 

    // Rect Size ... I'm not sure if this is working correctly? 
    Vector2 size = new Vector2(rt.rect.size.x, rt.rect.size.y); 
    return new Rect(topLeft, size); 
} 

Что происходит

'Перекрытия' BOOL мгновенно меняет к истине.

Прямоугольник Один возвращается как (например)

Х -7,5, Y 2,5 Вт 98,5, Н 164,1667

ответ

2

Преобразовать RectTransform, чтобы Rect затем проверить, перекрывает ли он.

Вот простая функция, которая может сделать это:

bool rectOverlaps(RectTransform rectTrans1, RectTransform rectTrans2) 
{ 
    Rect rect1 = new Rect(rectTrans1.localPosition.x, rectTrans1.localPosition.y, rectTrans1.rect.width, rectTrans1.rect.height); 
    Rect rect2 = new Rect(rectTrans2.localPosition.x, rectTrans2.localPosition.y, rectTrans2.rect.width, rectTrans2.rect.height); 

    return rect1.Overlaps(rect2); 
} 

Использование:

public RectTransform uiRect1; 
public RectTransform uiRect2; 

void Update() 
{ 
    if (rectOverlaps(uiRect1, uiRect2)) 
    { 
     Debug.Log("Overlaps"); 
    }else 
    { 
     Debug.Log("Does not Overlap"); 
    } 
} 

Еще лучше, сделать его метод расширения:

public static class ExtensionMethod 
{ 
    public static bool rectOverlaps(this RectTransform rectTrans1, RectTransform rectTrans2) 
    { 
     Rect rect1 = new Rect(rectTrans1.localPosition.x, rectTrans1.localPosition.y, rectTrans1.rect.width, rectTrans1.rect.height); 
     Rect rect2 = new Rect(rectTrans2.localPosition.x, rectTrans2.localPosition.y, rectTrans2.rect.width, rectTrans2.rect.height); 

     return rect1.Overlaps(rect2); 
    } 
} 

Теперь, вы можете сделать

public RectTransform uiRect1; 
public RectTransform uiRect2; 

void Update() 
{ 
    if (uiRect1.rectOverlaps(uiRect2)) 
    { 

    } 

    //OR 

    if (uiRect2.rectOverlaps(uiRect1)) 
    { 

    } 
} 
+1

Большое спасибо, это было действительно полезно. Особенно добавленный совет для метода расширения – Jim