首页 > 其他分享 >【Unity实用技巧】Transform组件位置快速对齐(编辑器扩展)

【Unity实用技巧】Transform组件位置快速对齐(编辑器扩展)

时间:2024-12-20 15:55:59浏览次数:5  
标签:实用技巧 transform 物体 bounds Transform meshRenderers Unity

前言

在Unity项目开发中,经常需要调整物体的位置。特别是在处理3D模型时,我们可能需要将一个父物体移动到其所有子物体的中心位置或底部中心位置。本文将介绍如何通过Unity编辑器扩展来实现这个功能,让美术同学在摆放模型时更加方便。


一、效果演示

在这里插入图片描述

二、完整代码

这里直接上完整代码了,大家有问题可以在评论区留言

using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Transform))]
public class TransformMethod : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var transform = target as Transform;
        if (transform.TryGetComponent<MeshFilter>(out var meshFilter) || transform.GetComponentInChildren<MeshFilter>() == null)
        {

        }
        else
        {
            using (new GUILayout.HorizontalScope())
            {
                // 添加两个按钮
                if (GUILayout.Button("Move To Center", GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.5f)))
                {
                    MoveToCenter(transform, false);
                }

                if (GUILayout.Button("Move To Bottom Center", GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.5f)))
                {
                    MoveToCenter(transform, true);
                }
            }
        }
    }

    private void MoveToCenter(Transform transform, bool toBottom)
    {
        // 获取所有子物体的MeshRenderer
        var meshRenderers = transform.GetComponentsInChildren<MeshRenderer>();
        if (meshRenderers.Length == 0) return;

        // 计算所有Mesh的边界框
        Bounds bounds = new Bounds(meshRenderers[0].bounds.center, meshRenderers[0].bounds.size);
        for (int i = 1; i < meshRenderers.Length; i++)
        {
            bounds.Encapsulate(meshRenderers[i].bounds);
        }

        // 记录所有子物体的世界位置
        var childCount = transform.childCount;
        Vector3[] worldPositions = new Vector3[childCount];
        for (int i = 0; i < childCount; i++)
        {
            worldPositions[i] = transform.GetChild(i).position;
        }

        // 移动父物体到中心位置
        Vector3 targetPosition = bounds.center;
        if (toBottom)
        {
            targetPosition.y = bounds.min.y;
        }
        transform.position = targetPosition;

        // 恢复子物体的世界位置
        for (int i = 0; i < childCount; i++)
        {
            transform.GetChild(i).position = worldPositions[i];
        }
        // 标记为需要保存
        EditorUtility.SetDirty(transform);
    }
}

三、总结

这个编辑器扩展工具虽然简单,但在实际开发中非常实用:

1、提高效率:避免手动调整物体位置,一键完成对齐
2、保持准确:通过计算精确的边界框确保对齐的准确性
3、维持层级:在调整过程中保持物体层级关系不变
4、易于使用:直接集成在Transform Inspector中,使用方便


通过这个例子,我们可以看到Unity编辑器扩展的强大之处。通过简单的代码,我们就能为Unity编辑器添加实用的功能,提高开发效率。同时,这个实现也展示了如何在移动物体时保持子物体的世界坐标不变,这是一个在很多场景下都能用到的技巧。


如果觉得这篇文章对你有帮助,欢迎点赞收藏!欢迎在评论区留言交流。

标签:实用技巧,transform,物体,bounds,Transform,meshRenderers,Unity
From: https://blog.csdn.net/weixin_41741510/article/details/144612645

相关文章

  • 【Unity基础】Unity中拖拽3D物体的过程分析和实现方法
    我们先来分析一下Unity中拖拽物体的过程:第一步:先检测拖拽的输入方式,可以鼠标,触摸,可以用InputManager输入,也可以使用InputSystem输入第二步:获取触碰点的位置,并计算offset。第三步:在每一帧里改变物体的位置。其实3D物体拖拽的过程可以分为上面几个清晰的步骤,而每一步都有......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践8
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践1
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践9
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践2
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践4
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践8
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践15
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • Transformer大数据分布式因果推断在美团履约平台的探索与实践13
     1.背景中国有句古话:“民以食为天”。对食物的分析和理解,特别是识别菜肴的食材,在健康管理、卡路里计算、烹饪艺术、食物搜索等领域具有重要意义。但是,算法技术尽管在目标检测[1]-[3]、通用场景理解[4][5]和跨模态检索[6]-[8]方面取得了很大进展,却没有在食物相关的场景中取得......
  • 【实用技巧】MD5 的重复请求应用以及性能测试
    1 前言大家可能都遇到幂等或者娇艳重复提交的问题,比如重复的JSON请求、文件上传相同的文件重复上传了两次等,当然了确实存在某种情况比如人家用户一会上传了一个文件隔了一会儿又上传一个同样的文件是合理的,我们要做的就是短时间内的重复提交。这个时候我们可以通过计算请求......