# 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](/files/-MYgJGldGsRlo85C5I-v)

#### **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.

![](/files/-M_LW8y2rn7vcBaXRMKc)

### **Auto-reconnect**

The [sample UI](/0.9/api-reference/network-sdk/sample-ui.md) 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](/files/-M__G8V97h10tp9jlu4_)

{% 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.coherence.io/0.9/simulators/client-vs-simulator-logic.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
