前言
因为在Unity开发中经常会遇到模型物体的轴心点偏离模型很远的情况,导致我们在操作位置,旋转,缩放时很麻烦,我们很希望轴心点是物体模型的网格中心:
小知识
在Unity中模型物体的中心和轴心意义
中心:模型物体下所有渲染网格的计算中心点
轴心:模型物体Transform的操作点(位置点,旋转点,缩放点)
可以在Unity中通过点击下方的按钮切换查看
当前为轴心状态
在Unity中直接创建的Cube,Sphere,Capsule等物体时它们的中心和轴心是重合的
解决方法
1.在建模软件(3dmax,maya等)里面设置后导出.个人觉得麻烦…
2.自己创建一个空物体拖拽至目标模型的网格中心,然后将目标模型物体拖拽入创建的空物体中,来达到重置轴心的目的(但将空物体拖拽至目标模型的网格中心还是有些困难的,主要是得自己用眼色去判断…)
下方为我自己写的方法2的编辑器快捷工具方法,基本上能达设置的轴心为绝对的网格中心:
using UnityEngine;
using UnityEditor;
public class MyTool : ScriptableObject
{
//重置模型的轴心为中心
[MenuItem("Tools/MyTool/ResetPivot")]
static void ResetPivot()
{
//获取选中的物体
GameObject target = Selection.activeGameObject;
string dialogTitle = "Tools/MyTool/ResetPivot";
if (target == null)
{
EditorUtility.DisplayDialog(dialogTitle, "没有选中需要重置轴心的物体!!!", "确定");
return;
}
//获取目标物体下所有网格渲染
MeshRenderer[] meshRenderers = target.GetComponentsInChildren<MeshRenderer>(true);
if (meshRenderers.Length == 0)
{
EditorUtility.DisplayDialog(dialogTitle, "选中的物体不是有效模型物体!!!", "确定");
return;
}
//将所有的网格渲染的边界进行合并
Bounds centerBounds = meshRenderers[0].bounds;
for (int i=1;i<meshRenderers.Length;i++)
{
centerBounds.Encapsulate(meshRenderers[i].bounds);
}
//创建目标的父物体
Transform targetParent = new GameObject(target.name + "-Parent").transform;
//如果目标原来已有父物体,则将创建目标父物体的父物体设为原父物体;
Transform originalParent = target.transform.parent;
if (originalParent != null)
{
targetParent.SetParent(originalParent);
}
//设置目标父物体的位置为合并后的网格渲染边界中心
targetParent.position = centerBounds.center;
//设置目标物体的父物体
target.transform.parent = targetParent;
Selection.activeGameObject = targetParent.gameObject;
EditorUtility.DisplayDialog(dialogTitle, "重置模型物体的轴心完成!", "确定");
}
}
使用方法
选择需要重置轴心的的物体,然后使用上方的Tools/MyTool下的的ResetPivot按钮就好了