오늘 한 일
- 챌린지반 과제 풀이 (InputSystem에서 키 바인딩 덮어씌우기)
- 팀 프로젝트 진행 (UI 상호작용, 게임 기본 로직, 파워업 추가)
- 특강 듣기 (유니티의 다양한 직군)
작업을 다수의 프레임에 분산하는 메서드로 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
왠지 이 코루틴을 굉장히 많이 사용하게 될 것 같다는 느낌이 든다;