129 lines
3.7 KiB
C#
129 lines
3.7 KiB
C#
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<GameObject> exclusions = new List<GameObject>();
|
|
|
|
[MenuItem("VRCDeveloperTool/MeshBounds Setter")]
|
|
private static void Create()
|
|
{
|
|
GetWindow<MeshBoundsSetter>("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<MeshRenderer>();
|
|
var skinnedMesh = obj.GetComponent<SkinnedMeshRenderer>();
|
|
|
|
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<GameObject> GetAllChildrens(GameObject parentObj)
|
|
{
|
|
List<GameObject> objs = new List<GameObject>();
|
|
|
|
var childTransform = parentObj.GetComponentsInChildren<Transform>();
|
|
|
|
foreach (Transform child in childTransform)
|
|
{
|
|
objs.Add(child.gameObject);
|
|
}
|
|
|
|
return objs;
|
|
}
|
|
}
|
|
}
|
|
|