/* This file is part of the "NavMesh Extension" project by Rebound Games. * You are only allowed to use these resources if you've bought them directly or indirectly * from Rebound Games. You shall not license, sublicense, sell, resell, transfer, assign, * distribute or otherwise make available to any third party the Service or the Content. */ using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; namespace NavMeshExtension { /// /// Adds a new Portal Manager gameobject to the scene. /// [CustomEditor(typeof(NavMeshManager))] public class NavMeshManagerEditor : Editor { //manager reference private NavMeshManager script; void OnEnable() { script = (NavMeshManager)target; } /// /// Custom inspector override for buttons. /// public override void OnInspectorGUI() { DrawDefaultInspector(); EditorGUIUtility.LookLikeControls(); EditorGUILayout.Space(); if (GUILayout.Button("New NavMesh")) { CreateNewNavMesh(); GetSceneView().Focus(); } if (GUILayout.Button("Toggle Renderers")) { //invert boolean and toggle all renderers script.rendererToggle = !script.rendererToggle; MeshRenderer[] renderers = script.GetComponentsInChildren(true); for (int i = 0; i < renderers.Length; i++) renderers[i].enabled = script.rendererToggle; } if (GUILayout.Button("Bake NavMesh")) { BakeNavMesh(); } if (GUILayout.Button("CreateAllMesh")) { var navMeshObjs = script.GetComponentsInChildren(); foreach (var navMeshObj in navMeshObjs) { navMeshObj.CreateMeshFromPoints(); } //BakeNavMesh(); } } /// /// Creates a new gameobject to use it as NavMeshObject. /// public void CreateNewNavMesh() { //create gameobject GameObject navGO = new GameObject("New NavMesh"); navGO.transform.parent = script.transform; navGO.isStatic = true; navGO.AddComponent(); //modify renderer to ignore shadows MeshRenderer mRenderer = navGO.GetComponent(); mRenderer.castShadows = false; mRenderer.receiveShadows = false; if (script.meshMaterial) mRenderer.sharedMaterial = script.meshMaterial; else mRenderer.enabled = false; Undo.RegisterCreatedObjectUndo(navGO, "Created NavMesh"); Selection.activeGameObject = navGO; } /// /// Bakes the Unity NavMesh on created NavMeshObjects. /// public void BakeNavMesh() { //loop over renderers and enable them for the baking process, //as otherwise the NavMeshBuilder will ignore them List disabledObjects = new List(); foreach (Renderer item in Object.FindObjectsOfType(typeof(Renderer))) { if (GameObjectUtility.AreStaticEditorFlagsSet(item.gameObject, StaticEditorFlags.NavigationStatic) && !item.enabled) { disabledObjects.Add(item); item.GetComponent().enabled = true; } } //trigger navmesh builder UnityEditor.AI.NavMeshBuilder.BuildNavMesh(); //re-enable disabled renderers disabledObjects.ForEach(obj => obj.enabled = false); ShowNotification("NavMesh successfully built."); } /// /// Shows a SceneView notification. /// public static void ShowNotification(string text) { GetSceneView().ShowNotification(new GUIContent(text)); } /// /// Gets the active SceneView or creates one. /// public static SceneView GetSceneView() { SceneView view = SceneView.currentDrawingSceneView; if (view == null) view = EditorWindow.GetWindow(); return view; } } }