2025-04-25 21:14:54 +09:00

269 lines
7.9 KiB
C#

using UnityEngine;
using UnityEditor;
#if VRC_SDK_VRCSDK2
using VRCSDK2;
#endif
using System.Collections.Generic;
// ver 1.2.2
// © 2018 gatosyocora
namespace VRCDeveloperTool
{
public class ComponentAdder : EditorWindow
{
GameObject targetObject = null;
private enum AddType
{
Current_Children_Only,
All_Childrens,
};
AddType addType;
private bool isRigidbody = false;
private bool useGravityFlag = true;
private bool isKinematicFlag = false;
private bool freezePosFlag = false;
private bool freezeRotFlag = false;
private bool isObjectSync = false;
private bool isPickup = false;
private bool isBoxCollider = false;
private bool isTriggerFlag = false;
[MenuItem("VRCDeveloperTool/Component Adder")]
private static void Create()
{
GetWindow<ComponentAdder>("Component Adder");
}
private void OnGUI()
{
targetObject = EditorGUILayout.ObjectField(
"ParentObject",
targetObject,
typeof(GameObject),
true
) as GameObject;
addType = (AddType)EditorGUILayout.EnumPopup("Add Type", addType);
guiRigidbody();
guiObjectSync();
guiPickup();
guiBoxCollider();
guiAction();
}
// 指定オブジェクトの直接的な子オブジェクトをすべて取得する
private List<GameObject> getCurrentChildrens(GameObject parentObj)
{
List<GameObject> objs = new List<GameObject>(parentObj.transform.childCount);
foreach (Transform child in parentObj.transform)
{
objs.Add(child.gameObject);
}
return objs;
}
// 指定オブジェクトの子オブジェクト以降をすべて取得する
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;
}
// 特定のオブジェクトにコンポーネントを追加する
private void AddComponentObject(GameObject obj)
{
if (isRigidbody)
{
var rigid = obj.GetComponent<Rigidbody>();
if (rigid == null)
rigid = obj.AddComponent<Rigidbody>();
rigid.isKinematic = isKinematicFlag;
rigid.useGravity = useGravityFlag;
rigid.constraints = 0;
if (freezePosFlag) rigid.constraints |= RigidbodyConstraints.FreezePosition;
if (freezeRotFlag) rigid.constraints |= RigidbodyConstraints.FreezeRotation;
}
if (isObjectSync)
{
#if VRC_SDK_VRCSDK2
if (obj.GetComponent<VRC_ObjectSync>() == null)
{
var com = obj.AddComponent<VRC_ObjectSync>();
}
#endif
}
if (isPickup)
{
#if VRC_SDK_VRCSDK2
if (obj.GetComponent<VRC_Pickup>() == null)
{
var com = obj.AddComponent<VRC_Pickup>();
}
#endif
}
if (isBoxCollider)
{
if (obj.GetComponent<Collider>() == null || obj.GetComponent<BoxCollider>() != null)
{
var com = obj.GetComponent<BoxCollider>();
if (com == null)
com = obj.AddComponent<BoxCollider>();
com.isTrigger = isTriggerFlag;
}
}
}
// 特定のオブジェクトのコンポーネントを削除する
private void DeleteComponentObject(GameObject obj)
{
if (isPickup)
{
#if VRC_SDK_VRCSDK2
var com = obj.GetComponent<VRC_Pickup>();
if (com != null) DestroyImmediate(com);
#endif
}
if (isRigidbody)
{
var com = obj.GetComponent<Rigidbody>();
if (com != null) DestroyImmediate(com);
}
if (isObjectSync)
{
#if VRC_SDK_VRCSDK2
var com = obj.GetComponent<VRC_ObjectSync>();
if (com != null) DestroyImmediate(com);
#endif
}
if (isBoxCollider)
{
var com = obj.GetComponent<BoxCollider>();
if (com != null) DestroyImmediate(com);
}
}
private void guiRigidbody()
{
isRigidbody = EditorGUILayout.BeginToggleGroup("Rigidbody", isRigidbody);
if (isRigidbody)
{
useGravityFlag = EditorGUILayout.Toggle("useGravity", useGravityFlag);
isKinematicFlag = EditorGUILayout.Toggle("isKinematic", isKinematicFlag);
freezePosFlag = EditorGUILayout.Toggle("Freeze Positions", freezePosFlag);
freezeRotFlag = EditorGUILayout.Toggle("Freeze Rotations", freezeRotFlag);
}
EditorGUILayout.EndToggleGroup();
}
private void guiObjectSync()
{
isObjectSync = EditorGUILayout.BeginToggleGroup("VRC_ObjectSync", isObjectSync);
//syncPhysicsFlag = EditorGUILayout.Toggle("Synchronize Physics", syncPhysicsFlag);
//collisionTransferFlag = EditorGUILayout.Toggle("Collision Transfer", collisionTransferFlag);
#if VRC_SDK_VRCSDK2
#else
if (isObjectSync)
{
EditorGUILayout.HelpBox("VRCSDK2をインポートしてください", MessageType.Error);
}
#endif
EditorGUILayout.EndToggleGroup();
}
private void guiPickup()
{
isPickup = EditorGUILayout.BeginToggleGroup("VRC_Pickup", isPickup);
#if VRC_SDK_VRCSDK2
#else
if (isPickup)
{
EditorGUILayout.HelpBox("VRCSDK2をインポートしてください", MessageType.Error);
}
#endif
EditorGUILayout.EndToggleGroup();
}
private void guiBoxCollider()
{
isBoxCollider = EditorGUILayout.BeginToggleGroup("BoxCollider", isBoxCollider);
if (isBoxCollider)
{
isTriggerFlag = EditorGUILayout.Toggle("isTrigger", isTriggerFlag);
}
EditorGUILayout.EndToggleGroup();
}
private void guiAction()
{
EditorGUI.BeginDisabledGroup(targetObject == null);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Add/Change Components"))
{
List<GameObject> objs;
if (addType == AddType.Current_Children_Only)
{
objs = getCurrentChildrens(targetObject);
}
else
{
objs = getAllChildrens(targetObject);
}
foreach (GameObject obj in objs)
{
AddComponentObject(obj);
}
}
if (GUILayout.Button("Delete Components"))
{
List<GameObject> objs;
if (addType == AddType.Current_Children_Only)
{
objs = getCurrentChildrens(targetObject);
}
else
{
objs = getAllChildrens(targetObject);
}
foreach (GameObject obj in objs)
{
DeleteComponentObject(obj);
}
}
EditorGUILayout.EndHorizontal();
EditorGUI.EndDisabledGroup();
}
}
}