using UnityEngine;
using System.Collections;
public class BoundUtil : MonoBehaviour
{
private Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
private Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue);
// Use this for initialization
void Start () {
Search(transform, ref min, ref max);
}
// Update is called once per frame
void Update () {
DrawBound(min, max);
}
/// <summary>
/// 递归计算所有子物体的范围
/// </summary>
/// <param name="tf">需要计算范围的模型变换</param>
/// <param name="min"></param>
/// <param name="max"></param>
private void Search(Transform tf,ref Vector3 min,ref Vector3 max)
{
MeshFilter mFilter = tf.GetComponent<MeshFilter>();
if (mFilter != null && mFilter.mesh != null)
{
Vector3 meshMax = mFilter.mesh.bounds.max + tf.position;
if (meshMax.x > max.x) max.x = meshMax.x;
if (meshMax.y > max.y) max.y = meshMax.y;
if (meshMax.z > max.z) max.z = meshMax.z;
Vector3 meshMin = mFilter.mesh.bounds.min + tf.position;
if (meshMin.x < min.x) min.x = meshMin.x;
if (meshMin.y < min.y) min.y = meshMin.y;
if (meshMin.z < min.z) min.z = meshMin.z;
}
//递归遍历所有子物体
for (int i = 0; i < tf.childCount; i++)
{
Search(tf.GetChild(i), ref min, ref max);
}
}
/// <summary>
/// 绘制一个3D边框
/// </summary>
/// <param name="min"></param>
/// <param name="max"></param>
private void DrawBound(Vector3 min,Vector3 max)
{
Debug.DrawLine(min, new Vector3(min.x, max.y, min.z), Color.red);
Debug.DrawLine(min, new Vector3(max.x, min.y, min.z), Color.red);
Debug.DrawLine(min, new Vector3(min.x, min.y, max.z), Color.red);
Debug.DrawLine(max, new Vector3(min.x, max.y, max.z), Color.red);
Debug.DrawLine(max, new Vector3(max.x, max.y, min.z), Color.red);
Debug.DrawLine(max, new Vector3(max.x, min.y, max.z), Color.red);
Debug.DrawLine(new Vector3(max.x, max.y, min.z), new Vector3(min.x, max.y, min.z), Color.red);
Debug.DrawLine(new Vector3(max.x, max.y, min.z), new Vector3(max.x, min.y, min.z), Color.red);
Debug.DrawLine(new Vector3(min.x, max.y, max.z), new Vector3(min.x, min.y, max.z), Color.red);
Debug.DrawLine(new Vector3(min.x, min.y, max.z), new Vector3(max.x, min.y, max.z), Color.red);
Debug.DrawLine(new Vector3(max.x, min.y, max.z), new Vector3(max.x, min.y, min.z), Color.red);
Debug.DrawLine(new Vector3(min.x, max.y, min.z), new Vector3(min.x, max.y, max.z), Color.red);
}
}
using UnityEngine;
using System.Collec