본문 바로가기
Unity 유니티 기초강의

유니티 코루틴 Coroutine 딜레이 알아보기

by 만사오케이프로 2022. 5. 17.
반응형

유니티에서 딜레이를 함수를 딜레이 후 작동하기 위해서는 여러방법이 있습니다.

 

1.Invoke 함수를 이용하는 방법입니다

유니티 함수는 매개변수 파라미터 인자에 실행할 함수 이름과 딜레이 시간을 넣어주어 실행합니다.

실행함수

Invoke(string methodName, float time);

 

취소함수 (실행되기전에 취소할수 있습니다)

CancelInvoke();

 

메소드에 매개변수를 전달해야 하는 경우 대신 Coroutine 을 사용 하는 것이 좋습니다. 코루틴은 또한 더 나은 성능을 제공합니다.

 

장점

코드가 간결하고 쉽다.

 

단점

함수이름을 string으로 넣어줘야 한다.

복합적인 딜레이가 하기위해서는 코드가 지져분해 진다.

실행할 함수에 매개변수를 넘길수 없다.

public class Test : MonoBehaviour
{
    Rigidbody projectile;

    void Start()
    {
        Invoke("LaunchProjectile", 2.0f);
        //2.0초후 함수 LaunchProjectile를 실행합니다.
    }

    void LaunchProjectile()
    {
        Rigidbody instance = Instantiate(projectile);
        instance.velocity = Random.insideUnitSphere * 5.0f;
    }
}

 

2.Coroutine 을 이용하는 방법입니다.

반환함수가 IEnumerator인 함수를 파라미터에 넣어주어 실행합니다

Coroutine StartCoroutine(IEnumerator routine)

 

취소함수

StopCoroutine(string methodName);

함수이름을 넣어서 코루틴을 취소합니다.

 

StopCoroutine(IEnumerator routine);

코루틴을 실행할 함수를 넣어서 멈출수 있습니다. 

 

public void StopCoroutine(Coroutine routine);

StartCoroutine의 반환된 값 Coroutine를 넣어 멈출수 있습니다.

 

StopAllCoroutines();

behaviour 안에 있는 코루틴 함수를 모두 취소시킵니다. (실행시키고 있는 스크립트 안에 있는 코루틴)

using System.Collections;
using UnityEngine;

public class Test : MonoBehaviour
{
    private IEnumerator coroutine;

    void Start()
    {
        coroutine = WaitAndPrint(2.0f); //반환값 IEnumerator를 저장해둔다.
        StartCoroutine(coroutine);
        
        //StopCoroutine(coroutine); 반환된 IEnumerator을 저장 해두었다가 멈출때 사용한다
    }
    
    //딜레이를 할 함수를 만들어 줍니다. 반환값을 IEnumerator 로 해주어야 합니다.
    private IEnumerator WaitAndPrint(float waitTime)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime); //waitTime 만큼 딜레이후 다음 코드가 실행된다.
            Shot();
            //While문을 빠져 나가지 못하여 waitTime마다 Shot함수를 반복실행 됩니다.
        }
    }

    public void Shot()
    {
        
    }
}

 

using System.Collections;
using UnityEngine;

public class Test : MonoBehaviour
{
    private Coroutine coroutine;

    void Start()
    {
        coroutine = StartCoroutine(WaitAndPrint(2.0f));
        
        //StopCoroutine(coroutine); 반환된 IEnumerator을 저장 해두었다가 멈출때 사용한다
    }
    
    //딜레이를 할 함수를 만들어 줍니다. 반환값을 IEnumerator 로 해주어야 합니다.
    private IEnumerator WaitAndPrint(float waitTime)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime); //waitTime 만큼 딜레이후 다음 코드가 실행된다.
            Shot();
            //While문을 빠져 나가지 못하여 waitTime마다 Shot함수를 반복실행 됩니다.
        }
    }

    public void Shot()
    {
        
    }
}

 

코루틴으로 딜레이 할수 있는 방법들 입니다.

 

yield return null;

한 프레임 기다린후 진행합니다.

 

yield return new WaitForSeconds(1f);

게임 시간으로 1초 기다린후 진행합니다. time scale 영향을 받아서 time scale = 1 일겨우 제대로 작동합니다.

 

yield return new WaitForSecondsRealtime(1f);

실제 시간으로 1초 기다린후 진행합니다. time scale을 영향을 받지 않습니다.

 

yield return new WaitForFixedUpdate();

다음 FixedUpdate 끝날 때까지 기다린후 진행합니다.

 

yield return new WaitForEndOfFrame();

다음 프레임의 Update와 모든 렌더링이 끝난후 진행합니다.

반응형

댓글