개발 TIL

7/17 부트캠프 개발 TIL (적 인터랙션 버그)

HJTL 2024. 8. 1. 21:00

프로젝트를 테스트하는데 적 NPC의 인터렉션 트리거가 두번 이상 들어가게 되면 배틀용 NPC가 두번 생성되는 버그를 발견했다. 그 이유는 여러가지로 생각했을텐데 근본적인 원인을 찾아보면 OnTriggerEnter에 의해 생기는 버그 때문이다.

 

우선 문제의 영상부터 보자면

플레이어가 NPC 시선트리거를 두번 엔터를 하면 적 NPC가 두번 생성되었다. 

 

이유는 스크립트에서 볼 수 있는데

//일반 적 필드의 스크립트 코드이다.

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //적의 감지범위에 들어온 오브젝트가 Player
        if (collision.gameObject.CompareTag(Define.TAG_PLAYER))
        {
            if (!NPCDataManager.instance.npcDataDictionary[npcSO.id].isClear)
            {
                exclamationMarkSprite.gameObject.SetActive(true);
                NPCInteraction();
            }
        }
    }

    public override void NPCInteraction()
    {
        exclamationMarkSprite.gameObject.SetActive(true);   //느낌표를 띄운다.

        //씬 데이터 매니저에 정보들 저장
        SceneDataManager.instance.EnterBattleScene(npcSO.id);
    }

이 코드에서 앞에 언급했듯이 OnTriggerEnter2D에서 

플레이어가 트리거를 다가갈때마다(전환되기 전까지) 코드를 실행되어 영상에서 두번 다가가서 EnterBattleScene도 두번 호출이 되어 적 오브젝트가 2개나 생성되는 것이었다.

 

이걸 막는 방법은 간단한데, NPCInteraction안에서 해당 트리거 컴포넌트를 비활성시키는 것이다.

public class NPC : MonoBehaviour, INPCInteraction
{
    public BoxCollider2D npcDetectCollider;
    
    //생략

    public virtual void NPCInteraction()
    {
        //NPC일 때, 상호작용하면 구현될 코드 작성
        npcDetectCollider.enabled = false;  //트리거를 한번더 나가지 않게
    }
}

public class SwordEnemy_Field : NPC	//다른 적도 마찬가지
{
	//생략
    
    private void OnTriggerEnter2D(Collider2D collision)
    {
        //적의 감지범위에 들어온 오브젝트가 Player
        if (collision.gameObject.CompareTag(Define.TAG_PLAYER))
        {
            if (!NPCDataManager.instance.npcDataDictionary[npcSO.id].isClear)
            {
                exclamationMarkSprite.gameObject.SetActive(true);
                NPCInteraction();
            }
        }
    }

    public override void NPCInteraction()
    {
        base.NPCInteraction();
        exclamationMarkSprite.gameObject.SetActive(true);   //느낌표를 띄운다.

        //씬 데이터 매니저에 정보들 저장
        SceneDataManager.instance.EnterBattleScene(npcSO.id);
    }
}

적 필드 클래스가 NPC에 상속받았기 때문에 NPC클래스 안에 virtual로 되어있었던 NPCInteraction에서 비활성 시키고 적 필드 클래스 안에서 base로 상위 메서드를 호출하면 된다.

그러면 적이 두번 생성되지 않을 것이다.