본문 바로가기
게임 개발/유니티

Coroutine()

by FlowTree 2020. 3. 22.
반응형

Coroutine()

  • 코루틴은 함수 실행 시 일시 중지를 할 수 있는 메서드이다.
  • 코루틴으로 함수 실행을 일시 중지하고, 중지 동안에는 프로그램의 다른 코드를 실행한다.
  • 일시 중지가 끝나면 프로그램의 처리가 코루틴의 마지막 실행줄로 되돌아간다.
  • 그리고 남은 처리를 이어서 진행한다.
  • 코루틴은 최적화하기 좋다.
  • 너무 많이 반복할 필요가 없을 때, 함수를 매 프레임마다 많이 호출하면 오버헤드가 발생될 때 코루틴을 사용하여 호출 간격을 줄일 수 있다.

Coroutine() 문법

IEnumerator 코루틴이름()
{
    //코루틴으로 실행할 기능
    for (var f = 1.0; f >= 0; f -= 0.1) 
    {
        var c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        
        //초 단위로 일시 정지하기
        yield WaitForSeconds(0.1f); //0.1f만큼 일시 정지함
    }

}

 

Coroutine 실행 코드

StartCoroutine(코루틴이름());
StartCoroutine("코루틴이름");

 

Coroutine 정지 시간 코드

//초 단위로 쉬기
yield return new WaitForSeconds(시간);

//한 프레임만 쉬기
yield return null;

 

예문 - 적 AI 탐지 기능

    void Start()
    {
        //게임 오브젝트 활성화와 동시에 AI의 탐지 루틴 시작
        StartCoroutine(UpdatePath());
        tr = GetComponent<Transform>();
    }
    
    
    //추적할 대상의 위치를 주기적으로 찾아 경로 갱신
    private IEnumerator UpdatePath()
    {
        //살아 있는 동안 무한 루프
        while(!dead)
        {
            if (hasTarget)
            {
                Attack();
            }
            else
            {
                //추적 대상이 없을 경우, AI 이동 정지
                pathFinder.isStopped = true;
                canAttack = false;
                canMove = false;

                //반지름 20f의 콜라이더로 whatIsTarget 레이어를 가진 콜라이더 검출하기
                Collider[] colliders = Physics.OverlapSphere(transform.position, 20f, whatIsTarget);

                //모든 콜라이더를 순회하면서 살아 있는 LivingEntity 찾기
                for (int i = 0; i < colliders.Length; i++)
                {
                    //콜라이더로부터 LivingEntity 컴포넌트 가져오기
                    LivingEntity livingEntity = colliders[i].GetComponent<LivingEntity>();

                    //LivingEntity 컴포넌트가 존재하며, 해당 LivingEntity가 살아 있다면
                    if (livingEntity != null && !livingEntity.dead)
                    {
                        //추적 대상을 해당 LivingEntity로 설정
                        targetEntity = livingEntity;

                        //for문 루프 즉시 정지
                        break;
                    }
                }
            }

            //0.25초 주기로 처리 반복
            yield return new WaitForSeconds(0.25f);
        }
    }

 

 

참고 링크

 

https://docs.unity3d.com/kr/530/Manual/Coroutines.html

 

유니티 - 매뉴얼: 코루틴(Coroutine)

게임 오브젝트 생성 및 삭제 특수 폴더와 스크립트 컴파일 순서 코루틴(Coroutine) 함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수행된다는 것을 의미하고, 함수 호출은 절차적 애니메이션을 포함하거나 시간의 경과와 함께 일련의 이벤트에는 사용할 수 없습니다. 예를 들어, 오브젝트의 알파(투명도)가 완전히 투명해질 때까지 서서히 계속 감소하는 장면을 상정했다고 합시다. void Fade() {

docs.unity3d.com

 

http://theeye.pe.kr/archives/2725

 

Unity C# – Coroutine 알아보기 | 아이군의 블로그

유니티에서 사용되는 코루틴(Coroutine)은 왜 필요한가? 유니티에서 화면의 변화를 일으키기 위해서는 Update() 함수 내에서 작업을 하게 됩니다. 이 Update() 함수는 매 프레임을 그릴때마다 호출되며 60fps의경우라면 초당 60번의 Update() 함수 호출이 발생하게 됩니다. 하나의 프레임 안에서 어떤 작업을 한다면 이 Update() 함수에 코드를 작성하면 될 것입니다. 하지만 다수의 프레임을 오가며 어떤 작업을 수행해야 한다면 어떻게

theeye.pe.kr

 

반응형

'게임 개발 > 유니티' 카테고리의 다른 글

Unity Remote 5  (0) 2020.04.04
유니티 시네머신  (0) 2020.04.04
Instantiate(), Destroy()  (0) 2020.02.19
Input. 메서드 정리(GetAxis, GetButton, GetKey, GetMouseButton)  (0) 2020.02.19
Collider, OnTrigger, OnCollision  (0) 2020.02.19

댓글