using UnityEngine; using Unity.Netcode; using TMPro; public class PlayerHealth : NetworkBehaviour { [SerializeField] private int maxHealth = 100; [SerializeField] private TMP_Text healthText; public NetworkVariable currentHealth = new NetworkVariable( 100, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server ); public NetworkVariable isDead = new NetworkVariable(false); public override void OnNetworkSpawn() { currentHealth.OnValueChanged += OnHealthChanged; if (IsServer) { currentHealth.Value = maxHealth; RoundManager.Current?.RegisterPlayer(OwnerClientId); } healthText.text = $"Health: {maxHealth}"; } private void OnHealthChanged(int _previousValue, int _newValue) { Debug.Log($"Health changed from {_previousValue} to {_newValue}"); healthText.text = $"Health: {_newValue}"; } public void TakeDamage(int _damageAmount) { if (!IsServer) return; if(isDead.Value) return; if (RoundManager.Current == null || !RoundManager.Current.IsRoundActive) return; currentHealth.Value = Mathf.Max(0, currentHealth.Value - _damageAmount); if (currentHealth.Value <= 0) { Die(); } } private void Die() { if(!IsServer) return; isDead.Value = true; OnDiedClientRpc(); // RoundManager.Current?.OnPlayerDied(this); } [ClientRpc] private void OnDiedClientRpc() { Debug.Log($"Player {OwnerClientId} died"); SetPhysicsAndVisualsActive(false); } public override void OnNetworkDespawn() { currentHealth.OnValueChanged -= OnHealthChanged; } public void Respawn(Vector3 _spawnPosition) { if(!IsServer) return; isDead.Value = false; currentHealth.Value = maxHealth; RespawnClientRpc(_spawnPosition); } [ClientRpc] private void RespawnClientRpc(Vector3 _spawnPosition) { SetPhysicsAndVisualsActive(true); transform.position = _spawnPosition; } private void SetPhysicsAndVisualsActive(bool _isActive) { foreach (Collider collider in GetComponentsInChildren()) collider.enabled = _isActive; foreach (MeshRenderer meshRenderer in GetComponentsInChildren()) meshRenderer.enabled = _isActive; GetComponent().isKinematic = !_isActive; } }