사전캠프/Unity

유니티 - 반복 실행 구조

서보훈 2024. 9. 5. 17:02

게임을 만들다보면 특정 기능을 반복해서 실행해야 하는 경우가 자주 발생합니다.

유니티에서 반복실행 구조를 만드는방법을 정리하겠습니다.

 

제가 알고있는 반복 실행 구조는 총 3가지로

Time.deltaTime 이용

코루틴(Coroutine) 함수 사용

인보크(Invoke) 함수 사용

이 있습니다.

 


Time.deltaTime 사용

이 방법은 Update문에서 지난 시간을 누적하여 일정시간이 지나면 작동되는 방식으로, 반복 작동을 구현하거나 일정 시간이 지나면 특정 기능이 작동하도록 만들 수 있습니다.

 

3초마다 함수 DoAction을 호출하는 코드입니다.

//몇초마다 작동할지(3초)
private float waitTime = 3f;
private float countDown = 0;

private void Update()
{
    if(countDown < waitTime)
    {
        //지난 시간 누적
        countDown += Time.deltaTime;
    }
    else
    {
        //일정 시간이 지나면 함수 작동
        DoAction();
        //초기화
        countDown = 0;
    }

}

2개의 변수를 선언하여 하나는 반복이 될 시간을 정하고, 다른 하나에 시간을 누적합니다.

누적된 시간이 3을 넘으면 DoAction 함수를 작동하고, 누적한 시간을 0으로 초기화하여 다음 반복을 준비합니다.

 


코루틴 함수 사용

코루틴 함수는 Update문과 별개로 작동하는 함수 입니다.

코루틴 함수는 yield return 을 통해 함수의 작동을 일시 정지 할 수 있으며, 이를 이용하여 일정시간마다 특정 기능이 작동하도록 만들 수 있습니다.

 

코루틴 함수를 통해 3초마다 특정 기능이 반복되도록 만든 코드입니다.

//몇초마다 작동할지(3초)
private float waitTime = 3f;

private void Start()
{
    //코루틴 함수 호출
    StartCoroutine(RepeatFunction());
}


private IEnumerator RepeatFunction()
{
    //무한반복
    while(true)
    {
        //지정한 시간동안 대기(3초)
        yield return new WaitForSeconds(waitTime);
        //함수 실행
        DoAction();
    }
}

yiedl return new WaitForScronds() 줄을 실행하게되면, 지정한 시간만큼 코루틴 함수의 작동이 멈추게 됩니다.

코루틴 함수는 StartCoroutine() 함수를 통해 호출해주어야 하며, 선언할때 IEnumerator를 반환하도록 선언합니다.

 

또한 코루틴 함수를 선언할 때 매개변수를 줄 수 있으며, 이 매개변수를 함수 내에서 자유롭게 사용할 수 있습니다.

private IEnumerator RepeatFunction(float time)
{
    //무한반복
    while(true)
    {
        //지정한 시간동안 대기(매개변수 만큼)
        yield return new WaitForSeconds(time);
        //함수 실행
        DoAction();
    }
}

 

코루틴 함수를 사용할경우 다음줄을 실행할때까지 대기하는것은 코루틴 함수 내에서만 작동하며, Update문과는 별개로 작동한다는점에 유의해야 합니다.

 

private void Update()
{
    StartCoroutine(RepeatFunction());
}

이런식으로 코루틴 함수를 사용하게되면, Update문과 별개로 코루틴 함수가 여러번 호출되는 문제가 생기게 됩니다.

while 문이 없어도 첫 실행 직후 3초 후, DoAction() 함수가 끝없이 호출되는 상황이 발생합니다.

 

코루틴 함수는 Coroutine 클래스를 사용해 변수 형태로 선언할 수 있는데, 이렇게 이름을 정해주면 원하는 시점에 코루틴 함수를 종료할 수 있습니다.

//코루틴 변수 선언
private Coroutine coroutine1;

private void Start()
{
    coroutine1 = StartCoroutine(RepeatFunction());
    //코루틴 종료
    StopCoroutine(coroutine1);
}

 


Invoke 함수 사용

Invoke 함수중, InvokeRepeating() 함수를 사용하여 특정 함수를 반복호출 할 수 있습니다.

//몇초마다 작동할지(3초)
private float waitTime = 3f;

private void Start()
{
    InvokeRepeating("DoAction", 0, waitTime);
}

InvokeRepeating 함수는 string, float, float 매개변수를 가지는데, 각각 함수명, 시작 시간, 반복호출 시간을 당담하는 매개변수 입니다.

즉 , DoAction 이라는 이름의 함수를 0초후에 시작하여 waitTime 마다 DoAction함수를 작동합니다.

 

string을 통해 변수명을 받기 때문에, 매개변수를 사용할 수 없으며, 함수명이 틀릴경우 작동하지 않기 때문에 철자에 주의하셔야 합니다.