인프런 커뮤니티 질문&답변

rhodonite님의 프로필 이미지
rhodonite

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

Patrol AI

_coPatrol==null 질문

작성

·

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

Rookiss님의 프로필 이미지
Rookiss
지식공유자

이런 부분에 대한 해결책은 스스로 찾으셔야 합니다.
두 코드 사이의 차이라면 null 체크로 인해

-> 어차피 CoPatrol이 실행되면 State가 Moving상태가 되어 Coroutine이 2중으로 실행되지 않는다. 그러므로 StartCoroutine만 놔둬도 됨.

위 가정을 했냐 안했냐의 차이 정도이니,
실제로 if (_coPatrol != null) 안으로 들어오는 케이스가 있는지
breakpoint를 잡고 확인해보면 확실히 알 수 있겠죠.
일반적으로 Patrol 상태라 해도 타격을 받았다거나, 길이 막혔다거나 하면
다른 상태로 바뀌는게 일반적이긴 하니, 기존의 코루틴은 꼼꼼히 취소해주는 것이 좋습니다.

rhodonite님의 프로필 이미지
rhodonite

작성한 질문수

질문하기