인프런 커뮤니티 질문&답변
_coPatrol==null 질문
작성
·
272
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
강의 코드에서는 깔끔하게 해당 목적지로 이동하고 끝이지만, 수정한 코드에서는 정신없이 왔다갔다 하다가 해당 목적지로 이동하는 현상이 보입니다.
곰곰이 생각해보았으나 마땅한 이유가 생각나지 않아 질문드립니다.
퀴즈
타일맵 기반 환경에서 이동 가능한 영역과 불가능한 영역을 분리하여 관리하기 위해 사용된 주된 방법은 무엇일까요?
하나의 타일맵에 모든 정보를 저장하고 태그로 구분한다.
충돌 정보만을 담는 별도의 타일맵 레이어를 사용한다.
모든 타일에 물리적인 Collider 컴포넌트를 추가한다.
카메라의 시야 범위로 이동 가능 영역을 제한한다.
답변 1
0
이런 부분에 대한 해결책은 스스로 찾으셔야 합니다.
두 코드 사이의 차이라면 null 체크로 인해
-> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨.
위 가정을 했냐 안했냐의 차이 정도이니,
실제로 if (_coPatrol != null) 안으로 들어오는 케이스가 있는지
breakpoint를 잡고 확인해보면 확실히 알 수 있겠죠.
일반적으로 Patrol 상태라 해도 타격을 받았다거나, 길이 막혔다거나 하면
다른 상태로 바뀌는게 일반적이긴 하니, 기존의 코루틴은 꼼꼼히 취소해주는 것이 좋습니다.




