2023-06-05 19:57:17 +08:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
2023-06-29 14:57:11 +08:00
|
|
|
using System.Runtime.Remoting.Contexts;
|
2023-06-05 19:57:17 +08:00
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.Events;
|
|
|
|
namespace BITKit.Entities
|
|
|
|
{
|
|
|
|
public interface IHealthCallback
|
|
|
|
{
|
|
|
|
void OnSetAlive(bool alive);
|
|
|
|
void OnSetHP(int hp);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
public interface IHealth
|
2023-06-05 19:57:17 +08:00
|
|
|
{
|
2023-06-29 14:57:11 +08:00
|
|
|
int HealthPoint { get; set; }
|
|
|
|
bool IsAlive { get; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public class EntityHealth : EntityComponent, IHealth
|
|
|
|
{
|
|
|
|
[Header(Constant.Header.Settings)] [SerializeField]
|
|
|
|
private int healthPoint = 100;
|
|
|
|
|
|
|
|
[Header(Constant.Header.Events)] public UnityEvent<bool> onSetAlive = new();
|
|
|
|
|
|
|
|
[Header(Constant.Header.Providers)] [SerializeField, SerializeReference, SubclassSelector]
|
|
|
|
private IHealthCallback[] additiveCallback;
|
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
[Header(Constant.Header.InternalVariables)]
|
|
|
|
bool isAlive;
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
public int HealthPoint
|
|
|
|
{
|
|
|
|
get => healthPoint;
|
|
|
|
set => OnHealthPointChanged(healthPoint, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IHealth.IsAlive => isAlive;
|
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
public override void OnAwake()
|
|
|
|
{
|
|
|
|
entity.AddListener<DamageMessage>(OnDamage);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
public override void OnStart()
|
|
|
|
{
|
|
|
|
isAlive = healthPoint >= 0;
|
|
|
|
OnSetAlive(isAlive);
|
|
|
|
OnHealthPointChanged(0, healthPoint);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
private void OnHealthPointChanged(int old, int newHP)
|
2023-06-05 19:57:17 +08:00
|
|
|
{
|
2023-06-29 14:57:11 +08:00
|
|
|
healthPoint = newHP;
|
2023-06-05 19:57:17 +08:00
|
|
|
var _isAlive = newHP >= 0;
|
|
|
|
if (_isAlive != isAlive)
|
|
|
|
{
|
|
|
|
OnSetAlive(isAlive = _isAlive);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
//entity.Invoke<int>(_onSetHP, newHP);
|
|
|
|
//entity.Set<int>("HP", newHP);
|
|
|
|
foreach (var x in entity.GetCallbacks<IHealthCallback>())
|
|
|
|
{
|
|
|
|
x.OnSetHP(newHP);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
foreach (var x in additiveCallback)
|
|
|
|
{
|
|
|
|
x.OnSetHP(newHP);
|
|
|
|
}
|
2023-06-05 19:57:17 +08:00
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
private void OnSetAlive(bool alive)
|
2023-06-05 19:57:17 +08:00
|
|
|
{
|
|
|
|
foreach (var x in entity.GetCallbacks<IHealthCallback>())
|
|
|
|
{
|
|
|
|
x.OnSetAlive(alive);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
foreach (var x in additiveCallback)
|
|
|
|
{
|
|
|
|
x.OnSetAlive(alive);
|
|
|
|
}
|
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
//entity.Invoke<bool>(_onSetAlive, alive);
|
|
|
|
//entity.Set<bool>(_isAlive, alive);
|
|
|
|
onSetAlive.Invoke(alive);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
private void AddHP(int hp)
|
2023-06-05 19:57:17 +08:00
|
|
|
{
|
|
|
|
OnHealthPointChanged(healthPoint, healthPoint += hp);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
|
|
|
private void OnDamage(DamageMessage damageMessage)
|
2023-06-05 19:57:17 +08:00
|
|
|
{
|
|
|
|
if (damageMessage.target == entity)
|
|
|
|
AddHP(-damageMessage.damage);
|
|
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
[BIT]
|
|
|
|
public void SetAlive()
|
|
|
|
{
|
|
|
|
BITAppForUnity.ThrowIfNotPlaying();
|
|
|
|
OnHealthPointChanged(-1, 100);
|
|
|
|
}
|
2023-06-29 14:57:11 +08:00
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
[BIT]
|
|
|
|
public void SetDead()
|
|
|
|
{
|
|
|
|
BITAppForUnity.ThrowIfNotPlaying();
|
|
|
|
OnHealthPointChanged(100, -1);
|
|
|
|
}
|
|
|
|
#endif
|
2023-06-29 14:57:11 +08:00
|
|
|
|
2023-06-05 19:57:17 +08:00
|
|
|
}
|
|
|
|
}
|