Notice
Recent Posts
Recent Comments
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

게임을 만듭니다.

개발일기 - AI로직 개선에 따른 버그발생 본문

old_Doona

개발일기 - AI로직 개선에 따른 버그발생

인카고 2018. 4. 12. 09:25


또다시 IndexOutOfRangeException 입니다.

맵상에 주어진 배열 밖의 값을 참조하려는 거죠.

우선 로그를 더 자세히 찍어봅니다.



startMapNode와 targetMapNode가 있는데 이중 targetMapNode가 sm.grid의 배열 범위를 벗어납니다

sm.grid의 배열범위는 (23, 11)인데 (3, 16)을 참조하려는거죠


왜 이런 상황이 나타났을까 고민을 하게 됩니다.

저 코드는 길찾기 로직안에 존재하는데 스테이지가 바뀔때 이전스테이지의 맵노드를 기반으로 새로운 맵의 데이터에 참조를 하려는게 아닐까하는 의심이듭니다.

근데 말이 안되는건 startMapNode는 (22, 3)입니다.

startMapNode와 targetMapNode를 같은 시점에서 사용하기때문에 한 맵에 서 저 두위치를 참조한다는것인다.

그러려면 맵의 크기가 적어도 (22, 16)은 되어야 합니다.

현재 그런 맵은 없습니다. 맵은 새로로 길거나 가로로 길거나 한 구조이기 때문에 아주 이상하다고 생각되어집니다.

그리고 이 에러는 이틀전까지만해도 등장하지 않다가 최근 AI개선 업데이트와 함께 나타난 에러입니다.


그러면 AI개선을 위해 수정한 코드를 의심해봐야겠습니다.

기존에는 임의로 정해둔 tick마다 

-근처에 아이템이 있는지

-근처에 적 유닛이 있는지

-근처에 적 타워가 있는지

등을 체크하여 행동을 결정합니다.


이중 아이템 탐지에대한 로직은 일정 거리안의 아이템에 대하여 해당 아이템까지의 동선이 확보되면 그 아이템을 타겟으로 설정합니다.

이 타겟은 로컬변수에 저장되지 않기때문에 이번 tick에서 아이템을 향해 이동하다가 거리가 멀어지면(앞에 장애물이 있으면 돌아가려 하기 때문입니다) 다음 tick에서는 아이템을 탐지하지 못하고 다른 행동을 하고 또다시 아이템을 탐지해내기를 반복합니다.


그러면 유닛이 왔다리 갔다리를 무한정 반복하는 현상이 벌어지죠.


그 현상을 이틀전에 수정하였습니다.

수정방식은 tick에서 아이템을 감지하면 그것을 로컬변수에 넣고 다음 tick에 아이템을 감지하지 못하더라도 로컬변수에 넣어놓은 아이템을 참조해서 해당 아이템을 획득하려 이동하게 로직을 바꾼것입니다.


그런데!! 여기서 문제가 있었습니다.

나의 유닛이 특정아이템을 로컬변수로 참조하고 있었던 상황에서 스테이지가 리셋됩니다.

나의유닛이든 적 유닛이든 모두 오브젝트 풀로 돌아가고 새 스테이지에서는 풀에서 다시 유닛을 꺼내와 스텟과 외형에 따라 셋업을 하여 사용하게됩니다.

그러니깐 이전에 나의 유닛이였던 게임오브젝트가 다음스테이지에서는 적유닛으로 나타날 수 있는거죠.

이러한 상황에서 로컬변수로 참조하고 있던 아이템(또한 destroy되지 않고 풀로 돌아가있습니다)을 적 유닛이 참조하여 아이템획득 로직을 실행하는 경우가 생겨버렸습니다.

이미 풀로 돌아간 아이템이지만 이전 스테이지에서의 위치에 따른 mapNode를 가지고 있고 해당 mapNode를 향해 적 유닛들이 이동하려 pathFinding을 요청합니다.

당연히 현재스테이지의 grid로 커버되는 인덱스가 아니기에 IndexOutOfRangeException을 발생시키는것이지요.


해결방법은 간단합니다 유닛이 풀로 돌아가는 타이밍(OnDisable)에 로컬변수(아이템)를 리셋해버리는겁니다.


결국 오브젝트 풀과 관련한 에러가 또 발생하는군요.

오브젝트 풀에서는 초기화와 함께 풀로 돌려보낼때의 작업들이 매우 중요하다는것을 또 느끼게 됩니다.

'old_Doona' 카테고리의 다른 글

마음이 아프다...  (0) 2017.08.17
두나가 플레이스토어에 피쳐드되었습니다.  (0) 2017.08.11
두나 10만 다운로드 달성!!!  (0) 2017.05.25
피쳐드!!!!  (0) 2017.05.22
멀티플렛폼 출시를 하면서 고려할점...  (0) 2017.05.06
Comments