Files
Learning-UnityNGO/Assets/CONTENT/FEATURES/DEV-TEST/Scripts/PlayerHealth.cs
T

102 lines
2.5 KiB
C#

using UnityEngine;
using Unity.Netcode;
using TMPro;
public class PlayerHealth : NetworkBehaviour
{
[SerializeField] private int maxHealth = 100;
[SerializeField] private TMP_Text healthText;
public NetworkVariable<int> currentHealth = new NetworkVariable<int>(
100,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
public NetworkVariable<bool> isDead = new NetworkVariable<bool>(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>())
collider.enabled = _isActive;
foreach (MeshRenderer meshRenderer in GetComponentsInChildren<MeshRenderer>())
meshRenderer.enabled = _isActive;
GetComponent<Rigidbody>().isKinematic = !_isActive;
}
}