OldBlueWater/BlueWater/Assets/02.Scripts/Ai/AiController.cs
NTG_Lenovo 8bd4a3f3ca #7 Add FieldOfView script in aiPrefab
Additional commit content
- Add arrow prefab, script, objectPool system
- fixed 02.Main_TG Scene
- testing fieldOfView
2023-08-03 17:00:14 +09:00

87 lines
2.4 KiB
C#

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;
protected FieldOfView fieldOfView;
protected static readonly int AttackHash = Animator.StringToHash("TakeDamage");
protected static readonly int DamageHash = Animator.StringToHash("TakeDamage");
protected static readonly int DeathHash = Animator.StringToHash("Death");
#endregion
#region abstract function
protected abstract void Attack();
#endregion
#region Unity built-in function
protected virtual void Awake()
{
aiAnimator = Utils.GetComponentAndAssert<Animator>(transform);
fieldOfView = Utils.GetComponentAndAssert<FieldOfView>(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 Custom function
public void SetCurrentHp(float value) => AiStat.currentHp = value;
#endregion
}
}