# Helper Scripts

Some extra scripts that are part of the Network Playground that may be useful

{% tabs %}
{% tab title="Simple Spawn" %}

```
A simple spawn script that Instatiates the Networked Player on a Keypress
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnCharacter: MonoBehaviour
{
    public KeyCode KeyPress;
    public GameObject NetworkedCharacter;
    
    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyPress))
        {
            Instantiate(NetworkedCharacter);    
        }
    }
}
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Simple Input" %}

```
Simple Input to get your Game Objects Moving 
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        transform.position += transform.forward * (v * speed * Time.deltaTime);
        transform.position += transform.right * (h * speed * Time.deltaTime);
    }
}

```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Coherence Handler" %}

```
An Event System you put on the Prefab with 
coherenceSync
that handles Network Events and Commands
```

{% endtab %}

{% tab title="C#" %}

```csharp
using UnityEngine;
using UnityEngine.Events;
using Coherence.Toolkit;

public class CoherenceHandler : MonoBehaviour
{
    private CoherenceSync sync;

    public UnityEvent onAuthorityGained;
    public UnityEvent onAuthorityLost;
    public UnityEvent onCommandReceived;
    public UnityEvent onEventReceived;

    private GameObject fxInstance;

    private void Awake()
    {
        sync = GetComponent<CoherenceSync>();
    }

    public void Adopt()
    {
        if (!sync || sync.isSimulated)
        {
            return;
        }

        sync.RequestAuthority();
    }

    public void Command(CoherenceSync sender)
    {
        sync.SendCommand(sender, "CoherenceHandler.ReceiveCommand");

        ReceiveCommand(); // reproduce locally
    }

    public void SendEvent()
    {
        foreach (var s in CoherenceSync.instances.Values)
        {
            if (!s || s == sync)
            {
                continue;
            }

            s.SendCommand(sync, "CoherenceHandler.ReceiveEvent");
            s.SendMessage("ReceiveEvent", SendMessageOptions.DontRequireReceiver); // reproduce locally
        }
    }

    public void ReceiveCommand()
    {
        onCommandReceived.Invoke();
    }

    public void ReceiveEvent()
    {
        onEventReceived.Invoke();
    }

    public void OnAuthorityTransfer(bool gained)
    {
        if (gained)
        {
            onAuthorityGained.Invoke();
        }
        else
        {
            onAuthorityLost.Invoke();
        }
    }

    public void InstantiateFX(GameObject fx)
    {
        if (fxInstance)
        {
            Destroy(fxInstance);
        }

        var t = fx.transform;
        fxInstance = Instantiate(fx, transform.position + t.position, transform.rotation);
    }
}

```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Coherence Connection Events" %}

```
An Event System you put on an empty game object in your 
scene that handles Global Connection/Disconnection
```

{% endtab %}

{% tab title="C#" %}

```csharp
using UnityEngine;
using UnityEngine.Events;
using Coherence;

public class CoherenceConnectionEvents : MonoBehaviour
{
    public UnityEvent onConnect;
    public UnityEvent onDisconnect;

    private void OnEnable()
    {
        Coherence.Network.OnConnected += OnConnect;
        Coherence.Network.OnDisconnected += OnDisconnect;
    }

    private void OnDisable()
    {
        Coherence.Network.OnConnected -= OnConnect;
        Coherence.Network.OnDisconnected -= OnDisconnect;
    }

    private void OnConnect()
    {
        onConnect.Invoke();
    }

    private void OnDisconnect()
    {
        onDisconnect.Invoke();
    }
}

```

{% endtab %}
{% endtabs %}
