コガネブログ

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

【Unity】【NGUI】UIRoot の子オブジェクトのグローバル座標を設定する拡張メソッド

using UnityEngine;

/// <summary>
/// UIWidget 型の拡張メソッドを管理するクラス
/// </summary>
public static class UIWidgetExt
{
    /// <summary>
    /// UIRoot の子オブジェクトのグローバル座標を返します
    /// </summary>
    public static Vector3 GetGlobalPosition( this Component self )
    {
        if ( self == null ) return Vector3.zero;
        
        var transform = self.transform;
        var pos = Vector3.zero;

        while ( transform != null )
        {
            pos += transform.localPosition;
            transform = transform.parent;
        }
        
        return pos;
    }
    
    /// <summary>
    /// UIRoot の子オブジェクトのグローバル座標を設定します
    /// </summary>
    public static void SetGlobalPosition( this Component self, float x, float y )
    { 
        var globalPos = self.GetGlobalPosition();
        var localPos = self.transform.localPosition;
        var parentPos = globalPos - localPos;
        var pos = self.transform.localPosition;
        pos.x = -parentPos.x + x;
        pos.y = -parentPos.y + y;
        self.transform.localPosition = pos;
    }
}
uiWidget.SetGlobalPosition( 0, 0 );