해결된 질문
작성
·
30
0
R키 2초 누르면 SceneLoader의 ReLoadScene으로
현재 씬을 재시작하도록 했습니다.
재시작할 때 사진처럼 되면서 살짝 딜레이가 생깁니다.
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입니다. 문의해 주신 내용에 답변 드립니다.
일단 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 키 입력이 처리된 후 일정 시간 동안 입력을 무시하도록 할 수 있습니다. 씬이 재시작되면 모든 상태가 초기화되므로, 쿨타임을 외부 저장소(예: 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
상태가 유지되도록 합니다.이와 유사한 고민을 하신 다른 수강생 분들의 질문과 답변을 통해 힌트를 얻으시면 좋을 것 같습니다. 씬 싱글턴과 렌더링 관련 문제 관련 질문에서 문제 해결의 긴 힌트를 얻으실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.