# Scripting: Client vs Simulator

### Am I a Simulator ?

Ask `Coherence.SimulatorUtility.IsSimulator`.

```csharp
using Coherence;
using UnityEngine;

public class SimulatorClass : 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.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 bridge = FindAnyObjectByType<CoherenceBridge>();
        bridge.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://content.gitbook.com/content/NGFZGdbLA4bzHQXTuDMT/blobs/j8Iw1FCh4YQCJvGugFdM/image.png)

#### **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://content.gitbook.com/content/NGFZGdbLA4bzHQXTuDMT/blobs/rLpYVQHp7KiUPc3jfBF7/simtype.png)

### **Connecting Simulators automatically to RS: AutoSimulatorConnection Component**

**coherence** includes an auto-connect MonoBehaviour out of the box for Room- and World-based Simulators. The Component its called AutoSimulatorConnection.

<figure><img src="https://content.gitbook.com/content/NGFZGdbLA4bzHQXTuDMT/blobs/g5A21Glt1skECNkedPJw/AutoSimConn.png" alt=""><figcaption></figcaption></figure>

When you add the Component, it will parse the connection data passed with [Command-line arguments](https://docs.coherence.io/1.7/manual/simulation-server/simulator-cli-arguments) to connect to the given Replication Server automatically. This will also work for Simulators you upload to the coherence Cloud.

{% hint style="info" %}
Multi-Room Simulators have their own per-scene reconnect logic. The **AutoSimulatorConnection** 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, **AutoSimulatorConnection** will try to reconnect to the Server located in that region.
{% endhint %}
