Some extra scripts that are part of the Network Playground that you may find useful:
A simple spawn script that Instantiates the Networked Player on a Keypress
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);
}
}
}
Simple Input to get your Game Objects Moving
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);
}
}
An Event System you put on the Prefab with coherenceSync
that can handle Network Commands and transfer Authority
using Coherence;
using UnityEngine;
using UnityEngine.Events;
using Coherence.Toolkit;
public class CoherenceCommandHandler : MonoBehaviour
{
private CoherenceSync sync;
public UnityEvent onCommandReceived;
private GameObject fxInstance;
private void Awake()
{
sync = GetComponent<CoherenceSync>();
}
public void Adopt()
{
if (!sync || sync.HasStateAuthority)
{
return;
}
sync.RequestAuthority(AuthorityType.Full);
}
public void Orphan()
{
if (!sync || !sync.HasStateAuthority)
{
return;
}
sync.AbandonAuthority();
}
public void ToggleAuthority()
{
if (!sync)
{
return;
}
if (sync.HasStateAuthority)
{
Orphan();
}
else
{
Adopt();
}
}
public void Command(CoherenceSync sender)
{
sync.SendCommand<CoherenceCommandHandler>(nameof(CoherenceCommandHandler.ReceiveCommand), MessageTarget.All);
}
public void ReceiveCommand()
{
onCommandReceived.Invoke();
}
public void InstantiateFX(GameObject fx)
{
if (fxInstance)
{
Destroy(fxInstance);
}
var t = fx.transform;
fxInstance = Instantiate(fx, transform.position + t.position, transform.rotation);
}
}
An Event System you put on an empty game object in your
scene that handles Global Connection/Disconnection
using UnityEngine;
using UnityEngine.Events;
using Coherence.Connection;
using Coherence.Toolkit;
public class CoherenceConnectionEvents : MonoBehaviour
{
public UnityEvent onConnect;
public UnityEvent onDisconnect;
private CoherenceMonoBridge monoBridge;
private void OnEnable()
{
monoBridge = FindObjectOfType<CoherenceMonoBridge>();
monoBridge.onConnected.AddListener(HandleConnected);
monoBridge.OnLiveQuerySynced += HandleLiveQuerySynced;
monoBridge.onDisconnected.AddListener(HandleDisconnected);
}
private void OnDisable()
{
monoBridge.onConnected.RemoveListener(HandleConnected);
monoBridge.onDisconnected.RemoveListener(HandleDisconnected);
}
private void HandleConnected(CoherenceMonoBridge _)
{
onConnect?.Invoke();
}
private void HandleLiveQuerySynced(CoherenceMonoBridge _)
{
onConnect?.Invoke();
}
private void HandleDisconnected(CoherenceMonoBridge _, ConnectionCloseReason __)
{
onDisconnect?.Invoke();
}
}