2016-08-01 5 views
0

次の問題があります。画面の周りを移動する矢印の後にワールドスペースのキャンバスがあります。キャンバス自体は矢の子です。問題は、矢印が画面の端の何かを指しているときにキャンバスの部分が画面から外れることがあることです。私はいつでもビューポートの中にキャンバス全体を保持するコードを書く必要があります。私は解決策をオンラインで見つけましたが、これはオブジェクト全体のものではなく、カメラ境界内のオブジェクトのピボットポイントを保持します。カメラの境界線内にオブジェクト全体を保持する方法を理解できません。ここで私が持っているコードは次のとおりです。オブジェクト(ワールドスペースキャンバス)を常にカメラのビューポートに保持する

void LateUpdate() 
{ 
    transform.rotation = rotation;// This simply keeps the objects original rotation independant from the parent 
    Vector3 pos = Camera.main.WorldToViewportPoint(transform.position); 
    pos.x = Mathf.Clamp01(pos.x); 
    pos.y = Mathf.Clamp01(pos.y); 
    transform.position = Camera.main.ViewportToWorldPoint(pos); 
} 

答えて

0

あなたのGameObject周りの境界ボックスのいくつかの並べ替えを定義し、すべてのコーナーポイントは、ビューポート内にある(そうでない場合は、オブジェクトを移動する)かどうかを確認でき

定義します境界矩形の場合は、BoxColliderをトリガーに設定して(周囲との衝突を防ぐために)使用できます。 Colliders CenterSizeを使用すると、すべてのコーナーポイントを特定し、境界チェックに使用することができます。

コリダーを使用したくない場合は、想像上の境界ボックスの中心と範囲を定義できる単純なクラス/構造体を書くことができます(Gizmosを使用して、大規模であり、どのように配置されているか)。

これが役に立ちます。あなたは、3Dコーナーポイントを取得するためにGetWorldCornersを使用することができます述べたように

編集
オーケー、。これらがビューポートにあるかどうかを確認するには、Camera.main.WorldToViewportPointを使用して変換し、そのxとy成分が[0、1]であるかどうかを確認するだけです。たとえば、キャンバスが画面の右側に出て行く場合、2つの右隅の点はx成分の値が1より大きい値になります。 1.5、つまり移動する必要があることを意味します。(-0.5, 0)(ビューポート座標)。ビューポート座標のキャンバスの中心を(-0.5, 0)でシフトし、結果のポイントをワールド空間に投影することができます。この投影されたポイントは、キャンバスの中心があるべきポイントになります。あなたがより正確になりたいとも3Dキャンバスを回転させたい場合は

、あなたはそれに応じ

+0

だけでなく、それはRectTransformがあるので、キャンバスを回転/シフトし、すべての4つの隅の点を変換して動くことができることは、ビルドことですGetWorldCornersメソッドを使用してrect変換の4つのコーナーを取得します。私が把握できないのは、ビューポート内にあるかどうかを確認する方法と、その後にオブジェクトを移動する方法です。 –

+0

@UriPopov私は自分の答えを編集しました – TheDjentleman

関連する問題