2017-02-04 10 views
1

Unity Canvasの2つのUIパネルが互いに重なり合っているかどうかを確認する方法を知りたいと思います。UI要素/ RectTransformがオーバーラップしているかどうかをチェック

は現在、私はcanvas要素を比較することによって、これをやっていることはRects

キャンバス設定

  • レンダリングモード:画面のスペース - カメラ
  • ピクセルパーフェクト:[はい]
  • レンダリングカメラを:メインカメラ
  • 飛行機の距離:100
  • ソートレイヤー:レイヤーのデフォルト
  • 受注:0

キャンバススケーラー設定

  • UIスケールモード:一定のピクセルサイズ
  • スケールファクタ:1
  • リファレンスピクセルパー単位:100

コードは、私が

'オーバーラップ' をたまたまBOOLが瞬時にtrueに変更

[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); 
} 

かどうか確認するために使用しています。

(例えば)などのRectつ戻り

X -7.5、Y 2.5 98.5 W、H 164.1667

答えて

2

は、それが重なるかどうかを確認し、その後RectRectTransformを変換。 、

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); 
    } 
} 

今:

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 RectTransform uiRect1; 
public RectTransform uiRect2; 

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

    } 

    //OR 

    if (uiRect2.rectOverlaps(uiRect1)) 
    { 

    } 
} 
+1

ありがとう、これは本当に便利でした。特に拡張メソッドのヒント – Jim

関連する問題