Player 구현을 마치고, Enemy 구현을 시작했다. 상태 패턴을 사용해서 구현했다.
구현 내용
- Enemy 상태 패턴 (Idle, Walk, Chasing, Die, Attack, Hit)
트러블 슈팅
1. EnemyHitState
- ChasingState에서 HitState로 변경 시, 멈추지 않고 계속 Player를 향해 다가옴
public void Handle(EnemyController enemyController)
{
if (!_enemyController)
_enemyController = enemyController;
Debug.Log("Chasing 상태 시작");
_enemyController.Animator.SetBool("Run", true);
StartCoroutine(COUpdate());
}
IEnumerator COUpdate()
{
while (true)
{
_dir = new Vector3(_enemyController.Player.transform.position.x - transform.position.x, 0,
_enemyController.Player.transform.position.z - transform.position.z).normalized;
_enemyController.Rigidbody.velocity = _dir * _enemyController.RunSpeed * Time.deltaTime;
transform.LookAt(transform.position + _dir);
if(_enemyController.Distance <= _enemyController.OriginChasingRange)
{
_enemyController.ChasingRange = _enemyController.OriginChasingRange;
}
if (_enemyController.Distance >= _enemyController.ChasingRange * 2f)
{
_enemyController.Animator.SetBool("Run", false);
_enemyController.IdleStart();
break;
}
yield return null;
}
}
기존 EnemyChasingState의 코드다. update문을 사용하기 위해 코루틴을 사용했고, 코루틴 안에는 Player를 향해 달려오도록 구현했다. 아마도 while문 위쪽에 있는 Player에게 달려가는 코드가 반복되는 중에 HitState로 넘어가기 때문에 EnemyHitState에서도 Player에게 달려오는 것으로 예상이 된다.
if (_enemyController.IsHit)
{
_enemyController.IsHit = false;
break;
}
위 코드를 Idle, Walk, ChasingState에 각각 추가하여 적이 공격 당하게 되면 while문을 break 하도록 했다.
해결 완료!
오늘의 회고
특강 시간에 들었던 상태 패턴을 이용해서 Enemy를 구현했다. 처음에는 이해가 되질 않아서 포기할까도 생각했지만, 상태 패턴은 꼭 한번 구현해보고 싶다는 생각이 있어서 튜터님께 질문도 하면서 Enemy 적용에 성공했다. 구현하고 나니 일반적인 코드보다 훨씬 편하다는 생각을 했다. 그리고 추가적인 State가 생겨도 각 State 별로 연결만 하면되기 때문에 여러가지 장점이 많다고 생각했다. 아직 구현 못한 부분이 있기때문에 구현을 마치고 블로그에 정리할 예정이다.
'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글
Unity_2기 11주차 (230117) (0) | 2024.01.17 |
---|---|
Unity_2기 11주차 (230116) (0) | 2024.01.16 |
Unity_2기 10주차 (230112) (0) | 2024.01.12 |
Unity_2기 10주차 (230111) (0) | 2024.01.11 |
Unity_2기 10주차 (230110) (0) | 2024.01.10 |