내일배움캠프 6주차 1일차 TIL - Coroutine

백흰범·2024년 5월 20일
0
post-thumbnail

오늘 한 일

  • 챌린지반 과제 풀이 (InputSystem에서 키 바인딩 덮어씌우기)
  • 팀 프로젝트 진행 (UI 상호작용, 게임 기본 로직, 파워업 추가)
  • 특강 듣기 (유니티의 다양한 직군)


Coroutine

개념

작업을 다수의 프레임에 분산하는 메서드로 Unity에서 코루틴은 실행을 일시정지하고 제어를유니티에 반환하지만, 중단된 부분에서 다음 프레임을 계속할 수 있는 메서드입니다. (비동기처럼 작동하는 것처럼 보이지만, 엄연히 메인 스레드에서 실행되는 동기 작업입니다.)

함수와 코루틴의 차이

  • 함수는 return을 만날 때까지 계속 제어권을 가지게되는 반면에 코루틴은 yield return을 통해서 중간 지점에서 제어권을 반환했다가 다시 조건을 충족하면 제어권을 가져오는 방식으로 작업을 처리한다.


사용방법

코루틴 메서드 선언하기

IEnumerator Coroutine1()	//IEnumerable랑 헷갈리지 않게 조심해야한다.
{
	// 처리하고자 하는 코드
	yield return null; //yield return을 반드시 넣어줘야한다.
    // yield return null 이후 실행해줄 코드
} // 여기까지 와야 코루틴 끝

코루틴 사용하기

StartCoroutine(Coroutine1());
StartCoroutine("Coroutine1"); // 문자열로도 가능하다.
  • 성능상 문자열보다는 메서드 형태로 전달해주는 것이 좋다.

사용할 때 주의사항

  • Awake에서 실행하면 잘 작동이 안될 수도 있다.
    (Awake의 호출 순서 때문이다(오브젝트 활성화 전에 호출))
  • 비활성화 상태에서 코루틴을 동작시키려하면 작동이 안된다.

코루틴의 다양한 제어점 반환

yield return null

  • 다음 프레임까지 대기 후 실행

yield return new WaitForFixedUpdate()

  • 다음 FixedUpdate가 호출될 때까지 대기 후 실행

yield return new WaitForEndOfFrame()

  • 현재 프레임이 종료될 때까지 대기 후 실행

yield return new WaitForSeconds(float)

  • 지정한 초만큼 대기 후 실행
    Update와 LateUpdate 사이에서 실행

yield return new WaitForSecondsRealtime(float)

  • 괄호 안의 시간(초)이 지날 때까지 대기 후 실행
    (timeScale의 영향을 안 받음)
    Update와 LateUpdate 사이에서 실행

yield return new WaitUntil()

  • 괄호 안의 조건이 만족할 때까지 대기 후 실행
    Update와 LateUpdate 사이에서 실행

yield return new WaitWhile()

  • 괄호 안의 조건이 만족하지 않을 때까지 대기 후 실행
    Update와 LateUpdate 사이에서 실행

yield return StartCoroutine()

  • 다른 코루틴이 끝날 때까지 대기 후 실행

코루틴 멈추기

yield break

  • 이 코드가 적힌 시점에서 코루틴을 멈춘다

코루틴에게 매개변수 전달

StartCoroutine(Coroutine1(매개변수1, 매개변수2, 매개변수3));
StartCoroutine("Coroutine1", 매개변수_단일);
// 메서드로 보내면 여러 개를 보낼 수 있고 문자열로 보내면 하나 밖에 못 보낸다

코루틴 외부 상호작용

외부에서 멈추기

StopCoroutine("Coroutine1") // 문자열로 시작했을 때에만 가능하다.

// 다른 방법
Coroutine myCoroutine1;

{
	myCoroutine1 = StartCoroutine(Coroutine1());
    ...
    StopCoroutine(myCoroutine1); // 접근만 된다면 다른 클래스에서도 사용 가능하다.
}

스크립트 내 코루틴 모두 멈추기

StopAllCoroutine(); // 스크립트 내 코루틴 모두 멈추기


주요 사용 용도

  • 주로 일시적인 효과 처리나 시간차 호출이 필요할 경우에 사용한다.
  • Update보다 보다도 유연한 시간 처리가 가능하다 (다양한 제어점 반환 옵션이 존재하기 때문)

아이템의 지속 시간 처리

   public void StartSpeedUP() // 외부 접근용 메서드
   {
   		// 지속된 효과가 없다면 효과를 시작하고, 존재한다면 계속 쌓아준다.
       if (speedUPDuration <= 0) { StartCoroutine(SpeedUP()); }
       else { speedUPDuration += 10; }
   }

   IEnumerator SpeedUP() // 스피드 코루틴
   {
       speedUPDuration += 10; 	// 초기 지속 시간 갱신
       speedUP = 2f;			// 속도 배수
       while (speedUPDuration > 0) // 시간이 0보다 작아질 때까지 계속
       {
           yield return new WaitForSeconds(1f); // 1초 대기
           speedUPDuration -= 1; // 1초 감소
       }
       speedUP = 1f; // 지속 시간이 끝나면 원래대로
   }


다양한 아이템을 시간 차를 다르게해서 생성하기

    void Start()
    {
        StartCoroutine(SpawnFood());
        StartCoroutine(SpawnAvoidFood());
        StartCoroutine(SpawnPowerUPs());
    }

    IEnumerator SpawnFood()
    {
        while (true)
        {
            yield return new WaitForSeconds(foodSpawnSpeed);
            Instantiate(food);
        }
    }

    IEnumerator SpawnAvoidFood()
    {
        while (true)
        {
            yield return new WaitForSeconds(AvoidfoodSpawnSpeed);
            Instantiate(avoidFood);
        }
    }

    IEnumerator SpawnPowerUPs()
    {
        while (true)
        {
            yield return new WaitForSeconds(PowerUPSpawnSpeed);
            Instantiate(powerUP);
        }
    }



참고 자료

베르의 게임 개발 유튜브

케이디

KKIMSSI




작성하면서 느낀점

왠지 이 코루틴을 굉장히 많이 사용하게 될 것 같다는 느낌이 든다;

profile
게임 개발 꿈나무

0개의 댓글