diff --git a/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs b/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs index 47b98591..12c6f874 100644 --- a/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs +++ b/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs @@ -4,8 +4,8 @@ using UnityEditor.IMGUI.Controls; using UnityEditor.SceneManagement; using UnityEditorInternal; -using UnityEngine.AI; using UnityEngine; +using UnityEngine.AI; namespace UnityEditor.AI { @@ -25,6 +25,7 @@ class NavMeshSurfaceEditor : Editor SerializedProperty m_TileSize; SerializedProperty m_UseGeometry; SerializedProperty m_VoxelSize; + SerializedProperty m_NavMeshData; class Styles { @@ -77,6 +78,7 @@ void OnEnable() m_TileSize = serializedObject.FindProperty("m_TileSize"); m_UseGeometry = serializedObject.FindProperty("m_UseGeometry"); m_VoxelSize = serializedObject.FindProperty("m_VoxelSize"); + m_NavMeshData = serializedObject.FindProperty("m_NavMeshData"); NavMeshVisualizationSettings.showNavigation++; } @@ -108,7 +110,7 @@ static void CreateNavMeshAsset(NavMeshSurface surface) AssetDatabase.CreateAsset(surface.navMeshData, combinedAssetPath); } - static NavMeshData GetNavMeshAssetToDelete(NavMeshSurface navSurface) + static NavMeshData GetExistingNavMeshAsset(NavMeshSurface navSurface) { var prefabType = PrefabUtility.GetPrefabType(navSurface); if (prefabType == PrefabType.PrefabInstance || prefabType == PrefabType.DisconnectedPrefabInstance) @@ -123,7 +125,7 @@ static NavMeshData GetNavMeshAssetToDelete(NavMeshSurface navSurface) void ClearSurface(NavMeshSurface navSurface) { - var assetToDelete = GetNavMeshAssetToDelete(navSurface); + var assetToDelete = GetExistingNavMeshAsset(navSurface); navSurface.RemoveData(); navSurface.navMeshData = null; EditorUtility.SetDirty(navSurface); @@ -142,6 +144,11 @@ public override void OnInspectorGUI() serializedObject.Update(); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.ObjectField(m_NavMeshData); + } + var bs = NavMesh.GetSettingsByID(m_AgentTypeID.intValue); if (bs.agentTypeID != -1) @@ -236,6 +243,7 @@ public override void OnInspectorGUI() } EditorGUILayout.Space(); + EditorGUI.indentLevel--; } @@ -351,6 +359,11 @@ static NavMeshData InitializeBakeData(NavMeshSurface surface) , surface.transform.position, surface.transform.rotation); } + static void ReplaceData(NavMeshData to, NavMeshData from) + { + EditorUtility.CopySerializedIfDifferent(from, to); + } + static void UpdateAsyncBuildOperations() { foreach (var oper in s_BakeOperations) @@ -361,15 +374,21 @@ static void UpdateAsyncBuildOperations() if (oper.bakeOperation.isDone) { var surface = oper.surface; - var delete = GetNavMeshAssetToDelete(surface); - if (delete != null) - AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(delete)); - surface.RemoveData(); - surface.navMeshData = oper.bakeData; + + var existing = GetExistingNavMeshAsset(surface); + if (existing != null) + { + ReplaceData(existing, oper.bakeData); + } + else + { + surface.navMeshData = oper.bakeData; + CreateNavMeshAsset(surface); + } if (surface.isActiveAndEnabled) surface.AddData(); - CreateNavMeshAsset(surface); + EditorSceneManager.MarkSceneDirty(surface.gameObject.scene); } }