teler1k

ColliderCreatorInspector.cs

Feb 12th, 2021 (edited)
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.11 KB | None | 0 0
  1. #if UNITY_EDITOR
  2. using Assets.Scripts.Utilities;
  3. using UnityEditor;
  4. using UnityEngine;
  5.  
  6. namespace Assets.Scripts.Editor
  7. {
  8.     [CustomEditor(typeof(ColliderCreator))]
  9.     [CanEditMultipleObjects]
  10.     public class ColliderCreatorInspector : UnityEditor.Editor
  11.     {
  12.         private GUIContent generateContent;
  13.         private GUIContent clearAllContent;
  14.  
  15.         public void OnEnable()
  16.         {
  17.             generateContent = new GUIContent(" Generate Colliders", EditorGUIUtility.IconContent("d_Refresh").image);
  18.             clearAllContent = new GUIContent(" Clear Colliders", EditorGUIUtility.IconContent("d_Grid.EraserTool").image);
  19.         }
  20.  
  21.         public override void OnInspectorGUI()
  22.         {
  23.             var colliderCreator = target as ColliderCreator;
  24.             var transform = colliderCreator.transform;
  25.  
  26.             if (transform.childCount < 1)
  27.             {
  28.                 GUILayout.Label("Child objects are not setup.");
  29.                 if (GUILayout.Button("Setup Child Objects", GUILayout.Width(150), GUILayout.Height(30)))
  30.                 {
  31.                     var boxContainer = new GameObject("_BOXCOLLIDERS");
  32.                     boxContainer.transform.localPosition = Vector3.zero;
  33.                     boxContainer.transform.localScale = Vector3.one;
  34.                     boxContainer.transform.SetParent(transform);
  35.  
  36.                     var point1 = new GameObject("Point (1)");
  37.                     point1.transform.SetParent(transform);
  38.                     point1.transform.localPosition = Vector3.zero;
  39.                     point1.transform.localScale = Vector3.one + Vector3.up * 3;
  40.  
  41.                     var point2 = new GameObject("Point (2)");
  42.                     point2.transform.SetParent(transform);
  43.                     point2.transform.localPosition = Vector3.forward * 5;
  44.                     point2.transform.localScale = Vector3.one + Vector3.up * 3;
  45.                 }
  46.             }
  47.             else
  48.             {
  49.                 base.OnInspectorGUI();
  50.  
  51.                 GUILayout.Space(10);
  52.                 GUILayout.BeginHorizontal();
  53.                 if (GUILayout.Button(generateContent, GUILayout.Height(30)))
  54.                 {
  55.                     GenerateColliders();
  56.                 }
  57.                 if (GUILayout.Button(clearAllContent, GUILayout.Height(30)))
  58.                 {
  59.                     ClearAllColliders();
  60.                 }
  61.                 GUILayout.EndHorizontal();
  62.             }
  63.         }
  64.  
  65.         private void GenerateColliders()
  66.         {
  67.             var colliderCreator = target as ColliderCreator;
  68.             var transform = colliderCreator.transform;
  69.             var boxContainerTransform = transform.GetChild(0);
  70.  
  71.             ClearAllColliders();
  72.  
  73.             // create capsule AND box colliders.
  74.             for (int i = 1; i < transform.childCount; i++)
  75.             {
  76.                 var child = transform.GetChild(i);
  77.  
  78.                 // create capsule collider.
  79.                 if (colliderCreator.generateCapsuleColliders)
  80.                 {
  81.                     var capsuleCollider = child.gameObject.AddComponent<CapsuleCollider>();
  82.                     capsuleCollider.radius = 1;
  83.                     capsuleCollider.height = 1;
  84.                 }
  85.  
  86.                 // create box colliders for inbetween children.
  87.                 if (colliderCreator.generateBoxColliders && i < transform.childCount - 1)
  88.                 {
  89.                     var nextChild = transform.GetChild(i + 1);
  90.  
  91.                     var position = (child.position + nextChild.position) / 2f;
  92.                     var size = new Vector3((child.localScale.x + nextChild.localScale.x) / 2f, (child.localScale.y + nextChild.localScale.y) / 2f, Vector3.Distance(child.position, nextChild.position));
  93.                     var rotation = Quaternion.LookRotation(nextChild.position - child.position);
  94.  
  95.                     var boxChild = new GameObject("Box " + i, typeof(BoxCollider));
  96.                     boxChild.transform.SetParent(boxContainerTransform);
  97.                     boxChild.transform.position = position;
  98.                     boxChild.transform.localScale = size;
  99.                     boxChild.transform.rotation = rotation;
  100.                 }
  101.             }
  102.         }
  103.  
  104.         private void ClearAllColliders()
  105.         {
  106.             var colliderCreator = target as ColliderCreator;
  107.             var transform = colliderCreator.transform;
  108.             var boxContainerTransform = transform.GetChild(0);
  109.  
  110.             // delete all existing box colliders.
  111.             for (int i = boxContainerTransform.childCount - 1; i >= 0; i--)
  112.             {
  113.                 DestroyImmediate(boxContainerTransform.GetChild(i).gameObject);
  114.             }
  115.  
  116.             // delete all capsule colliders of children.
  117.             for (int i = 1; i < transform.childCount; i++)
  118.             {
  119.                 var child = transform.GetChild(i);
  120.                 var capsuleCollider = child.GetComponent<CapsuleCollider>();
  121.                 if (capsuleCollider != null)
  122.                 {
  123.                     DestroyImmediate(capsuleCollider);
  124.                 }
  125.             }
  126.         }
  127.     }
  128. }
  129. #endif
Add Comment
Please, Sign In to add comment