mirror of
https://github.com/ryzij/Cube-Tower-Defense.git
synced 2026-07-14 10:06:58 +00:00
89 lines
2.3 KiB
C#
89 lines
2.3 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using System.Collections.Generic;
|
|
|
|
public class Enemy : MonoBehaviour
|
|
{
|
|
[SerializeField] private SandPathBuildService _pathService;
|
|
[SerializeField] private float _health = 5f;
|
|
[SerializeField] private float _speed = 1f;
|
|
[SerializeField] private float _damage = 1f;
|
|
[SerializeField] private int _killReward = 10;
|
|
[SerializeField] private UnityEvent<float> _onHealthChanged;
|
|
[SerializeField] private UnityEvent<OnEnemyDeathEventArgs> _onDeath;
|
|
|
|
private Queue<Vector3> _path;
|
|
private Vector3 _target;
|
|
|
|
public event UnityAction<float> OnHealthChanged
|
|
{
|
|
add => _onHealthChanged.AddListener(value);
|
|
remove => _onHealthChanged.RemoveListener(value);
|
|
}
|
|
|
|
public event UnityAction<OnEnemyDeathEventArgs> OnDeath
|
|
{
|
|
add => _onDeath.AddListener(value);
|
|
remove => _onDeath.RemoveListener(value);
|
|
}
|
|
|
|
public SandPathBuildService PathBuildService
|
|
{
|
|
get => _pathService;
|
|
set => _pathService = value;
|
|
}
|
|
|
|
public float Health
|
|
{
|
|
get => _health;
|
|
private set
|
|
{
|
|
_health = value;
|
|
_onHealthChanged?.Invoke(value);
|
|
}
|
|
}
|
|
|
|
public float Damage { get => _damage; set => _damage = value; }
|
|
|
|
private void Start()
|
|
{
|
|
_path = new Queue<Vector3>(_pathService.GetPath());
|
|
_target = _path.Dequeue();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (transform.position == _target)
|
|
{
|
|
if (_path.Count == 0) return;
|
|
_target = _path.Dequeue();
|
|
}
|
|
|
|
transform.position = Vector3.MoveTowards(transform.position, _target, _speed * Time.deltaTime);
|
|
transform.LookAt(_target);
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
if (!other.TryGetComponent(out TurretBullet bullet))
|
|
return;
|
|
|
|
TakeDamage(bullet.Damage);
|
|
Destroy(other.gameObject);
|
|
}
|
|
|
|
public void TakeDamage(float damage)
|
|
{
|
|
Health -= damage;
|
|
if (Health <= 0f)
|
|
{
|
|
_onDeath?.Invoke(new OnEnemyDeathEventArgs { KillReward = _killReward });
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
|
|
public class OnEnemyDeathEventArgs
|
|
{
|
|
public int KillReward { get; set; }
|
|
}
|
|
} |