UnityにおけるlocalPositionとanchoredPositionの違いと使用方法
UnityのUIシステムを効果的に活用するためには、TransformとRectTransformの違いや、それぞれのプロパティであるlocalPositionとanchoredPositionの理解が不可欠です。本資料では、これらのコンポーネントおよびプロパティの違いと適切な使用方法について詳しく解説します。
目次
1. TransformとRectTransformの概要
Transformとは
- 定義: Unityのすべてのゲームオブジェクトに存在する基本的なコンポーネント。
 - 機能: オブジェクトの位置(Position)、回転(Rotation)、スケール(Scale)を管理。
 - 用途: 3Dおよび2Dゲームオブジェクトの位置や動きを制御する際に使用。
 
RectTransformとは
- 定義: 
Transformのサブクラスで、主にUI要素に特化したコンポーネント。 - 機能: UIのレイアウト管理、アンカー(Anchor)、ピボット(Pivot)の設定、サイズ調整などを提供。
 - 用途: Canvasの子オブジェクトとして使用されるUI要素(ボタン、テキスト、画像など)の位置やサイズを制御する際に使用。
 
注記:
RectTransformはTransformを継承しているため、Transformのすべてのプロパティとメソッドを持ちながら、UI特有の機能を追加で提供します。
2. localPositionとanchoredPositionの違い
localPositionとは
- 定義: 親オブジェクトのローカル空間におけるオブジェクトの位置。
 - 座標系: 親の
Transformを基準としたローカル座標系。 - 使用場面: 一般的なゲームオブジェクトの位置調整に使用。UI要素でも使用可能だが、アンカーやピボットの影響を受けないため、レイアウトの柔軟性が低下する可能性がある。
 
anchoredPositionとは
- 定義: 
RectTransformのアンカーに基づいたローカル空間での位置。 - 座標系: アンカーの位置を基準としたアンカー付きローカル座標系。
 - 使用場面: UI要素のレイアウトやアンカーに基づいた位置調整に特化。画面サイズや解像度の変更に対して柔軟に対応可能。
 
比較まとめ
| 特性 | localPosition | anchoredPosition | 
|---|---|---|
| 基準 | 親のTransform | RectTransformのアンカー位置 | 
| 座標系 | ローカル座標系 | アンカー付きローカル座標系 | 
| 主な用途 | 一般的なオブジェクトの位置調整 | 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. ベストプラクティス
TransformとRectTransformの選択
- 非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. 参考資料
- Unity公式ドキュメント – Transform
 - Unity公式ドキュメント – RectTransform
 - Unity公式マニュアル – UIベストプラクティス
 - Unity公式マニュアル – UI Layout Overview
 
訪問数 619 回, 今日の訪問数 2回





ディスカッション
コメント一覧
まだ、コメントがありません