Unity 中 Pivot 与 Center,重置模型物体的轴心为中心

文章目录

  • [1. 概念](#1. 概念)
  • [2. 动态计算正确的模型中心点Center](#2. 动态计算正确的模型中心点Center)
  • [3. 重置模型物体的轴心为中心](#3. 重置模型物体的轴心为中心)

1. 概念

在 Unity 面板的左上角有两个按钮,在本文中主要研究 Pivot/Center

  • Pivot(轴心):模型的真实位置,是由建模软件设定的可在模型软件中更改,如果选中了场景中多个物体则坐标是第一个选择的Pivot坐标,transform.position 获取的就是 pivot ,是模型旋转、缩放的参考点

对于Unity中可创建的2D,3D资源是不能更改轴心点的,对于导入的资源可以进行修改

  • 2D:可以在Project->选择2D精灵图片->Import Settings->Pivot
  • 3D:可以在模型软件中更改Pivot的坐标,也就是更改模型的轴

Center(中心):由Unity根据模型的 mesh 计算出来的中心位置,是选择的所有物体的物理上的中心,如果选择了多个物体则坐标是所有选择的物体的中心,getComponent().bounds.center 获取的是center坐标

2. 动态计算正确的模型中心点Center

csharp 复制代码
using UnityEngine;
 
public class Util : MonoBehaviour
{
    /// <summary>
    /// 重新计算中心点
    /// </summary>
    /// <param name="go">要重新计算中心点的游戏物体</param>
    public static void RecalculateCenter(GameObject go)
    {
        if (go.GetComponent<MeshRenderer>() == null)
        {
            Debug.LogWarning("游戏物体身上没有MeshRenderer组件");
            return;
        }
        Vector3 center = go.GetComponent<MeshRenderer>().bounds.center;
        GameObject newGo = new GameObject(go.name);
        newGo.transform.position = center;
        go.transform.SetParent(newGo.transform);
    }
}

3. 重置模型物体的轴心为中心

遇到的问题:因为在Unity开发中经常会遇到模型物体的轴心点偏离模型很远的情况,导致我们在操作位置,旋转,缩放时很麻烦,我们很希望轴心点是物体模型的网格中心

解决方法:

1.在建模软件(3dmax,maya等)里面设置后导出.个人觉得麻烦...

2.自己创建一个空物体拖拽至目标模型的网格中心,然后将目标模型物体拖拽入创建的空物体中,来达到重置轴心的目的(但将空物体拖拽至目标模型的网格中心还是有些困难的,主要是得自己用眼色去判断...)

3.写脚本(最方便)

csharp 复制代码
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按钮就好了

相关推荐
郝学胜-神的一滴17 小时前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
江上闲人.1 天前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
小贺儿开发2 天前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com2 天前
Unity UniText笔记
unity·unitext
杨丰玮4182 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技2 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui3612 天前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎
五仁烧饼2 天前
Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略
unity·游戏引擎
新手unity自用笔记2 天前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎