# Client vs Simulator logic

### Am I a Simulator ?

Ask `Coherence.SimulatorUtility.IsSimulator`.

```csharp
using Coherence;
using UnityEngine;

public class SimualatorClass : MonoBehaviour
{
    public void Awake()
    {
        if (SimulatorUtility.IsSimulator)
        {
            // I'm a simulator!
        }
    }
}
```

There are two ways you can tell **coherence** if the game build should behave as a Simulator:

* `COHERENCE_SIMULATOR` preprocessor define.
* `--coherence-simulation-server` command-line argument.

#### `Connect` and `ConnectionType`

The `Connect` method on `Coherence.Network` accepts a `ConnectionType` parameter.

```csharp
using Coherence;
using Coherence.Common;
using Coherence.Connection;
using Coherence.Toolkit;
using UnityEngine;

public class ConnectAsSimulator : MonoBehaviour
{
    void Start()
    {
        var endpoint = new EndpointData
        {
            region = EndpointData.LocalRegion,
            host = "127.0.0.1",
            port = 32001,
            schemaId = RuntimeSettings.instance.SchemaID,
        };

        var monoBridge = FindObjectOfType<CoherenceMonoBridge>();
        monoBridge.Connect(endpoint, ConnectionType.Simulator);
    }
}
```

#### **COHERENCE\_SIMULATOR**

```csharp
#if COHERENCE_SIMULATOR

// simulator-specific code

#endif
```

Whenever the project compiles with the `COHERENCE_SIMULATOR` preprocessor define, **coherence** understands that the game will act as a Simulator.

![The custom build pipeline lets us define preprocessor defines like COHERENCE\_SIMULATOR](https://3798176112-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZcBSvjNQZSas5L9C0K8K%2Fuploads%2F70Ov3Q5trXB5McS7Cama%2Fimage.png?alt=media)

#### **Command-line argument**

Launching the game with `--coherence-simulation-server` will let **coherence** know that the loaded instance must act as a Simulator.

{% hint style="info" %}
You can supply **additional parameters** to a Simulator that define its area of responsibility, e.g. a sector/quadrant to simulate Entities in and take authority over Entities wandering into it.

You can also build a special Simulator for AI, physics, etc.
{% endhint %}

### Server-side simulation

You can define who simulates the object in the **CoherenceSync** inspector.

![](https://3798176112-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZcBSvjNQZSas5L9C0K8K%2Fuploads%2FQwUumRzmn8wETOV9FHIS%2Fsimtype.png?alt=media)

### **Auto-reconnect**

The [sample UI](https://docs.coherence.io/0.9/api-reference/network-sdk/sample-ui) provided includes auto-reconnect behaviour out of the box for Room- and World-based simulators. The root GameObject has AutoReconnect components attached to it.

![AutoReconnect in the sample UI](https://3798176112-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZcBSvjNQZSas5L9C0K8K%2Fuploads%2FVsNtnwf9Bnmbb0YuNCmJ%2Fautoreconnect.png?alt=media)

{% hint style="info" %}
Multi-Room Simulators have their own per-scene reconnect logic. The AutoReconnect components should not be enabled when working with Multi-Room Simulators.
{% endhint %}

{% hint style="info" %}
If the Simulator is invoked with the `--coherence-play-region` parameter, AutoReconnect will try to reconnect to the Server located in that region.
{% endhint %}
