鼠标右键选中物体,会遍历其下所有子物体,进行一个自适应的Box大小添加。
如图:
该脚本需要放在Assets/Editor文件夹下
using UnityEngine;
using UnityEditor;
public class BoundsTool
{
// 适用在编辑器菜单上
// [MenuItem("金手指/添加自适应BoxCollider")]
// 适用在Project里设置,以免预制体不会保存,所以直接右键预制体进行添加
// [MenuItem("Assets/添加自适应BoxCollider", false, 0)]
// 适用在场景中鼠标右键
[MenuItem("GameObject/添加自适应BoxCollider", false, 0)]
private static void AutoBoxCollider()
{
//如果未选中任何物体 返回
GameObject gameObject = Selection.activeGameObject;
if (gameObject == null) return;
// 获取数据
Vector3 startingScale = gameObject.transform.localScale;
var quat = gameObject.transform.rotation;
Vector3 locScale = gameObject.transform.localScale;
// 创建边界
Bounds meshBound = new Bounds();
MeshFilter[] meshes = gameObject.GetComponentsInChildren<MeshFilter>();
gameObject.transform.rotation = Quaternion.Euler(0f, 0f, 0f);
gameObject.transform.localScale = Vector3.one;
for (int i = 0; i < meshes.Length; i++)
{
Mesh ms = meshes[i].sharedMesh;
int vc = ms.vertexCount;
for (int j = 0; j < vc; j++)
{
if (i == 0 && j == 0)
{
meshBound = new Bounds(meshes[i].transform.TransformPoint(ms.vertices[j]), Vector3.zero);
}
else
{
meshBound.Encapsulate(meshes[i].transform.TransformPoint(ms.vertices[j]));
}
}
}
gameObject.transform.rotation = quat;
gameObject.transform.localScale = locScale;
var meshBoundOffset = meshBound.center - gameObject.transform.position;
// 先判断当前是否有碰撞器 进行销毁
var currentCollider = gameObject.GetComponent<Collider>();
if (currentCollider != null) Object.DestroyImmediate(currentCollider);
// 添加BoxCollider
var boxCollider = gameObject.AddComponent<BoxCollider>();
// 设置BoxCollider的中心点及大小
boxCollider.size = new Vector3(meshBound.size.x * gameObject.transform.localScale.x / startingScale.x,
meshBound.size.y * gameObject.transform.localScale.y / startingScale.y,
meshBound.size.z * gameObject.transform.localScale.z / startingScale.z);
boxCollider.center = new Vector3(meshBoundOffset.x * gameObject.transform.localScale.x / startingScale.x,
meshBoundOffset.y * gameObject.transform.localScale.y / startingScale.y,
meshBoundOffset.z * gameObject.transform.localScale.z / startingScale.z);
}
}