작성
·
218
0
안녕하세요! 항상 강의 잘 듣고 있습니다.(키보드도 잘 쓰고 있습니다.)
protected override void UpdateIdle()
{
base.UpdateIdle();
if(_coPatrol!=null)
{
StopCoroutine(_coPatrol);
_coPatrol=null;
}
}
로 null 체크하는 부분 관련하여 질문드립니다.
강의 코드에서는 UpdateIdle() 에서
if(_coPatrol=null)
로 확인하고 Coroutine을 실행하고 있는데요,
다음과 같이 생각하여 if문을 지우고 UpdateIdle에서 곧바로 StartCoroutine을 하도록 하였습니다.
protected override void UpdateIdle()
{
base.UpdateIdle();
_coPatrol = StartCoroutine("CoPatrol");
}
-> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨.
만약 갈 장소 검색에 실패하거나 CoPatrol이 완료되면 Idle이 되어 다음 Frame에 CoPatrol을 수행한다.(반복)
그래서 실행했을 때의 화면은 다음과 같습니다.
https://youtu.be/yHUq12WU2dA
강의 코드에서는 깔끔하게 해당 목적지로 이동하고 끝이지만, 수정한 코드에서는 정신없이 왔다갔다 하다가 해당 목적지로 이동하는 현상이 보입니다.
곰곰이 생각해보았으나 마땅한 이유가 생각나지 않아 질문드립니다.
답변 1
0
이런 부분에 대한 해결책은 스스로 찾으셔야 합니다.
두 코드 사이의 차이라면 null 체크로 인해
-> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨.
위 가정을 했냐 안했냐의 차이 정도이니,
실제로 if (_coPatrol != null) 안으로 들어오는 케이스가 있는지
breakpoint를 잡고 확인해보면 확실히 알 수 있겠죠.
일반적으로 Patrol 상태라 해도 타격을 받았다거나, 길이 막혔다거나 하면
다른 상태로 바뀌는게 일반적이긴 하니, 기존의 코루틴은 꼼꼼히 취소해주는 것이 좋습니다.