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

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

SceneLoader

R키를 2초 누르면 재시작 하도록 구현하고 싶은데 이상합니다

해결된 질문

작성

·

27

0

R키 2초 누르면 SceneLoader의 ReLoadScene으로

현재 씬을 재시작하도록 했습니다.

image.png

재시작할 때 사진처럼 되면서 살짝 딜레이가 생깁니다.

public bool RDown = false; // R 키를 눌렀는가? // true: 누르는 중
public float RDownTime = 0.0f; // R 키를 몇초 눌렀는가?

private void Awake()
{
    setting = transform.GetChild(0).gameObject;
}

protected override void HandleInput()
{
    base.HandleInput();

    RDown = Input.GetKey(KeyCode.R); 
    if (RDown)
    {
        Debug.Log("R 키 누르는 중");
        RDownTime += Time.deltaTime;
        if (RDownTime > 2.0f)  // R버튼 2초 누르면 재시작
        {
            SceneLoader.Instance.ReloadScene();
        }
    }
    else // 누른 시간 초기화
    {
        RDownTime = 0.0f;
    }

    //if (!RDown)  // 누른 시간 초기화
    //{
    //    RDownTime = 0.0f;
    //}
}

public void OnClickReStartBtn() // 재시작 버튼 구현
{
    SceneLoader.Instance.ReloadScene();
}

 

HandleInput 함수는 부모 클래스 Update에서 호출 중입니다.


 

추가로 여기에 R키 사용에 있어 쿨타임을 줄 수 있을까요?

씬이 재시작되면서 쿨타임 체크하는 부분도 씬 재시작으로 인해 초기화가 되지 않을까 걱정입니다.

답변 2

1

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

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

 

일단 RDown이 false일 때 RDownTime을 0.0f으로 초기화 시키면 쿨타임이 작동하지 않나요? 그리고 m_ReloadingScene 멤버변수를 선언해서 누른지 2초 후 ReloadScene이 계속 요청되지 않도록 예외처리가 필요해 보입니다.

private bool m_ReloadingScene = false;
    
protected override void HandleInput()
{
    base.HandleInput();

    RDown = Input.GetKey(KeyCode.R); 
    if (RDown)
    {
        Debug.Log("R 키 누르는 중");
        RDownTime += Time.deltaTime;
        if (RDownTime > 2.0f && !m_ReloadingScene) 
        {
            m_ReloadingScene = true; 
            SceneLoader.Instance.ReloadScene();
        }
    }
    else // 누른 시간 초기화
    {
        RDownTime = 0.0f;
    }
}

씬 리로드 관련하여 원하시는 로직이 무엇인지 좀 더 구체적으로 명시해 주시면 추가적으로 도움 드리겠습니다. 그리고 씬 리로드 시 싱글턴 인스턴스 관련 문의는 현재 확인 중에 있으니 조만간 답변 드리겠습니다. 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. moonfgg님.

R 키를 2초 동안 누르면 현재 씬을 재시작하는 기능 구현 중 딜레이와 쿨다운 문제를 겪고 계신 것 같습니다. 문제를 해결하기 위한 몇 가지 사항을 함께 고려해보겠습니다.

딜레이 문제 해결하기

씬이 재시작되면서 딜레이가 발생하는 경우는 주로 씬 로딩 과정에서 발생할 수 있습니다. 씬 재시작 시 프리팹 인스턴스가 중복되지 않도록 DontDestroyOnLoad 속성을 잘 활용하고, 필요시 중복된 오브젝트가 생성되지 않는지 체크하는 부분을 추가해 주세요. 중복 생성은 딜레이의 주된 원인이 될 수 있습니다.

R 키 쿨타임 구현

쿨타임 기능을 위해 R 키 입력이 처리된 후 일정 시간 동안 입력을 무시하도록 할 수 있습니다. 씬이 재시작되면 모든 상태가 초기화되므로, 쿨타임을 외부 저장소(예: PlayerPrefs 또는 휘발성 총칭)를 통해 관리하는 것이 필요합니다. 다만, Unity의 기본 설정으로 휘발성 총칭를 사용하는 것이 가장 간단할 수 있습니다.

쿨타임 예제 코드

private bool canRestart = true; // 쿨타임 체크
private float cooldownTime = 5.0f; // 쿨타임, 단위: 초

protected override void HandleInput()
{
    base.HandleInput();

    if (canRestart)
    {
        RDown = Input.GetKey(KeyCode.R);
        if (RDown)
        {
            Debug.Log("R 키 누르는 중");
            RDownTime += Time.deltaTime;
            if (RDownTime > 2.0f)  // R버튼 2초 누르면 재시작
            {
                SceneLoader.Instance.ReloadScene();
                canRestart = false;
                StartCoroutine(ReloadCooldown());
            }
        }
        else 
        {
            RDownTime = 0.0f;
        }
    }
    else 
    {
        RDownTime = 0.0f;
    }
}

private IEnumerator ReloadCooldown()
{
    yield return new WaitForSeconds(cooldownTime);
    canRestart = true;
}
  • 쿨타임 처리: 버튼 누름 이후 ReloadCooldown 코루틴을 통해 쿨타임을 적용합니다. 씬이 재시작될 때도 canRestart 상태가 유지되도록 합니다.

이와 유사한 고민을 하신 다른 수강생 분들의 질문과 답변을 통해 힌트를 얻으시면 좋을 것 같습니다. 씬 싱글턴과 렌더링 관련 문제 관련 질문에서 문제 해결의 긴 힌트를 얻으실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

질문하기