간혹 어떤 코드가 1프레임 혹은 몇 초 후에 실행됐으면 하는 때가 있다.
예를 들어, Ui를 초기화하고, 한프레임 후 구성요소의 위치나 크기를 가져와야 하는 경우가 그렇다. 초기화하고 바로 값을 읽으면, 원하는 값을 얻을 수 없다. 아마 Unity내부에서 렌더링 되지 않아서 인 것 같다. 이 경우 한프레임 후, 그 값을 읽으면 잘 읽힌다.
이때 한프레임 후 실행되게 할 때, 코루틴을 많이 사용하는데, 이게 은근 사용하기 귀찮게 돼 있다.
좀 더 간편하게 코루틴을 사용하기 위한 클래스들 만들어보자.
1. CoroutineManager 싱클톤 클래스
아래와 같이 싱글톤 클래스를 만들어보자.
2020/01/07 - [게임을 만들자/게임 서버(C#)] - c# 싱글톤 제네릭 클래스
using System;
using System.Collections;
using UnityEngine;
public class CoroutineManager : Singleton<CoroutineManager>
{
MonoBehaviour m_mono;
override protected void init()
{
m_mono = jdController.Instance.MainEngine;
}
public void CallWaitForOneFrame(Action act)
{
m_mono.StartCoroutine(DoCallWaitForOneFrame(act));
}
public void CallWaitForSeconds(float seconds, Action act)
{
m_mono.StartCoroutine(DoCallWaitForSeconds(seconds, act));
}
private IEnumerator DoCallWaitForOneFrame(Action act)
{
yield return 0;
act();
}
private IEnumerator DoCallWaitForSeconds(float seconds, Action act)
{
yield return new WaitForSeconds(seconds);
act();
}
}
m_mono = jdController.Instance.MainEngine;
이 부분은 내 게임 오브젝트 중, MainEngine이라는 GameObject가 있는데, 이 객체는 게임 실행 후, 생성되고 계속 유지되는 녀석이다. 그 객체의 레퍼런스 값을 넣어준 것이다. 꼭 그런 객체가 아니더라도, 현재 실행 중인 MonoBehavior객체를 넣어주면 된다.
2. 사용
나 같은 경우, 튜토리얼 구현 시 사용 했다. 어떤 스킬이 사용되고 난 후, 1.5초 뒤에 다음 튜토리얼이 실행되도록 했다.
case TutorialType.TUTORIAL_TYPE_COMPLETE_2:
{
NetworkManager.Instance.UseSkillReq(0);
CoroutineManager.Instance.CallWaitForSeconds(1.5f, () => {
//1.5초 후 실행할 코드
Show(TutorialType.TUTORIAL_TYPE_COMPLETE_3);
});
break;
}
사용방법을 보면 간단할 것이다. 원하는 시간과, 람다식 Action을 넣어주자.
'게임을 만들자 > Unity' 카테고리의 다른 글
Unity Built-in to URP 변환하기 (0) | 2020.12.17 |
---|---|
Unity, VS4M, Debugger operation failed. 해결 (0) | 2020.11.09 |
Unity, 앱 종료 및 재시작(안드로이드) (0) | 2020.09.17 |
Unity, c# Http Get 통신 (0) | 2020.09.08 |
Unity, String(Hex) To Color, Color To String(hex) (0) | 2020.07.22 |