首页 > 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提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 早上也用编辑器实现了这个需求,用的是先添加子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; }

  2. 早上也用编辑器实现了这个需求,用的是先添加子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; }

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

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