63 lines
1.7 KiB
C#
63 lines
1.7 KiB
C#
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
namespace Northbound
|
|
{
|
|
public abstract class TeamMemberNetworkBehaviour : NetworkBehaviour, ITeamMember
|
|
{
|
|
[SerializeField] protected TeamType initialTeam = TeamType.Player;
|
|
|
|
protected NetworkVariable<TeamType> _team = new NetworkVariable<TeamType>(
|
|
TeamType.Neutral,
|
|
NetworkVariableReadPermission.Everyone,
|
|
NetworkVariableWritePermission.Server
|
|
);
|
|
|
|
public event System.Action<TeamType> 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($"<color=cyan>[{GetType().Name}] {gameObject.name} team changed: {TeamManager.GetTeamName(previousTeam)} → {TeamManager.GetTeamName(team)}</color>");
|
|
}
|
|
|
|
protected virtual void OnTeamValueChanged(TeamType previousValue, TeamType newValue)
|
|
{
|
|
OnTeamChanged?.Invoke(newValue);
|
|
UpdateTeamVisuals();
|
|
}
|
|
|
|
protected virtual void UpdateTeamVisuals()
|
|
{
|
|
}
|
|
}
|
|
}
|