# Prefab setup

In this section, we will learn how to prepare a Prefab for network replication.

## Video tutorial

Setting up basic syncing is explained in this video, from 1:00 and onwards:

{% embed url="<https://youtu.be/kyUSiBpZ2Bc?t=63>" %}

## Using the coherence Hub

You can let the c*oherence Hub* guide you through your Prefab setup process. Simply select a Prefab, open the *GameObject* tab in the coherence Hub (coherence > coherence Hub) and follow the instructions.

<figure><img src="/files/wbdx4KVwbySB4zIitgmL" alt="" width="563"><figcaption></figcaption></figure>

## Step by step

You can also follow the detailed step-by-step text guide below.

### **1.** Add `CoherenceSync` to your GameObject

For a Unity GameObject to be networked through **coherence**, it needs to have a `CoherenceSync` component attached. Currently, only Prefabs are supported. If your GameObject is not a Prefab, `CoherenceSync` can assist you.

First, create a new GameObject. In this example, we're going to create a cube.

<img src="/files/m9igCOlk1iWCpJZKjbRb" alt="" width="563">

Next, we add the `CoherenceSync` component to **Cube**.

<img src="/files/kbtGXSzyVLYBYzAEgfGE" alt="" width="563">

`CoherenceSync` inspector now tells us that we need to make a Prefab out of this GameObject for it to work. We get to choose where to create it:

<img src="/files/3BKNo5ZUjvBgo74NYJVo" alt="" width="563">

### (Optional) Networking an already existing Prefab

If you wish to start networking a Prefab that already exists in your project, you have several options to do it. Remember that they all lead to the same result.

You can:

* Click on the *Sync with coherence* checkbox at the top of the Prefab inspector.

<figure><img src="/files/yuLrWFRYRiIrWIwVo8dY" alt="" width="563"><figcaption></figcaption></figure>

* Manually add the `CoherenceSync` component.

<figure><img src="/files/jfQEejLxxo4lXj0EW9mA" alt="" width="563"><figcaption><p>Networking an existing Prefab</p></figcaption></figure>

* Drag the Prefab to the *CoherenceSync Objects* window. You can find it in *coherence > CoherenceSync Objects*.

<figure><img src="/files/R4kxTSEnBKZlEr1o1vtT" alt=""><figcaption></figcaption></figure>

### **(Optional) Prefab variants**

One way to configure your Prefab instead of just adding `CoherenceSync` to it, is to fork a Prefab variant and add the component there.

In our **Cube** example, instead of adding CoherenceSync to Cube, you can create a **Cube (Networked)** Prefab and add `CoherenceSync` to it:

{% hint style="info" %}
Learn how to create and use Prefab variants in the [Unity Manual](https://docs.unity3d.com/Manual/PrefabVariants.html).
{% endhint %}

This way, you can retain the original Prefab untouched, and build all the network functionality separately, in its own Prefab.

<figure><img src="/files/uXia4iyZ3YJZMGip1E0D" alt=""><figcaption><p>Creating a variant of Cube</p></figcaption></figure>

**Another way** to use Prefab variants to our advantage is to have a base Prefab using `CoherenceSync`, and create Prefab variants off that one with customizations. For example, **Enemy** (base Prefab) and **Enemy 1**, **Enemy 2**, **Enemy 3**... (variant Prefabs, using different models, animations, materials, etc.). In this setup, all of the enemies will share the networking settings stored in `CoherenceSync`, so you don't have to manually update every one of them.

The Prefab variant inherits the network settings from its parent, and you change those with overrides in the *Configuration* window. When a synced variable, method or component action is present in the variant and not in the parent, it will be bolded and it will have the blue line next to it, just like any other override in Unity:

<figure><img src="/files/zw0MLbv60ob0Drb2YYUB" alt="" width="563"><figcaption><p>Prefab variant with a few overriden synced properties</p></figcaption></figure>

### **2. Configure `CoherenceSync`**

The `CoherenceSync` component will help you prepare an object for network synchronization during design time. It also exposes an API that allows us to manipulate the object during runtime.

<figure><img src="/files/JmzMDSGASiSdgmrr6cDv" alt="" width="563"><figcaption><p>CoherenceSync inspector</p></figcaption></figure>

In its Inspector you can configure settings for **Lifetime** (*Session-based* or *Persistent*), **Authority transfer** (*Not Transferable*, *Request* or *Steal*), **Simulate In** (*Client Side*, *Server Side* or *Server Side with Client Input*) and **Adoption** settings for when persistent entities become orphaned, and more.

There are also a host of **Events** that are triggered at different times.

{% hint style="info" %}
Its Inspector has quite a number of settings. For more information on them, refer to [the `CoherenceSync` page](/1.3/manual/components/coherence-sync.md).
{% endhint %}

For now, we can leave these settings to their defaults.

### **2.1 Select variables to replicate**

`CoherenceSync` allows you to **automatically network all public variables** and methods on any of the attached components, from Unity components such as `Transform`, `Animator` , etc. to any custom script, including scripts that came with the Asset Store packages that you may have downloaded.

{% hint style="warning" %}
Make sure the variables you want to network are set to **public**.

**coherence** cannot sync non-public variables.
{% endhint %}

To set it up, click on the *Configure* button in the `CoherenceSync`'s Inspector. This brings up the *Configuration* window. Here you can select which variables you would like to sync across the network:

<figure><img src="/files/G7ul1JJij3pEHeqNpngl" alt="" width="563"><figcaption><p>Configure Window</p></figcaption></figure>

You will notice that **position** is already selected, and can't be removed. For our use case, let's add **rotation** and **scale***.*

{% hint style="info" %}
Note that you can configure variables, methods and components not only on the root, but also [on child GameObjects](/1.3/manual/networking-state-changes/child-gameobjects.md).
{% endhint %}

Close the *Configuration* dialog.

### **3. Add a movement script**

This simple movement script will use WASD or the Arrow keys to move the Prefab around the scene.

Click on *Assets > Create > C# Script*. Name it `Move.cs`. Copy-paste the following content into the file:

{% code title="Move.cs" %}

```csharp
using UnityEngine;

public class Move : MonoBehaviour
{
    public float speed = 1f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
    
        var spf = speed * Time.deltaTime;

        transform.position += transform.forward * (v * spf);
        transform.position += transform.right * (h * spf);
    }
}
```

{% endcode %}

Wait for Unity to compile the file, then add it to the Prefab.

### **4. Disable the component on replicated objects**

We have added a `Move` script to the Prefab. This means that if we just run the scene, we will be able to use the keyboard to move the object around.

But what happens on other Clients, where this object is not authoritative, but replicated? We want the position to be replicated over the network **without keyboard input interfering** with it.

In the *Configuration* window, click the *Components* tab:

<img src="/files/QI2bFUrWcRb0zAn49Wzu" alt="" width="563">

Here you will see a list of Component Actions that you can apply **to non-authoritative entities** that have been spawned by the network.

Selecting *Disable* for your `Move` script will make sure the Component is disabled for network instances of your Prefab:

<img src="/files/m0tIcAgkNgYVVrzSGnC2" alt="" width="563">

This ensures that, if a copy of this Prefab is instantiated on a Client with no authority, this script will be disabled and won't interfere with the position that is being synced on the network.

### 5. Bake the netcode

Once everything is setup, you should ensure to run the process of [Baking](/1.3/manual/baking-and-code-generation.md): coherence will produce the necessary netcode (i.e. a bunch of C# scripts) to ensure that when the game is running and the Client connects, all of the properties and network messages you might have configured will correctly sync.

This process is very quick, and can be done in different ways:

* From the menu item *coherence > Bake*
* Within the coherence Hub, in the *Baking* tab, using **Bake Now**:

<figure><img src="/files/SeUbaQY9S5cPivAL0NL0" alt="" width="563"><figcaption><p>If the Bake Now button has a warning, you need to bake before running the game</p></figcaption></figure>

* When a Prefab contains changes that need baking, its Inspector will warn you. Pressing **Bake** here will actually bake all code for all Prefabs:

<figure><img src="/files/9kcyABXpceU6dUSCqZuk" alt="" width="563"><figcaption></figcaption></figure>

### To recap

In short, setting up a Prefab for networking requires:

* A Prefab with a `CoherenceSync` added to it
  * Optionally, setting some of its properties
* Configuring what to sync in the *Configure* window
* Disabling components on remote entities, in the *Configure > Components* tab
* Baking the netcode

{% hint style="success" %}
This is it! Setting up a Prefab to be networked doesn't require additional steps.

Now you can run this setup [locally](/1.3/getting-started/setup-a-project/local-development.md) or using the [**coherence cloud**](/1.3/hosting/coherence-cloud.md).
{% 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/1.3/getting-started/setup-a-project/prefab-setup.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.
