간혹 어떤 코드가 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을 넣어주자.

이세계 용병 온라인

댓글을 달아 주세요