Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

NavMeshModifierVolumeEditor.cs 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using UnityEditor;
  2. using UnityEditor.AI;
  3. using UnityEditor.IMGUI.Controls;
  4. using UnityEditorInternal;
  5. using UnityEngine;
  6. using UnityEngine.AI;
  7. namespace Unity.AI.Navigation.Editor
  8. {
  9. [CanEditMultipleObjects]
  10. [CustomEditor(typeof(NavMeshModifierVolume))]
  11. class NavMeshModifierVolumeEditor : UnityEditor.Editor
  12. {
  13. SerializedProperty m_AffectedAgents;
  14. SerializedProperty m_Area;
  15. SerializedProperty m_Center;
  16. SerializedProperty m_Size;
  17. static Color s_HandleColor = new Color(187f, 138f, 240f, 210f) / 255;
  18. static Color s_HandleColorDisabled = new Color(187f * 0.75f, 138f * 0.75f, 240f * 0.75f, 100f) / 255;
  19. BoxBoundsHandle m_BoundsHandle = new BoxBoundsHandle();
  20. bool editingCollider
  21. {
  22. get { return EditMode.editMode == EditMode.SceneViewEditMode.Collider && EditMode.IsOwner(this); }
  23. }
  24. void OnEnable()
  25. {
  26. m_AffectedAgents = serializedObject.FindProperty("m_AffectedAgents");
  27. m_Area = serializedObject.FindProperty("m_Area");
  28. m_Center = serializedObject.FindProperty("m_Center");
  29. m_Size = serializedObject.FindProperty("m_Size");
  30. #if !UNITY_2022_2_OR_NEWER
  31. NavMeshVisualizationSettings.showNavigation++;
  32. #endif
  33. }
  34. #if !UNITY_2022_2_OR_NEWER
  35. void OnDisable()
  36. {
  37. NavMeshVisualizationSettings.showNavigation--;
  38. }
  39. #endif
  40. Bounds GetBounds()
  41. {
  42. var navModifier = (NavMeshModifierVolume)target;
  43. return new Bounds(navModifier.transform.position, navModifier.size);
  44. }
  45. public override void OnInspectorGUI()
  46. {
  47. serializedObject.Update();
  48. EditMode.DoEditModeInspectorModeButton(EditMode.SceneViewEditMode.Collider, "Edit Volume",
  49. EditorGUIUtility.IconContent("EditCollider"), GetBounds, this);
  50. EditorGUILayout.PropertyField(m_Size);
  51. EditorGUILayout.PropertyField(m_Center);
  52. NavMeshComponentsGUIUtility.AreaPopup("Area Type", m_Area);
  53. NavMeshComponentsGUIUtility.AgentMaskPopup("Affected Agents", m_AffectedAgents);
  54. EditorGUILayout.Space();
  55. serializedObject.ApplyModifiedProperties();
  56. }
  57. #if !UNITY_2022_2_OR_NEWER
  58. [DrawGizmo(GizmoType.Selected | GizmoType.Active)]
  59. #else
  60. [DrawGizmo(GizmoType.InSelectionHierarchy | GizmoType.Active)]
  61. #endif
  62. static void RenderBoxGizmo(NavMeshModifierVolume navModifier, GizmoType gizmoType)
  63. {
  64. var color = navModifier.enabled ? s_HandleColor : s_HandleColorDisabled;
  65. var colorTrans = new Color(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, color.a * 0.15f);
  66. var oldColor = Gizmos.color;
  67. var oldMatrix = Gizmos.matrix;
  68. Gizmos.matrix = navModifier.transform.localToWorldMatrix;
  69. Gizmos.color = colorTrans;
  70. Gizmos.DrawCube(navModifier.center, navModifier.size);
  71. Gizmos.color = color;
  72. Gizmos.DrawWireCube(navModifier.center, navModifier.size);
  73. Gizmos.matrix = oldMatrix;
  74. Gizmos.color = oldColor;
  75. Gizmos.DrawIcon(navModifier.transform.position, "NavMeshModifierVolume Icon", true);
  76. }
  77. [DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Pickable)]
  78. static void RenderBoxGizmoNotSelected(NavMeshModifierVolume navModifier, GizmoType gizmoType)
  79. {
  80. #if !UNITY_2022_2_OR_NEWER
  81. if (NavMeshVisualizationSettings.showNavigation > 0)
  82. #endif
  83. {
  84. var color = navModifier.enabled ? s_HandleColor : s_HandleColorDisabled;
  85. var oldColor = Gizmos.color;
  86. var oldMatrix = Gizmos.matrix;
  87. Gizmos.matrix = navModifier.transform.localToWorldMatrix;
  88. Gizmos.color = color;
  89. Gizmos.DrawWireCube(navModifier.center, navModifier.size);
  90. Gizmos.matrix = oldMatrix;
  91. Gizmos.color = oldColor;
  92. }
  93. Gizmos.DrawIcon(navModifier.transform.position, "NavMeshModifierVolume Icon", true);
  94. }
  95. void OnSceneGUI()
  96. {
  97. if (!editingCollider)
  98. return;
  99. var vol = (NavMeshModifierVolume)target;
  100. var color = vol.enabled ? s_HandleColor : s_HandleColorDisabled;
  101. using (new Handles.DrawingScope(color, vol.transform.localToWorldMatrix))
  102. {
  103. m_BoundsHandle.center = vol.center;
  104. m_BoundsHandle.size = vol.size;
  105. EditorGUI.BeginChangeCheck();
  106. m_BoundsHandle.DrawHandle();
  107. if (EditorGUI.EndChangeCheck())
  108. {
  109. Undo.RecordObject(vol, "Modified NavMesh Modifier Volume");
  110. Vector3 center = m_BoundsHandle.center;
  111. Vector3 size = m_BoundsHandle.size;
  112. vol.center = center;
  113. vol.size = size;
  114. EditorUtility.SetDirty(target);
  115. }
  116. }
  117. }
  118. [MenuItem("GameObject/AI/NavMesh Modifier Volume", false, 2001)]
  119. public static void CreateNavMeshModifierVolume(MenuCommand menuCommand)
  120. {
  121. var parent = menuCommand.context as GameObject;
  122. var go = NavMeshComponentsGUIUtility.CreateAndSelectGameObject("NavMesh Modifier Volume", parent);
  123. go.AddComponent<NavMeshModifierVolume>();
  124. var view = SceneView.lastActiveSceneView;
  125. if (view != null)
  126. view.MoveToView(go.transform);
  127. }
  128. }
  129. }