헤매던 부분들-NULL 개발중

jh Seo·2024년 3월 20일
0

헤매던 부분들

목록 보기
3/7

ontriggerenter2d 함수 관련

플레이어의 공격을 구현하는 중이였다.

빈 오브젝트 하나 선언 후, ontriggerenter2d함수를 통해 compareTag("Boss")이런식으로 체크해서 적과 닿았는지 체크하는 방식으로 처리했다.

공격 버튼을 누를 때마다 해당 오브젝트를 setactive함수를 통해 껐다가 켜는 방식으로 구현했다.

문제는 플레이어와 적이 둘다 가만히 있을 때,
처음 닿았을 때만 ontriggerenter2d함수가 실행되고,
그 후로는 아무리 오브젝트를 껐다 켜도 ontriggerenter2d함수가 작동을 안했다.

혼자 짐작해본 결과론 오브젝트가 껐다가 켜질때마다 서로 충돌하는지 체크하지 않고, 닿아있기만 한다면 오브젝트가 꺼져있어도 충돌하는 중으로 처리되는 게 아닐까 생각을 해봤다.

왜냐면 보스나 플레이어가 아주 약간이라도 움직인 후 껐다 키면
다시 ontriggerenter2d함수로 진입이 되었었다.

찾아보던 중 유니키 매뉴얼을 읽었는데 이런 문구가 있었다.

Trigger events are sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions.

trigger event가 disabled monobehaviours에도 전달이 된다고 한다.
이것때문에 이미 닿아있는 상태로 판정되고 있는 것 같다.

해결

따라서 방식을 바꿔 오브젝트를 껐다키지말고 overlapBoxAll함수를 통해 버튼을 누를때마다
collider들을 체크했다.

scriptableobject로 관리한 스킬 관련

scriptableobject로 스킬을 작성하고 , behaviour tree를 사용해 스킬들을 사용중이였다.
스킬이 불릴때마다 이미 만들어진 프리펩들의 moveMissile함수들을 getcomponent로 읽어와
list에 넣어주도록 구현했다.

매번 스킬이 호출될때마다 getcomponent함수랑 add함수가 호출되는게 맘에 안들어서 static으로 list를 선언하고 처음에 넣어준 후, list count가 0일때만 초기화해주는 식으로 구현했다.

문제는 보스스테이지가 넘어갔을 때, 다음 보스에서도 똑같은 스킬을 사용하는 구조인데
미사일(프리펩)들이 전혀 나타나지 않았다.

한참을 해멘 결과 list가 static이라서 첫번째 보스의 프리펩들이 저장되어 있었다.
따라서 첫번째 보스의 프리펩들을 사용하게 되는 말도 안되는 현상이 일어났다.

해결

listcount 0인지 확인 후, 첫번째 프리펩 대상이 이번 보스의 프리펩과 같은지 비교를 추가했다.

profile
코딩 창고!

0개의 댓글