Files
AsanoRema ffa1064063 Squashed commit of the following:
commit 428243f4a6
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Sat Aug 29 13:43:13 2026 +0300

    Squashed commit of the following:

    commit 68e78fa464
    Author: AsanoRema <asanorema2036@gmail.com>
    Date:   Sat Aug 29 13:41:49 2026 +0300

        Updated .gitignore

commit 9f87122a34
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Sat Aug 29 13:34:57 2026 +0300

    Added Dohya

commit f6a7547e84
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Fri Aug 21 17:59:13 2026 +0300

    Fixed

commit b98901c366
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Tue Aug 18 17:37:22 2026 +0300

    Added new particle Package

commit bb2f4a3b16
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Tue Aug 18 17:17:48 2026 +0300

    Map mehanic ready to multiplayer

commit c01ff800f6
Author: AsanoRema <asanorema2036@gmail.com>
Date:   Tue Aug 18 16:16:19 2026 +0300

    Squashed commit of the following:

    commit 173bbb165c
    Author: henjkey <henjkey@gmail.com>
    Date:   Fri Aug 14 18:51:23 2026 +0500

        Mappp

    commit d559ab338a
    Author: henjkey <henjkey@gmail.com>
    Date:   Thu Aug 13 18:42:41 2026 +0500

        Map

        Controller
        Coordinates
        Target System
        Crosshair System
        Radar System
2026-08-29 13:45:55 +03:00

80 lines
2.1 KiB
C#

using System;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
[DisallowMultipleComponent]
[RequireComponent(typeof(NetworkObject))]
public sealed class NetworkBaseHealth : NetworkBehaviour
{
[SerializeField, Min(1)] private int maximumHealth = 10;
[SerializeField] private UnityEvent<int> healthChanged;
[SerializeField] private UnityEvent depleted;
private readonly NetworkVariable<int> currentHealth = new(
0,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
public int MaximumHealth => Mathf.Max(1, maximumHealth);
public int CurrentHealth => currentHealth.Value;
public bool IsDepleted => CurrentHealth <= 0;
public event Action<int> Changed;
public event Action Depleted;
private void OnValidate() => maximumHealth = Mathf.Max(1, maximumHealth);
public override void OnNetworkSpawn()
{
currentHealth.OnValueChanged += HandleHealthChanged;
if (IsServer)
currentHealth.Value = MaximumHealth;
ApplyState(currentHealth.Value, false);
}
public override void OnNetworkDespawn()
{
currentHealth.OnValueChanged -= HandleHealthChanged;
}
public bool ApplyDamage(int amount)
{
if (!IsServer || !IsSpawned || amount <= 0 || IsDepleted)
return false;
currentHealth.Value = Mathf.Max(0, CurrentHealth - amount);
return true;
}
public void ResetHealth()
{
if (IsServer && IsSpawned)
currentHealth.Value = MaximumHealth;
}
[ContextMenu("Debug/Apply One Damage (Server Play Mode)")]
private void ApplyDebugDamage()
{
if (Application.isPlaying)
ApplyDamage(1);
}
private void HandleHealthChanged(int previous, int current) =>
ApplyState(current, previous > 0 && current <= 0);
private void ApplyState(int health, bool becameDepleted)
{
Changed?.Invoke(health);
healthChanged?.Invoke(health);
if (!becameDepleted)
return;
Depleted?.Invoke();
depleted?.Invoke();
}
}