开发过程中我们可能会遇到这样的模型:
模型的坐标点与其实际位置相差甚远,这时如果想要操作这个物体的Transform则不能得到预想的结果。例如我们现在旋转上图例中的车轮:
解决这种问题的思路是,创建一个新物体作为该模型物体的父级,新物体的坐标位置设为该模型的中心点位置,手动的去设置这个位置会比较麻烦,也不能做到十分精确,这时我们需要用到Bounds类Encapsulate函数去计算中心点位置:
因此我们需要获取该模型物体的所有MeshRenderer,包括子物体,声明一个新的Bounds包围盒,遍历所有的MeshRenderer,调用Encapsulate函数去计算包围盒的边界及中心。
代码如下:
usingUnityEngine; usingUnityEditor; publicclassAutoModelCenter{ /// <summary>/// 获取模型的中心点/// </summary> [MenuItem("SKFramework/Tools/GetModelCenter")] publicstaticvoidGetModelCenter() { //如果未选中任何Transform returnif (Selection.activeTransform==null) return; Transformtransform=Selection.activeTransform; Boundsbounds=newBounds(Vector3.zero, Vector3.zero); //获取所有MeshRenderer 包括子物体varmrs=transform.GetComponentsInChildren<MeshRenderer>(true); Vector3center=Vector3.zero; for (inti=0; i<mrs.Length; i++) { center+=mrs[i].bounds.center; //Encapsulate函数重新计算boundsbounds.Encapsulate(mrs[i].bounds); } center/=mrs.Length; //创建一个新物体作为空父级GameObjectobj=newGameObject(); obj.name=transform.name; obj.transform.position=center; obj.transform.rotation=Quaternion.identity; obj.transform.SetParent(transform.parent); transform.SetParent(obj.transform); } }
有了该工具后我们就可以获得车轮的中心点,然后就可以正常旋转它了: