UnityにおけるlocalPositionとanchoredPositionの違いと使用方法

UnityのUIシステムを効果的に活用するためには、TransformRectTransformの違いや、それぞれのプロパティであるlocalPositionanchoredPositionの理解が不可欠です。本資料では、これらのコンポーネントおよびプロパティの違いと適切な使用方法について詳しく解説します。

1. TransformRectTransformの概要

Transformとは

  • 定義: Unityのすべてのゲームオブジェクトに存在する基本的なコンポーネント。
  • 機能: オブジェクトの位置(Position)、回転(Rotation)、スケール(Scale)を管理。
  • 用途: 3Dおよび2Dゲームオブジェクトの位置や動きを制御する際に使用。

RectTransformとは

  • 定義: Transformのサブクラスで、主にUI要素に特化したコンポーネント。
  • 機能: UIのレイアウト管理、アンカー(Anchor)、ピボット(Pivot)の設定、サイズ調整などを提供。
  • 用途: Canvasの子オブジェクトとして使用されるUI要素(ボタン、テキスト、画像など)の位置やサイズを制御する際に使用。

注記: RectTransformTransformを継承しているため、Transformのすべてのプロパティとメソッドを持ちながら、UI特有の機能を追加で提供します。

2. localPositionanchoredPositionの違い

localPositionとは

  • 定義: 親オブジェクトのローカル空間におけるオブジェクトの位置。
  • 座標系: 親のTransformを基準としたローカル座標系
  • 使用場面: 一般的なゲームオブジェクトの位置調整に使用。UI要素でも使用可能だが、アンカーやピボットの影響を受けないため、レイアウトの柔軟性が低下する可能性がある。

anchoredPositionとは

  • 定義: RectTransformのアンカーに基づいたローカル空間での位置。
  • 座標系: アンカーの位置を基準としたアンカー付きローカル座標系
  • 使用場面: UI要素のレイアウトやアンカーに基づいた位置調整に特化。画面サイズや解像度の変更に対して柔軟に対応可能。

比較まとめ

特性localPositionanchoredPosition
基準親のTransformRectTransformのアンカー位置
座標系ローカル座標系アンカー付きローカル座標系
主な用途一般的なオブジェクトの位置調整UI要素のレイアウトと位置調整
レイアウトの柔軟性低い(アンカーの影響を受けない)高い(アンカーに基づいて自動調整される)
使用の推奨非UIオブジェクトUI要素

3. 使用例

localPositionを使用する場合

using UnityEngine;

public class LifeGauge : MonoBehaviour
{
    [SerializeField]
    RectTransform parentRectTransform;

    [SerializeField]
    Transform playerTransform;

    void Update()
    {
        Vector3 screenPoint = Camera.main.WorldToScreenPoint(playerTransform.position);
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, screenPoint, null, out Vector2 localPoint);

        Debug.Log("screenPoint: " + screenPoint);
        Debug.Log("localPoint: " + localPoint);

        // localPositionを使用してUI要素の位置を設定
        transform.localPosition = localPoint + new Vector2(0, 50);
    }
}
  • 効果: 親オブジェクトの原点からlocalPointにオフセット(0, 50)を追加した位置にUI要素を配置。
  • 注意点: アンカーの設定に関わらず、絶対的な位置を指定するため、画面サイズや解像度の変更に対して柔軟性が低い。

anchoredPositionを使用する場合

using UnityEngine;

public class LifeGauge : MonoBehaviour
{
    [SerializeField]
    RectTransform parentRectTransform;

    [SerializeField]
    Transform playerTransform;

    // RectTransformをキャッシュ
    private RectTransform rectTransform;

    void Awake()
    {
        rectTransform = GetComponent<RectTransform>();
    }

    void Update()
    {
        Vector3 screenPoint = Camera.main.WorldToScreenPoint(playerTransform.position);
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, screenPoint, null, out Vector2 localPoint);

        Debug.Log("screenPoint: " + screenPoint);
        Debug.Log("localPoint: " + localPoint);

        // anchoredPositionを使用してUI要素の位置を設定
        rectTransform.anchoredPosition = localPoint + new Vector2(0, 50);
    }
}
  • 効果: アンカー位置を基準にlocalPointにオフセット(0, 50)を追加した位置にUI要素を配置。
  • 利点:
  • レスポンシブ: アンカーが設定されているため、画面サイズや解像度の変更に対して自動的に調整。
  • 柔軟性: UIレイアウトの一部として、他のUI要素との相対位置を維持しやすい。

4. ベストプラクティス

TransformRectTransformの選択

  • 非UIオブジェクト: Transformを使用し、localPositionで位置を調整。
  • UI要素: RectTransformを使用し、anchoredPositionで位置を調整。

anchoredPositionの活用

UI要素の配置には、anchoredPositionを優先的に使用することで、以下の利点が得られます。

  • 画面サイズの変更への対応: アンカーを基準とした位置調整により、異なる解像度や画面サイズでも適切に表示。
  • レイアウトの一貫性: 複数のUI要素間での相対位置を容易に維持可能。

コードの可読性とメンテナンス性の向上

RectTransformを明示的にキャッシュし、使用するプロパティを明確にすることで、コードの可読性とメンテナンス性を向上させることができます。

private RectTransform rectTransform;

void Awake()
{
    rectTransform = GetComponent<RectTransform>();
}

アンカーとピボットの設定

anchoredPositionを効果的に使用するためには、RectTransformのアンカー(Anchor)とピボット(Pivot)を適切に設定することが重要です。

  • アンカー(Anchor): UI要素が親のRectTransform内でどの位置に固定されるかを決定。四隅、中央、ストレッチなど多様な設定が可能。
  • ピボット(Pivot): UI要素自身の基準点を決定。例えば、左上、中央、右下などに設定可能。

これらを適切に設定することで、anchoredPositionの効果を最大限に活用できます。

5. まとめ

  • localPosition:
    • 親のTransformを基準とした絶対的な位置設定。
    • 主に非UIオブジェクトでの使用に適する。
    • UI要素でも使用可能だが、アンカーの影響を受けないためレイアウトの柔軟性が低下。
  • anchoredPosition:
    • アンカーを基準とした相対的な位置設定。
    • UI要素のレイアウトに最適で、画面サイズや解像度の変更に対して柔軟に対応可能。
    • UIレイアウトの一貫性と柔軟性を維持するために推奨。

推奨事項

  • UI要素の位置調整にはanchoredPositionを使用する:
    • レスポンシブなUIデザインを実現するため。
    • アンカー設定に基づいた柔軟なレイアウト管理のため。
  • コードの可読性向上のためにRectTransformを明示的に使用する:
    • 他の開発者や将来の自分自身がコードを理解しやすくするため。

6. 参考資料


UI,Unity

Posted by hidepon