web-dev-qa-db-ja.com

コードを介してRectTransformの左、右、上、下の位置にアクセスする方法は?

レンダリングモードのワールド空間が設定されたUIキャンバスがあります。このキャンバスに属するすべてのUI要素について、エディターのRectTransformコンポーネントに「left」、「right」、「top」、および「bottom」変数が表示されています。コードを介してこれらの変数にアクセスする方法はありますか?

18

それらは

RectTransform rectTransform;

/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
34
maksymiuk
RectTransform rt = GetComponent<RectTransform>();
float left   =  rt.offsetMin.x;
float right  = -rt.offsetMax.x;
float top    = -rt.offsetMax.y;
float bottom =  rt.offsetMin.y;

TL; DR

インスペクターに表示される値から、私の分析は、対応する境界が長方形の形状にある場合、LeftRightTop、およびBottomが正であるということです。 RectTransformのアンカーによって。

offsetMin.x as LeftおよびoffsetMin.y as Bottom as常にこの評価を満たすoffsetMax.x as RightおよびoffsetMax.y as Topはそうではありません。

offsetMaxの反対の値を使用して、準拠させました(基本的なスペース変更)。

3
Numid

上記の2つの答えは正しい軌道に乗っています。私はこれが原因でプロジェクトを先延ばしにしてきましたが、ベッドでのプログラミング中に発見されました。 offsetMinとoffsetMaxは必要なものですが、すべてではないため、rect変換のアンカーを含める必要があります。

public RectTransform recTrans;

// Use this for initialization
void Start () {
    Vector2 min = recTrans.anchorMin;
    min.x *= Screen.width;
    min.y *= Screen.height;

    min += recTrans.offsetMin;

    Vector2 max = recTrans.anchorMax;
    max.x *= Screen.width;
    max.y *= Screen.height;

    max += recTrans.offsetMax;

    Debug.Log(min + " " + max);
}

これをダミークラスにプラグインすると、使用しているアンカーに関係なく、正しい読み取り値が得られます。

動作方法は明白なはずですが、簡単な説明で問題はありません。

オフセットは、最小値と最大値が矩形変換の中心点からの位置の違いを参照しており、アンカー境界に追加すると、正しい矩形変換の最小値と最大値が得られます。ただし、アンカーの最小値と最大値は正規化されているため、画面サイズを掛けて縮小する必要があります。

2
dkoitka

また、2行ですべての値を簡単に設定できます。 Vector2であるoffsetMinを取得し、2つのパラメーターを設定します(最初はLeft、2番目はbottom)。次に、offsetMaxで同じことを行います(1つ目は右、2つ目は上)。 offsetMaxは逆になるため、Right = 20に設定する場合は、スクリプトで値-20を設定する必要があります。

以下のコードは値を設定します。

左= 10

下= 20

右= 30

トップ= 40

GameObject.GetComponent<RectTransform> ().offsetMin = new Vector2 (10,20);
GameObject.GetComponent<RectTransform> ().offsetMax = new Vector2 (-30,-40);

私はそれが他の誰かを助けることを願っています;)

0
Skylin R