Files
JJBB/Assets/Plugins/NavMeshExtension/Scripts/Editor/NavMeshManagerEditor.cs
2024-08-23 15:49:34 +08:00

146 lines
4.6 KiB
C#

/* 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
{
/// <summary>
/// Adds a new Portal Manager gameobject to the scene.
/// <summary>
[CustomEditor(typeof(NavMeshManager))]
public class NavMeshManagerEditor : Editor
{
//manager reference
private NavMeshManager script;
void OnEnable()
{
script = (NavMeshManager)target;
}
/// <summary>
/// Custom inspector override for buttons.
/// </summary>
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<MeshRenderer>(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<NavMeshObject>();
foreach (var navMeshObj in navMeshObjs)
{
navMeshObj.CreateMeshFromPoints();
}
//BakeNavMesh();
}
}
/// <summary>
/// Creates a new gameobject to use it as NavMeshObject.
/// </summary>
public void CreateNewNavMesh()
{
//create gameobject
GameObject navGO = new GameObject("New NavMesh");
navGO.transform.parent = script.transform;
navGO.isStatic = true;
navGO.AddComponent<NavMeshObject>();
//modify renderer to ignore shadows
MeshRenderer mRenderer = navGO.GetComponent<MeshRenderer>();
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;
}
/// <summary>
/// Bakes the Unity NavMesh on created NavMeshObjects.
/// </summary>
public void BakeNavMesh()
{
//loop over renderers and enable them for the baking process,
//as otherwise the NavMeshBuilder will ignore them
List<Renderer> disabledObjects = new List<Renderer>();
foreach (Renderer item in Object.FindObjectsOfType(typeof(Renderer)))
{
if (GameObjectUtility.AreStaticEditorFlagsSet(item.gameObject, StaticEditorFlags.NavigationStatic)
&& !item.enabled)
{
disabledObjects.Add(item);
item.GetComponent<Renderer>().enabled = true;
}
}
//trigger navmesh builder
UnityEditor.AI.NavMeshBuilder.BuildNavMesh();
//re-enable disabled renderers
disabledObjects.ForEach(obj => obj.enabled = false);
ShowNotification("NavMesh successfully built.");
}
/// <summary>
/// Shows a SceneView notification.
/// </summary>
public static void ShowNotification(string text)
{
GetSceneView().ShowNotification(new GUIContent(text));
}
/// <summary>
/// Gets the active SceneView or creates one.
/// </summary>
public static SceneView GetSceneView()
{
SceneView view = SceneView.currentDrawingSceneView;
if (view == null)
view = EditorWindow.GetWindow<SceneView>();
return view;
}
}
}