上图例为一艘货运船上装载了若干个危险品模型,它们有一个空父级,给该父级物体添加BoxCollider碰撞盒时其Size默认大小为1, 如何给父物体添加BoxCollider碰撞盒时使其Size大小自适配包含所有子物体模型,而不是手动去调整该BoxCollider大小?
包围盒Bounds类为我们提供了解决办法,下面编写小工具:
代码语言:javascript复制public class BoundsTool
{
[MenuItem("SKFramework/Bounds/Auto BoxCollider")]
private static void AutoBoxCollider()
{
//如果未选中任何物体 返回
GameObject gameObject = Selection.activeGameObject;
if (gameObject == null) return;
//计算中心点
Vector3 center = Vector3.zero;
var renders = gameObject.GetComponentsInChildren<Renderer>();
for (int i = 0; i < renders.Length; i )
{
//center属性表示包围盒中心点
center = renders[i].bounds.center;
}
center /= renders.Length;
//创建包围盒
Bounds bounds = new Bounds(center, Vector3.zero);
//遍历调用Encapsulate函数
foreach (var render in renders)
{
bounds.Encapsulate(render.bounds);
}
//先判断当前是否有碰撞器 进行销毁
var currentCollider = gameObject.GetComponent<Collider>();
if (currentCollider != null) Object.DestroyImmediate(currentCollider);
//添加BoxCollider 设置中心点及大小
var boxCollider = gameObject.AddComponent<BoxCollider>();
boxCollider.center = bounds.center - gameObject.transform.position;
boxCollider.size = bounds.size;
}
}
加入上述工具后,在场景中进行测试,可见添加的BoxCollider已经自动适配大小,包含所有子物体:(最后动图没动起来,请自动脑补 -.-)