코딩의 신 61

김동관·2025년 12월 29일

오늘 한 일

Unity 튜토리얼 상호작용 문제 해결 정리 (Chest & Arrow 이슈)

오늘은 튜토리얼 구간에서 상자(Chest) 상호작용과 화살표(WorldArrow) 연출이 꼬이는 문제를 해결했다.
결론부터 말하면, 복잡한 구조 문제가 아니라 아주 단순한 실행 순서 문제였다.

문제 상황

WeaponChest를 열면 정상적으로:

상자가 열리고

튜토리얼 화살표가 몬스터를 가리킴

하지만 이후 F 키를 한 번 더 누르면

화살표가 갑자기 사라짐

상자는 이미 열렸는데도 Interact()가 다시 호출되면서
튜토리얼 흐름이 깨지는 현상이 발생

처음에 잘못 접근했던 방향

문제를 보면서 아래 같은 생각을 했었다:

튜토리얼 상태 플래그가 필요한가?

F 키 입력을 막아야 하나?

WeaponChest / AppleChest를 분기해야 하나?

TutorialManager에서 상태를 더 세분화해야 하나?

→ 결과적으로 전부 과한 접근이었다.

진짜 원인

문제의 핵심은 ChestInteractable.Interact() 안에 있던 이 코드였다:

if (worldArrow != null && worldArrow.gameObject.activeSelf)
{
    worldArrow.gameObject.SetActive(false);
}

이 코드가:

상자가 이미 열렸든 말든

F 키를 누를 때마다 실행되면서

화살표를 계속 꺼버리고 있었음

그리고 그 뒤에야 isOpened 체크를 하고 있었기 때문에
“두 번째 F 입력”에서 문제가 발생했던 것.

해결 방법 (가장 단순하고 안정적인 방식)

핵심 원칙

이미 열린 상자는 완전히 무시한다
Chest는 화살표를 제어하지 않는다

수정한 Interact 코드

public void Interact(PlayerInteraction player)
{
    // 이미 열렸으면 아무 일도 하지 않음
    if (openOnlyOnce && isOpened)
        return;

    isOpened = true;

    if (animator != null)
        animator.SetTrigger(openTriggerName);

    GiveReward(player);

    // 튜토리얼 흐름만 알림 (화살표는 TutorialManager가 관리)
    TutorialManager.Instance.ShowMoveForwardText();
}

제거한 코드

worldArrow.gameObject.SetActive(false);

결과

WeaponChest를 열면:

화살표가 몬스터를 가리킴

이후 F 키를 몇 번 눌러도:

상자는 무시됨

화살표는 그대로 유지됨

튜토리얼 흐름이 자연스럽게 이어짐

-> 추가적인 상태 플래그나 입력 차단 로직 없이 해결

오늘의 교훈

“두 번째 입력에서 문제가 생긴다” →
대부분 상태 설계 문제가 아니라 실행 순서 문제

Manager / 플래그 / 구조를 늘리기 전에
if 문 위치부터 다시 보자

튜토리얼 오브젝트는
-> 자기 역할만 하게 두는 게 제일 안정적

마무리

오늘 문제는 어렵지 않았는데,
문제를 어렵게 바라보면서 스스로 꼬이게 만든 케이스였다.

결국 해결은

if 한 줄 위치 + 쓸데없는 코드 삭제

그래도 덕분에
튜토리얼 상호작용 구조를 한 번 더 정리할 수 있었던 하루였다.

profile
아이디어 뱅크

0개의 댓글