OldBlueWater/BlueWater/Assets/02.Scripts/Ai/AiController.cs

84 lines
2.1 KiB
C#
Raw Normal View History

using System;
using UnityEngine;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
[Serializable]
public abstract class AiController : MonoBehaviour, IDamageable
{
#region Property and variable
protected Animator aiAnimator;
private static readonly int DeathHash = Animator.StringToHash("Death");
private static readonly int DamageHash = Animator.StringToHash("TakeDamage");
#endregion
#region abstract function
protected abstract void Attack();
#endregion
#region Unity built-in function
private void Awake()
{
aiAnimator = Utils.GetComponentAndAssert<Animator>(transform);
}
private void Start()
{
SetCurrentHp(AiStat.maxHp);
}
#endregion
#region interface property and function
[field: SerializeField] public AiStat AiStat { get; set; } = new();
public void TakeDamage(AiStat attacker, AiStat defender)
{
// 회피 성공 체크
if (Random.Range(0, 100) < defender.avoidanceRate)
{
// TODO : 회피 처리
return;
}
var finalDamage = Utils.CalcDamage(attacker, defender);
// 방패 막기 체크
if (finalDamage == 0f)
{
// TODO : 방패로 막힘 처리(애니메이션 등)
return;
}
var changeHp = Mathf.Max(defender.currentHp - finalDamage, 0);
SetCurrentHp(changeHp);
// 죽었는지 체크
if (changeHp == 0f)
{
// TODO : 죽었을 때 처리(죽는 애니메이션 이후 사라지는 효과 등)
aiAnimator.SetTrigger(DeathHash);
return;
}
aiAnimator.SetTrigger(DamageHash);
}
#endregion
#region Function
public void SetCurrentHp(float value) => AiStat.currentHp = value;
#endregion
}
}