using System; using Unity.Netcode; using UnityEngine; using Unity.Netcode.Components; namespace LobbyRelaySample.ngo { /// /// Rather than track movement data for every symbol object, the symbols will all be parented under one container that will move. /// It will not begin that movement until it both has been Spawned on the network and it has been informed that the game has started. /// [RequireComponent(typeof(NetworkTransform))] public class SymbolContainer : NetworkBehaviour, IReceiveMessages { [SerializeField] private float m_speed = 1; private bool m_isConnected = false; private bool m_hasGameStarted = false; /// /// Verify both that the game has started and that the network connection is working before moving the symbols. /// private void OnGameStarted() { m_hasGameStarted = true; if (m_isConnected) BeginMotion(); } public void Awake() // If there's just one player, Start would occur after the GameBeginning message is sent, so use Awake/OnEnable instead. { Locator.Get.Messenger.Subscribe(this); } public void Start() { if (!IsHost) { this.enabled = false; // Just disabling this script, not the whole GameObject. return; } GetComponent().Spawn(); } public override void OnNetworkSpawn() { if (IsHost) { m_isConnected = true; transform.position = Vector3.up * 10; } } void Update() { if (!IsHost) return; if (!m_hasGameStarted) return; BeginMotion(); } private void BeginMotion() { transform.position += Time.deltaTime * m_speed*Vector3.down; } public void OnReceiveMessage(MessageType type, object msg) { if (type == MessageType.InstructionsShown) { Locator.Get.Messenger.Unsubscribe(this); OnGameStarted(); } } } }