BITKit/Src/UnityPluginsSupport/MonkeyCommand/QuickFixBoxCollider.cs

56 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = "qkc"),
MenuItem("Tools/Scenes/Quick Fix Box Collider Bounds")]
public static void FixCollider()
{
foreach (var transform in UnityEditor.Selection.transforms)
{
// 获取或创建 BoxCollider 组件
var boxCollider = transform.GetComponent<BoxCollider>();
if (boxCollider == null)
{
continue;
}
// 获取所有可见的 MeshRenderer 组件
var meshRenderers = transform.GetComponentsInChildren<MeshRenderer>();
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);
}
}
}
}