diff --git a/Assets/Examples/Editor/NavMeshPrefabInstanceEditor.cs b/Assets/Examples/Editor/NavMeshPrefabInstanceEditor.cs index 60b31d39b4364fa1ed07a79792e3c49733942718..12d320d70766f969d85f9a847b5234f8e83cda49 100644 --- a/Assets/Examples/Editor/NavMeshPrefabInstanceEditor.cs +++ b/Assets/Examples/Editor/NavMeshPrefabInstanceEditor.cs @@ -45,7 +45,7 @@ void OnInspectorGUIPrefab(GameObject go) { if (GUILayout.Button("Select the Prefab asset to bake or clear the navmesh", EditorStyles.helpBox)) { - Selection.activeObject = PrefabUtility.GetPrefabParent(go); + Selection.activeObject = PrefabUtility.GetCorrespondingObjectFromSource(go); EditorGUIUtility.PingObject(Selection.activeObject); } } @@ -71,7 +71,7 @@ NavMeshData Build(NavMeshPrefabInstance instance) var sources = new List(); var markups = new List(); - NavMeshBuilder.CollectSources(root, ~0, NavMeshCollectGeometry.RenderMeshes, 0, markups, sources); + NavMeshBuilder.CollectSources(root, ~0, NavMeshCollectGeometry.RenderMeshes, 0, markups, instance.gameObject.scene, sources); var settings = NavMesh.GetSettingsByID(0); var bounds = new Bounds(Vector3.zero, 1000.0f * Vector3.one); var navmesh = NavMeshBuilder.BuildNavMeshData(settings, sources, bounds, root.position, root.rotation); diff --git a/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs b/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs index 395273febcccfa4aa46c0072271eb3db6fb5f670..b0104fef7860d1a5c53a9d874ac00163765d00c7 100644 --- a/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs +++ b/Assets/NavMeshComponents/Editor/NavMeshSurfaceEditor.cs @@ -110,11 +110,10 @@ static void CreateNavMeshAsset(NavMeshSurface surface) static NavMeshData GetNavMeshAssetToDelete(NavMeshSurface navSurface) { - var prefabType = PrefabUtility.GetPrefabType(navSurface); - if (prefabType == PrefabType.PrefabInstance || prefabType == PrefabType.DisconnectedPrefabInstance) + if (PrefabUtility.IsPartOfPrefabInstance(navSurface) && !PrefabUtility.IsPartOfModelPrefab(navSurface)) { // Don't allow deleting the asset belonging to the prefab parent - var parentSurface = PrefabUtility.GetPrefabParent(navSurface) as NavMeshSurface; + var parentSurface = PrefabUtility.GetCorrespondingObjectFromSource(navSurface) as NavMeshSurface; if (parentSurface && navSurface.navMeshData == parentSurface.navMeshData) return null; } diff --git a/Assets/NavMeshComponents/Scripts/NavMeshSurface.cs b/Assets/NavMeshComponents/Scripts/NavMeshSurface.cs index 66377b03ce0661f349d1cc03c89d21c76fe448de..2e8e0a390b12a120d3e30e352065e2ce0272faf9 100644 --- a/Assets/NavMeshComponents/Scripts/NavMeshSurface.cs +++ b/Assets/NavMeshComponents/Scripts/NavMeshSurface.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using UnityEditor; +using UnityEditor.SceneManagement; namespace UnityEngine.AI { @@ -252,6 +254,7 @@ List CollectSources() modifiers = NavMeshModifier.activeModifiers; } + var scene = gameObject.scene; foreach (var m in modifiers) { if ((m_LayerMask & (1 << m.gameObject.layer)) == 0) @@ -268,17 +271,17 @@ List CollectSources() if (m_CollectObjects == CollectObjects.All) { - NavMeshBuilder.CollectSources(null, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); + NavMeshBuilder.CollectSources(null, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, scene, sources); } else if (m_CollectObjects == CollectObjects.Children) { - NavMeshBuilder.CollectSources(transform, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); + NavMeshBuilder.CollectSources(transform, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, scene, sources); } else if (m_CollectObjects == CollectObjects.Volume) { Matrix4x4 localToWorld = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); var worldBounds = GetWorldBounds(localToWorld, new Bounds(m_Center, m_Size)); - NavMeshBuilder.CollectSources(worldBounds, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); + NavMeshBuilder.CollectSources(worldBounds, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, scene, sources); } if (m_IgnoreNavMeshAgent) @@ -368,8 +371,9 @@ bool UnshareNavMeshAsset() return false; // Prefab parent owns the asset reference - var prefabType = UnityEditor.PrefabUtility.GetPrefabType(this); - if (prefabType == UnityEditor.PrefabType.Prefab) + var isInPreviewScene = EditorSceneManager.IsPreviewSceneObject(this); + var isPersistentObject = EditorUtility.IsPersistent(this); + if (isInPreviewScene || isPersistentObject) return false; // An instance can share asset reference only with its prefab parent