using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditorInternal; // ver 1.02 // © 2019-2-1 gatosyocora namespace VRCDeveloperTool { public class MeshBoundsSetter : EditorWindow { private GameObject targetObject = null; private Vector3 boundsScale = new Vector3(1, 2, 1); private List exclusions = new List(); [MenuItem("VRCDeveloperTool/MeshBounds Setter")] private static void Create() { GetWindow("MeshBounds Setter"); } private void OnGUI() { targetObject = EditorGUILayout.ObjectField( "TargetObject", targetObject, typeof(GameObject), true ) as GameObject; boundsScale = EditorGUILayout.Vector3Field("Bounds Scale", boundsScale); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Exclusions"); if (GUILayout.Button("+")) { exclusions.Add(null); } if (GUILayout.Button("-")) { if (exclusions.Count > 0) exclusions.RemoveAt(exclusions.Count - 1); } EditorGUILayout.EndHorizontal(); for (int i = 0; i < exclusions.Count; i++) { exclusions[i] = EditorGUILayout.ObjectField( "Object " + (i + 1), exclusions[i], typeof(GameObject), true ) as GameObject; } guiAction(); } private void guiAction() { EditorGUI.BeginDisabledGroup(targetObject == null); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Set Bounds")) { BoundsSetter(targetObject); } EditorGUILayout.EndHorizontal(); EditorGUI.EndDisabledGroup(); } private void BoundsSetter(GameObject parentObj) { var objs = GetAllChildrens(parentObj); foreach (var obj in objs) { // 除外リストに含まれていれば処理しない if (exclusions.Contains(obj)) continue; var mesh = obj.GetComponent(); var skinnedMesh = obj.GetComponent(); if (mesh == null && skinnedMesh == null) continue; // Mesh Rendererの場合 if (mesh != null) { Undo.RecordObject(mesh, "Change Transform " + mesh.name); } // SkinnedMeshRendererの場合 else { Undo.RecordObject(skinnedMesh, "Change Transform " + skinnedMesh.name); var objScale = skinnedMesh.gameObject.transform.localScale; var meshBoundsScale = new Vector3(boundsScale.x / objScale.x, boundsScale.y / objScale.y, boundsScale.z / objScale.z); skinnedMesh.localBounds = new Bounds(Vector3.zero, meshBoundsScale); } } } // 指定オブジェクトの子オブジェクト以降をすべて取得する private List GetAllChildrens(GameObject parentObj) { List objs = new List(); var childTransform = parentObj.GetComponentsInChildren(); foreach (Transform child in childTransform) { objs.Add(child.gameObject); } return objs; } } }