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 件のコメント:
コメントを投稿