# 1. Basic syncing

This scene demonstrates the simplest networking scenario possible with **coherence**. Characters sync their position and rotation, which immediately creates a feeling of presence. Someone else is connected!

### **Key controls**

* **WASD** or **Left stick**: Move character
* Hold **Shift** or **Shoulder button left**: Run
* **Spacebar** or **Joypad button down**: Jump

### Topics covered

[CoherenceSync](https://docs.coherence.io/1.0/coherence-sdk-for-unity/components/coherencesync) | Bindings | Component behaviours | [Authority](https://docs.coherence.io/1.0/coherence-sdk-for-unity/authority-overview)

## In this scene

Upon connecting, the `PlayerHandler` script (attached to the **PlayerHandler** GameObject) creates a new instance of the character Prefab, located in the `/Prefabs/Characters` folder. When disconnecting, the same script destroys the instance created.

Now you can move and jump around, and you will see other characters move too.

<figure><img src="https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2FR8alAnZyhRCiIDTygGkQ%2Fimage_030_0000.png?alt=media" alt=""><figcaption><p>A local player meets a network-instantiated player.</p></figcaption></figure>

**coherence** takes care of keeping all Game Clients in sync regarding network entities. When another Client connects, a new instance of your game character is instantiated in their scene, and an instance of their character is instantiated into yours. We refer to this as **network instantiation**.

{% hint style="info" %}
In addition to instantiating and destroying GameObjects, **coherence** also supports recycling them via **object pooling**. Read more about Object Pool instantiators on [this page](https://docs.coherence.io/1.0/coherence-sdk-for-unity/asset-management). For simplicity, we don't use pooling in this demo.
{% endhint %}

### How it's set up

You can see what is synced over the network by selecting the character Prefab asset, and opening **coherence**'s *Configuration* window (either by clicking on the *Configure* button on the `CoherenceSync` component, or by going to *coherence > GameObject Setup > Configure*).

When this window opens on the *Variables* tab you will notice that, at the very top, `Transform.position` and `Transform.rotation` are checked.

<figure><img src="https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2FLSFVnUqErHkhzW7OOTx0%2FSchermata%202022-12-08%20alle%2015.23.36.png?alt=media" alt=""><figcaption><p>The <em>Variables</em> tab of the <em>Configuration</em> window.</p></figcaption></figure>

This is the data being transferred over the network. Each Client sends the position and rotation of the character that they have authority over to every other connected Client, every time there is a change to it that is significant enough. We call these **bindings**.

Each connected Client receives these values and applies them to the `Transform` component of their own instance of the remote player character.

{% hint style="info" %}
Are you wondering why the position is checked by default? You'll find answers in the [lesson regarding LiveQueries](https://docs.coherence.io/1.0/learning-coherence/first-steps-tutorial/3-spatial-partitioning).
{% endhint %}

To ensure that Clients don't modify the properties of entities they don't have authority over, some components are either disabled or behave differently on the character instances that are non-authoritative.

**coherence** offers a rapid way to make this happen. If you open the *Components* tab of the *Configuration* window, you will see that 3 components are configured to do something special:

<figure><img src="https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2FTMDsTQ57K5v3djpkEwJz%2FSchermata%202022-12-08%20alle%2015.45.59.png?alt=media" alt=""><figcaption><p>The <em>Components</em> tab of the <em>Configuration</em> window.</p></figcaption></figure>

In particular:

* The `PlayerInput` and `KinematicMove` scripts get disabled.
* The `Rigidbody` component is made kinematic.

{% hint style="info" %}
You can learn more about **Component Actions** [here](https://docs.coherence.io/1.0/get-started/prefab-setup#5.-disable-input-on-replicated-object).
{% endhint %}

### Understanding authority

One important concept to get familiar with is the fact that every networked entity exists as a GameObject on every Client currently connected. However, only one of them has what we call **authority** over the network entity, and can control its synced variables.

For instance, if we play this scene with two Clients connected, each one will have 2 player instances in their respective worlds:

<figure><img src="https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2FH5BDwBmmI56XlHlVirHN%2FPerspectives.png?alt=media" alt=""><figcaption><p>A local player character in one Client exists as a remote character on another Client.</p></figcaption></figure>

This is something to keep in mind as you decide which components have to keep running or be disabled on remote instances, in order to not have the same code running unnecessarily on various Clients. This could create a conflict or put the two GameObjects in a very different state, generating unwanted results.

In the Unity Editor, when connected, the name of a GameObject and the icon next to it informs you about its current authority state (see image above).

{% hint style="warning" %}
There are two types of authority in coherence: **State** and **Input**. For the sake of simplicity, in this project we often refer just to a generic "authority", and what we mean is State authority. Go [here](https://docs.coherence.io/1.0/coherence-sdk-for-unity/authority-overview) for more info on authority.
{% endhint %}

If you want to see which entities are currently local and which ones are remote, we included a debug visualisation in the project. Hit the **Tab** key (or click the Joystick) to switch to a view that shows authority. You can keep playing the game while in this view, and see how things change (try the [Physics](https://docs.coherence.io/1.0/learning-coherence/first-steps-tutorial/2-physics-authority-transfer) scene!).

<figure><img src="https://352971571-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOnNWMLfYsbCzCnIbNrcP%2Fuploads%2FScytfb4ZhM5WJlobJPxQ%2FSchermata%202022-12-08%20alle%2015.31.39.png?alt=media" alt=""><figcaption><p>Blue = local, Orange = remote, the rest are non-networked objects.</p></figcaption></figure>
