上图例为一艘货运船上装载了若干个危险品模型,它们有一个空父级,给该父级物体添加BoxCollider碰撞盒时其Size默认大小为1, 如何给父物体添加BoxCollider碰撞盒时使其Size大小自适配包含所有子物体模型,而不是手动去调整该BoxCollider大小?

包围盒Bounds类为我们提供了解决办法,下面编写小工具:

using UnityEngine;
using UnityEditor;

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 += renders[i].bounds.center;
        }
        center /= renders.Length;
        //创建边界盒
        Bounds bounds = new Bounds(center, Vector3.zero);
        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已经自动适配大小,包含所有子物体:

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐