using Unity.Netcode; using UnityEngine; namespace Northbound { public abstract class TeamMemberNetworkBehaviour : NetworkBehaviour, ITeamMember { [SerializeField] protected TeamType initialTeam = TeamType.Player; protected NetworkVariable _team = new NetworkVariable( TeamType.Neutral, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server ); public event System.Action OnTeamChanged; public override void OnNetworkSpawn() { base.OnNetworkSpawn(); if (IsOwner) { if (_team.Value == TeamType.Neutral) { _team.Value = initialTeam; } } _team.OnValueChanged += OnTeamValueChanged; UpdateTeamVisuals(); } public override void OnNetworkDespawn() { _team.OnValueChanged -= OnTeamValueChanged; base.OnNetworkDespawn(); } public TeamType GetTeam() => _team.Value; public void SetTeam(TeamType team) { if (!IsOwner) return; TeamType previousTeam = _team.Value; _team.Value = team; Debug.Log($"[{GetType().Name}] {gameObject.name} team changed: {TeamManager.GetTeamName(previousTeam)} → {TeamManager.GetTeamName(team)}"); } protected virtual void OnTeamValueChanged(TeamType previousValue, TeamType newValue) { OnTeamChanged?.Invoke(newValue); UpdateTeamVisuals(); } protected virtual void UpdateTeamVisuals() { } } }