首页 > Unity3D频道 > 【Unity3D拓展编辑器】 > Unity3D研究院之自动计算所有子对象包围盒(六)
2015
05-05

Unity3D研究院之自动计算所有子对象包围盒(六)

如下图所示,拖入不同的mesh在一个节点下面,自动生成一个BoxCollider包围盒。这个功能可以方便关卡策划,不然手动设置BoxCollider太蛋疼了。。

Unity3D研究院之自动计算所有子对象包围盒(六) - 雨松MOMO程序研究院 - 1
先选择一个父节点,然后执行下面脚本。。 或者也可以根据需求在关卡编辑器上做成自动的。。

避免子节点中有残留的Collider,生成前先把所有子节点的Collider删除。

参考文章 http://stackoverflow.com/questions/11949463/how-to-get-size-of-parent-game-object

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之自动计算所有子对象包围盒(六)》有 22 条评论

  1. 蹦蹦呛 说:

    雨松大大超级棒棒,看了雨松大大的第二版游戏开发,很细节,都是一些底层。超级棒。

  2. 林会亮 说:

    我是新手,请问这个脚本完成需要什么条件?(是否需要继承editor或者继承其他)

  3. 李晨曦 说:

    早上也用编辑器实现了这个需求,用的是先添加子render的bounds到boundsList再逐个合并bounds bounds.Encapsulate这个函数可以直接接bounds 这个学习了后面的转化用的 transform.InverseTransformPoint和InverseTransformVector来做的,学习了。分享下个人的代码:[MenuItem(“Test/AddBoxCollisionInChoose”)] static void AddBoxCollisionInChoose() { targetObj = Selection.activeGameObject; if (targetObj) { if(boundsList!=null) boundsList.Clear(); boundsList = new List(); Renderer[] rends = targetObj.GetComponentsInChildren(); for (int i = 0; i < rends.Length; i ) { BoxCollider box=rends Unity3D研究院之自动计算所有子对象包围盒(六) - 雨松MOMO程序研究院 - 1 .gameObject.AddComponent(); boundsList.Add(box.bounds); } Bounds parentBox = new Bounds(targetObj.transform.position, Vector3.zero); foreach (Bounds bound in boundsList) { parentBox = TestPoint(parentBox, bound.center); parentBox = TestPoint(parentBox, bound.min); parentBox = TestPoint(parentBox, bound.max); } BoxCollider mybox=targetObj.AddComponent(); mybox.center = targetObj.transform.InverseTransformPoint(parentBox.center); mybox.size = targetObj.transform.InverseTransformVector(parentBox.size); for (int i = 0; i < rends.Length; i ) { BoxCollider box = rends Unity3D研究院之自动计算所有子对象包围盒(六) - 雨松MOMO程序研究院 - 2 .gameObject.GetComponent(); box.enabled = false; UnityEngine.Object.DestroyImmediate(box); } } } private static Bounds TestPoint(Bounds parent, Vector3 point) { if (parent.Contains(point) == false) { parent.Encapsulate(point); } return parent; }

  4. 李晨曦 说:

    早上也用编辑器实现了这个需求,用的是先添加子render的bounds到boundsList再逐个合并bounds bounds.Encapsulate这个函数可以直接接bounds 这个学习了后面的转化用的 transform.InverseTransformPoint和InverseTransformVector来做的,学习了。分享下个人的代码:[MenuItem(“Test/AddBoxCollisionInChoose”)] static void AddBoxCollisionInChoose() { targetObj = Selection.activeGameObject; if (targetObj) { if(boundsList!=null) boundsList.Clear(); boundsList = new List(); Renderer[] rends = targetObj.GetComponentsInChildren(); for (int i = 0; i < rends.Length; i++) { BoxCollider box=rends Unity3D研究院之自动计算所有子对象包围盒(六) - 雨松MOMO程序研究院 - 1 .gameObject.AddComponent(); boundsList.Add(box.bounds); } Bounds parentBox = new Bounds(targetObj.transform.position, Vector3.zero); foreach (Bounds bound in boundsList) { parentBox = TestPoint(parentBox, bound.center); parentBox = TestPoint(parentBox, bound.min); parentBox = TestPoint(parentBox, bound.max); } BoxCollider mybox=targetObj.AddComponent(); mybox.center = targetObj.transform.InverseTransformPoint(parentBox.center); mybox.size = targetObj.transform.InverseTransformVector(parentBox.size); for (int i = 0; i < rends.Length; i++) { BoxCollider box = rends Unity3D研究院之自动计算所有子对象包围盒(六) - 雨松MOMO程序研究院 - 2 .gameObject.GetComponent(); box.enabled = false; UnityEngine.Object.DestroyImmediate(box); } } } private static Bounds TestPoint(Bounds parent, Vector3 point) { if (parent.Contains(point) == false) { parent.Encapsulate(point); } return parent; }

  5. bigee_hyb 说:

    刚学习,发现21行应该
    center /= parent.childCount;

  6. 王旭东 说:

    我想在场景中设置一些点,然后用线把他们连起来,编辑场景的时候有没有可以画线的功能呢?就像在场景中看摄像机或者其他模型似得,有不同颜色的线框可以标识

  7. 太空兔子 说:

    看了MOMO关于编辑器扩展的一系列文章,感觉受益匪浅,对unity底层的一些运行时有了新的认识。非常感谢!

  8. jeff 说:

    新版本的Unity的扩展方法和老版本的Unity有区别吗

  9. MOMO 关卡编辑器能提供下思路吗?? 说:

    MOMO 关卡编辑器能提供下思路吗??

  10. fire 说:

    最近也在研究编辑器扩展和插件,能否共享一些学习资料,谢谢~

  11. Oo幻想oO 说:

    感觉最近会用上,mark一下

蹦蹦呛的回复 取消回复

你的email不会被公开。