読者です 読者をやめる 読者になる 読者になる

コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【Unity】【NGUI】UIWidgetやUISpriteの上下左右の端の位置を返す拡張メソッド

using System.Linq;
using UnityEngine;

/// <summary>
/// UIWidget 型の拡張メソッドを管理するクラス
/// </summary>
public static class UIWidgetExtensions
{
    /// <summary>
    /// ローカル座標系における左端の位置を返します
    /// </summary>
    public static float GetLocalLeft(this UIWidget self)
    {
        switch (self.pivot)
        {
            case UIWidget.Pivot.BottomLeft:
            case UIWidget.Pivot.Left:
            case UIWidget.Pivot.TopLeft:
                return self.transform.localPosition.x;
            
            case UIWidget.Pivot.BottomRight:
            case UIWidget.Pivot.Right:
            case UIWidget.Pivot.TopRight:
                return self.transform.localPosition.x - self.width;

            default:
                return self.transform.localPosition.x - self.width * 0.5f;
        }
    }

    /// <summary>
    /// ローカル座標系における右端の位置を返します
    /// </summary>
    public static float GetLocalRight(this UIWidget self)
    {
        switch (self.pivot)
        {
            case UIWidget.Pivot.BottomLeft:
            case UIWidget.Pivot.Left:
            case UIWidget.Pivot.TopLeft:
                return self.transform.localPosition.x + self.width;
            
            case UIWidget.Pivot.BottomRight:
            case UIWidget.Pivot.Right:
            case UIWidget.Pivot.TopRight:
                return self.transform.localPosition.x;

            default:
                return self.transform.localPosition.x + self.width * 0.5f;
        }
    }

    /// <summary>
    /// ローカル座標系における下端の位置を返します
    /// </summary>
    public static float GetLocalBottom(this UIWidget self)
    {
        switch (self.pivot)
        {
            case UIWidget.Pivot.Bottom:
            case UIWidget.Pivot.BottomLeft:
            case UIWidget.Pivot.BottomRight:
                return self.transform.localPosition.y;
            
            case UIWidget.Pivot.Top:
            case UIWidget.Pivot.TopLeft:
            case UIWidget.Pivot.TopRight:
                return self.transform.localPosition.y - self.height;

            default:
                return self.transform.localPosition.y - self.height * 0.5f;
        }
    }

    /// <summary>
    /// ローカル座標系における上端の位置を返します
    /// </summary>
    public static float GetLocalTop(this UIWidget self)
    {
        switch (self.pivot)
        {
            case UIWidget.Pivot.Bottom:
            case UIWidget.Pivot.BottomLeft:
            case UIWidget.Pivot.BottomRight:
                return self.transform.localPosition.y + self.height;
            
            case UIWidget.Pivot.Top:
            case UIWidget.Pivot.TopLeft:
            case UIWidget.Pivot.TopRight:
                return self.transform.localPosition.y;

            default:
                return self.transform.localPosition.y + self.height * 0.5f;
        }
    }
}
// UIWidget でも
var uiWidget = GetComponent<UIWidget>();
Debug.Log( uiWidget.GetLocalLeft()   );
Debug.Log( uiWidget.GetLocalTop()    );
Debug.Log( uiWidget.GetLocalRight()  );
Debug.Log( uiWidget.GetLocalBottom() );

// UISprite でも
var uiSprite = GetComponent<UISprite>();
Debug.Log( uiSprite.GetLocalLeft()   );
Debug.Log( uiSprite.GetLocalTop()    );
Debug.Log( uiSprite.GetLocalRight()  );
Debug.Log( uiSprite.GetLocalBottom() );

// UITexture でも使えます
var uiTexture = GetComponent<UITexture>();
Debug.Log( uiTexture.GetLocalLeft()   );
Debug.Log( uiTexture.GetLocalTop()    );
Debug.Log( uiTexture.GetLocalRight()  );
Debug.Log( uiTexture.GetLocalBottom() );