화살을 맞은 적이 바로 사망 이펙트를 재생하도록 만들어보자
몬스터는 화살을 맞거나 플레이어의 펀치 공격을 받을 때 바로 소멸함과 동시에 소멸 이펙트를 그 자리에 재생시키도록 하였다.
이 경우 확장성을 위해 이펙트를 재생하고 오브젝트를 소멸시키는 코드를 화살이 닿을 때 또는 플레이어가 펀치 공격을 할 때 하드코딩해서 넣어주는 것이 아닌 OnDamaged()라는 함수를 따로 만들어 필요할 때마다 그 함수를 호출해주는 방식을 채택했다.
public override void OnDamanged()
{
GameObject effect = Managers.Resource.Instantiate("Effect/DieEffect");
effect.transform.position = transform.position;
effect.GetComponent<Animator>().Play("DieStart");
GameObject.Destroy(effect, 0.5f);
Managers.Obj.Remove(gameObject);
Managers.Resource.Destroy(gameObject);
}
...
protected override void UpdateIdle()
{
if (_dir != MoveDir.None) // 유닛 한칸 이동 끝날때까지 입력 못받게
{
Vector3Int destPos = CellPos;
switch (Dir)
{
case MoveDir.Up:
destPos += Vector3Int.up;
break;
case MoveDir.Down:
destPos += Vector3Int.down;
break;
case MoveDir.Left:
destPos += Vector3Int.left;
break;
case MoveDir.Right:
destPos += Vector3Int.right;
break;
}
State = CreatureState.Moving;
if (Managers.Map.CanGo(destPos))
{
GameObject go = Managers.Obj.Find(destPos);
if (go == null)
{
CellPos = destPos;
}
else
{
CreatureController controller = go.GetComponent<CreatureController>();
if (controller != null)
controller.OnDamanged();
Managers.Resource.Destroy(gameObject);
}
}
else
{
Managers.Resource.Destroy(gameObject);
}
}
}
IEnumerator CoStartPunch()
{
GameObject go = Managers.Obj.Find(GetFrontCellPos()); // 내가 바라보고 있는 방향 +1
if(go != null)
{
CreatureController controller = go.GetComponent<CreatureController>();
if (controller != null)
controller.OnDamanged();
}
_rangeSkill = false;
yield return new WaitForSeconds(0.5f);
State = CreatureState.Idle;
_coSkill = null;
}