2013年5月12日日曜日

Unity Tips #54 Scale Transformとレンダラ


Unify Community にScale Transformとレンダラに関する Tips があったので紹介したい。

http://wiki.unity3d.com/index.php/Tip_of_the_day
Feb 2013

Unity Tips #54 Scale Transform

Scale Transformとレンダラ


次のコードによりゲームオブジェクトの Transform を x, z 軸に沿って特定のサイズに拡大する際にゲームオブジェクトにレンダラ (Renderer) コンポーネントがアタッチされていれば、そのレンダラの境界線もあわせて調整する。

/// 
/// Transform を x, z 軸に沿って特定のサイズに拡大する。
/// </summary>
/// <param name="transform" />
/// スケールする Transform への参照
/// 
/// <param name="width" />ターゲット サイズを表す x 軸に沿った幅
/// <param name="height" />ターゲット サイズを表す z 軸に沿った高さ
public static void ScaleTransform(Transform transform, float width, float height)
{
    // プレハブ境界を取得
    var bounds = new Bounds();
    var encapsulate = false;
    if (!Utilities.Helpers.GetBoundWithChildren(transform, ref bounds, ref encapsulate))
    {
        return;
    }
 
    // サイズの軸のうち最小の大きさを取得
    var min = Mathf.Min(width, height);
 
    // Transformの x または z 軸のうち最大の大きさを取得
    var max = Mathf.Max(bounds.size.x, bounds.size.z);
 
    // スケール係数を計算
    var scaleFactor = min / max;
 
    // Transform にスケールを適用
    transform.localScale *= scaleFactor;
}
 
/// <summary>
/// Transform のレンダラ境界を取得
/// </summary>
/// <param name="transform" />境界ボックスを取得するゲームオブジェクト
/// <param name="pBound" />境界ボックスへの参照
/// <param name="encapsulate" />最初の境界ボックスとして
/// 計算されたものが <see cref="pBound"> 引数にカプセル化すべきか判断する
/// <returns>最低でもひとつの境界ボックスが計算されていれば true を戻す。</returns>
public static bool GetBoundWithChildren(Transform transform, ref Bounds pBound, ref bool encapsulate)
{
    var didOne = false;
 
    // 'this' の境界を取得
    if (transform.gameObject.renderer != null)
    {
        var bound = transform.gameObject.renderer.bounds;
        if (encapsulate)
        {
            pBound.Encapsulate(bound.min);
            pBound.Encapsulate(bound.max);
        }
        else
        {
            pBound.min = bound.min;
            pBound.max = bound.max;
            encapsulate = true;
        }
 
        didOne = true;
    }
 
    // 子オブジェクトのすべての境界と結合
    foreach (Transform child in transform)
    {
        if (GetBoundWithChildren(child, ref pBound, ref encapsulate))
        {
            didOne = true;
        }
    }
 
    return didOne;
}
--------
Unityデフォルトだとレンダラのサイズは調整されないので便利だぜ!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿