본문 바로가기
Unity

Coroutine (코루틴)

by hallojih 2021. 11. 29.

개념]

 현재는 c#에서만 지원

 어떤 기능을 만들건데 이게 굉장히 복잡한 로직을 가지고 있다면, 오래 걸리는 것을 한 틱에 몰아서 한다면 문제가 발생할 수 있다. ex) 스타크래프트에서 마린 한부대를 길찾기 알고리즘을 이용하여 이동시킨다면? 1프레임안에 모든 연산을 끝낼 필요는 없다, 시간을 초과한다면 프레임이 밀리면서 렉현상이 발생한다, 여러프레임에 걸쳐 분할하여 실행시키도록 하면된다.

 

 

public class GameScene : BaseScene
{
    class Test
    {
        public int Id = 0;
    }

    // 코루틴 //
    /*
     1. 함수의 상태를 저장/복원 가능!
        => 언제 사용?
            1) 엄청 오래 걸리는 작업을 잠시 끊거나
            2) 원하는 타이밍에 함수를 잠시 stop /복원 하는 경우
     2. return 할때는 우리가 원하는 타입으로 가능, 심지어 class도 가능
     */ 
    class CoroutineTest : IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
            /*
            //yield라는 개념!
            yield return new Test() { Id = 1 };
            // yield break; // 영구적인 종료!
            yield return null; // 종료가 아니라 일시정지하되 뱉는 값이 null
            yield return new Test() { Id = 2 };
            yield return new Test() { Id = 3 };
            yield return new Test() { Id = 4 };
            */

            for (int i = 0; i < 1000000; i++)
            {
                if(i % 10000 == 0)
                    yield return null;
            }
        }
    }


    //void Awake() //Start()를 써도 되지만 꺼둔 상태에서는 실행이 안된다. 따라서 꺼둬도 실행이 되는 Awake()를 사용한다.
    //{
    //    Init();
    //} // 만약 GameScene에서 Awake()하지 않고, BaseScene에서 Awake()하면 어떻게 되는가? //실행됨
    //따라서 최상위 부모인 BaseScene에서 Awake()한다면 자식에서 Awake() 하는 것을 까먹더라도 실행이 된다. // 최상위부모에 Awake()해주자.
    protected override void Init()
    {
        base.Init();
        SceneType = Define.Scene.Game;

        Managers.UI.ShowSceneUI<UI_Inven>();

        //for (int i = 0; i < 5; i++)
        //{
        //    Managers.Resource.Instantiate("Alice");
        //}

        CoroutineTest test = new CoroutineTest();
        foreach(System.Object t in test)
        {
            Test value = (Test)t;
            Debug.Log(value, Id);
        }
    }
    public override void Clear()
    {

    }
}

 

 

사용 예시)

만약 몬스터를 잡아서 아이템을 생성하는 함수가 있다고 가정하자.

코드 상으로 어떤 아이템을 만들지 코딩한 다음 db상으로 저장하라고 던져줌.

만약 db에서 저장되는 것을 기다리지 않고 바로  다음 로직을 실행하게 된다면?

db요청에 실패한다면? db에 아이템 생성이 저장되지 않을 수 있다.

게임세상과 db사이에 괴리감 발생,

그렇다면 잠시 멈춘 다음 db에 요청 후 db에서 저장 성공 메세지가 오면 그 다음 로직을 진행하는게 좋다.

상태 관리 필요

 

 

시간관리

728x90
반응형

댓글