Client vs. simulator logic

When scripting simulators, we need mechanisms to tell them apart.

Am I a simulator?

Ask Coherence.SimulatorUtility.IsSimulator.

using Coherence;

if (SimulatorUtility.IsSimulator)
{
    // I'm a simulator!
}

There are a few ways you can tell coherence if the instance should behave as a simulator:

  • Specifying a ConnectionType when connecting via Coherence.Network.Connect.

  • COHERENCE_SIMULATOR preprocessor define.

  • --coherence-simulation-server command-line argument.

  • Toggling on Simulator in the sample connection dialog.

Connect and ConnectionType

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

using Network = Coherence.Network;
using ConnectionType = Replication.Client.Unity.Ecs.ConnectionType;

public class ConnectAsSimulator : MonoBehaviour
{
    void Start()
    {
        if (Network.Connect("127.0.0.1:32001", ConnectionType.Simulator))
        {
            // Connection successful
        }
        else 
        {
            // Connection failed
        }
    }
}

COHERENCE_SIMULATOR

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

Command-line argument

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

circle-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.

Server-side simulation

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

circle-info

Automatic simulator adoption of CoherenceSync objects is work in progress and will be available in one of the future releases of coherence.

Auto-reconnect

The sample UI provided includes auto-reconnect behaviour out of the box for simulators. The root GameObject has an AutoReconnect component attached to it.

AutoReconnect in the sample UI
circle-info

If the simulator is invoked with the --coherence-play-region parameter, AutoReconnect will try to reconnect to the server located in that region.

If you need a different solution, take a look at its implementation use plug your own.

Last updated

Was this helpful?