# Equals

> Determines whether two NavWorld handles refer to the same underlying NavMesh world.

## Definition

* **Type:** Method
* **Namespace:** [Unity.AI.Navigation.LowLevel](/engine/6000.5/script-reference/unity/ai/navigation/lowlevel.md)
* **Assembly:** UnityEngine.AIModule

## Equals(NavWorld)

Determines whether two NavWorld handles refer to the same underlying NavMesh world.

```csharp
public readonly bool Equals(NavWorld other)
```

### Parameters

**** (\[NavWorld]\(/engine/6000.5/script-reference/unity/ai/navigation/lowlevel/navworld)): The NavWorld handle to compare this one with.

### Returns

| Type                                                          | Description                                                                                          |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [bool](https://learn.microsoft.com/dotnet/api/system.boolean) | `true` if the two NavWorld values refer to the same underlying NavMesh world, and `false` otherwise. |

### Remarks

The comparison checks whether both NavWorld values point to the same internal navigation system. A NavWorld obtained from a previous [NavWorld.GetDefaultWorld](/engine/6000.5/script-reference/unity/ai/navigation/lowlevel/navworld/getdefaultworld.md) call isn't equal to one obtained after a [NavMesh.RemoveAllNavMeshData](/engine/6000.5/script-reference/unityengine/ai/navmesh/removeallnavmeshdata.md) call, because the underlying world has been destroyed and re-created.

### Examples

```csharp
using UnityEngine;
using UnityEngine.AI;
using Unity.AI.Navigation.LowLevel;

public class NavWorldEqualityExample : MonoBehaviour
{
    NavWorld m_World;
    int m_CachedWorldHash;

    void OnEnable()
    {
        m_World = NavWorld.GetDefaultWorld();
        m_CachedWorldHash = m_World.GetHashCode();
        Debug.Log($"Cached the NavMesh world hash {m_CachedWorldHash}");
        CompareNavigationWorldToPrevious();

        // Destroying all the data makes every existing handle to the old world invalid.
        NavMesh.RemoveAllNavMeshData();
        Debug.Log($"Removed all NavMesh data.");

        //m_CachedWorldHash = m_World.GetHashCode();
        //Debug.Log($"Cached the NavMesh world, hash {m_CachedWorldHash}");
        CompareNavigationWorldToPrevious();
    }

    public void CompareNavigationWorldToPrevious()
    {
        NavWorld currentWorld = NavWorld.GetDefaultWorld();

        // Equals, == and != compare the underlying navigation system rather than the struct
        // copy, so two handles obtained from the same world always compare equal.
        if (currentWorld == m_World)
        {
            Debug.Log($"The navigation world is the same as before.");

            // The handles are interchangeable, so keep one and release the duplicate.
            currentWorld.Dispose();
            return;
        }

        Debug.Log($"The world was re-created: hash {m_CachedWorldHash} became {currentWorld.GetHashCode()}");

        // Release the stale handle before replacing it, otherwise its safety handle leaks.
        m_World.Dispose();
        m_World = currentWorld;
        m_CachedWorldHash = m_World.GetHashCode();
    }

    void OnDisable()
    {
        m_World.Dispose();
    }
}
```

## Equals(Object)

Determines whether two NavWorld handles refer to the same underlying NavMesh world.

```csharp
public override readonly bool Equals(object obj)
```

### Parameters

**** (\[Object]\(https\://learn.microsoft.com/dotnet/api/system.object)): An object to interpret as a NavWorld and to compare this one with.

### Returns

| Type                                                          | Description                                                                                          |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [bool](https://learn.microsoft.com/dotnet/api/system.boolean) | `true` if the two NavWorld values refer to the same underlying NavMesh world, and `false` otherwise. |

### Remarks

The comparison checks whether both NavWorld values point to the same internal navigation system. A NavWorld obtained from a previous [NavWorld.GetDefaultWorld](/engine/6000.5/script-reference/unity/ai/navigation/lowlevel/navworld/getdefaultworld.md) call isn't equal to one obtained after a [NavMesh.RemoveAllNavMeshData](/engine/6000.5/script-reference/unityengine/ai/navmesh/removeallnavmeshdata.md) call, because the underlying world has been destroyed and re-created.

### Examples

```csharp
using UnityEngine;
using UnityEngine.AI;
using Unity.AI.Navigation.LowLevel;

public class NavWorldEqualityExample : MonoBehaviour
{
    NavWorld m_World;
    int m_CachedWorldHash;

    void OnEnable()
    {
        m_World = NavWorld.GetDefaultWorld();
        m_CachedWorldHash = m_World.GetHashCode();
        Debug.Log($"Cached the NavMesh world hash {m_CachedWorldHash}");
        CompareNavigationWorldToPrevious();

        // Destroying all the data makes every existing handle to the old world invalid.
        NavMesh.RemoveAllNavMeshData();
        Debug.Log($"Removed all NavMesh data.");

        //m_CachedWorldHash = m_World.GetHashCode();
        //Debug.Log($"Cached the NavMesh world, hash {m_CachedWorldHash}");
        CompareNavigationWorldToPrevious();
    }

    public void CompareNavigationWorldToPrevious()
    {
        NavWorld currentWorld = NavWorld.GetDefaultWorld();

        // Equals, == and != compare the underlying navigation system rather than the struct
        // copy, so two handles obtained from the same world always compare equal.
        if (currentWorld == m_World)
        {
            Debug.Log($"The navigation world is the same as before.");

            // The handles are interchangeable, so keep one and release the duplicate.
            currentWorld.Dispose();
            return;
        }

        Debug.Log($"The world was re-created: hash {m_CachedWorldHash} became {currentWorld.GetHashCode()}");

        // Release the stale handle before replacing it, otherwise its safety handle leaks.
        m_World.Dispose();
        m_World = currentWorld;
        m_CachedWorldHash = m_World.GetHashCode();
    }

    void OnDisable()
    {
        m_World.Dispose();
    }
}
```
