using System.Collections.Generic; using UnityEngine; namespace MegaKoop.Game.Networking { [DisallowMultipleComponent] public class NetworkIdentity : MonoBehaviour { private static readonly Dictionary registry = new(); private static int nextId = 1; [SerializeField] private int networkId; [SerializeField] private bool assignOnAwake = true; public int NetworkId => networkId; private void Awake() { if (assignOnAwake && networkId == 0) { networkId = nextId++; } Register(); } private void OnDestroy() { if (registry.TryGetValue(networkId, out NetworkIdentity existing) && existing == this) { registry.Remove(networkId); } } private void Register() { if (networkId == 0) { Debug.LogWarning($"[NetworkIdentity] {name} has no network id and won't be tracked."); return; } if (registry.TryGetValue(networkId, out NetworkIdentity existing) && existing != this) { Debug.LogWarning($"[NetworkIdentity] Duplicate network id {networkId} detected. Overwriting reference."); } registry[networkId] = this; } public static bool TryGet(int id, out NetworkIdentity identity) => registry.TryGetValue(id, out identity); /// /// Allows deterministic assignment so IDs match across clients. /// public void SetNetworkId(int id) { if (id == 0) { Debug.LogWarning("[NetworkIdentity] Cannot assign network id 0."); return; } if (networkId == id) { return; } if (registry.TryGetValue(networkId, out NetworkIdentity existing) && existing == this) { registry.Remove(networkId); } networkId = id; Register(); } } }