Unity 如何让BoxCollider自适配大小

2022-08-29 16:04:32 浏览数 (1)

上图例为一艘货运船上装载了若干个危险品模型,它们有一个空父级,给该父级物体添加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已经自动适配大小,包含所有子物体:(最后动图没动起来,请自动脑补 -.-)

0 人点赞