using System.Collections; using System.Collections.Generic; using System.Text; using MonKey; using UnityEditor; using UnityEngine; namespace BITKit.GameEditor { public class QuickFixBoxCollider { [Command(nameof(FixCollider), "快速修复BoxCollider编写", QuickName = "fb"), MenuItem("Tools/Scenes/Fix Float Model Position")] public static void FixCollider() { foreach (var transform in UnityEditor.Selection.transforms) { // 获取或创建 BoxCollider 组件 var boxCollider = transform.GetComponent(); if (boxCollider == null) { continue; } // 获取所有可见的 MeshRenderer 组件 var meshRenderers = transform.GetComponentsInChildren(); if (meshRenderers.Length == 0) { Debug.LogWarning("No MeshRenderer components found in children."); return; } // 初始化包围盒,以第一个 MeshRenderer 的包围盒为基准 Bounds bounds = new Bounds(transform.transform.InverseTransformPoint(meshRenderers[0].bounds.center), transform.transform.InverseTransformVector(meshRenderers[0].bounds.size)); // 遍历所有 MeshRenderer,合并包围盒 for (int i = 1; i < meshRenderers.Length; i++) { Bounds localBounds = meshRenderers[i].bounds; Vector3 localCenter = transform.transform.InverseTransformPoint(localBounds.center); Vector3 localSize = transform.transform.InverseTransformVector(localBounds.size); bounds.Encapsulate(new Bounds(localCenter, localSize)); } // 设置 BoxCollider 的中心和大小 boxCollider.center = bounds.center; boxCollider.size = bounds.size; EditorUtility.SetDirty(boxCollider); } } } }