coroutine

정제로·2023년 9월 22일
0

Unity

목록 보기
15/19

Coroutine

업데이트 문에서, 일시적으로 돌아가줘야는 서브동작을 구현하면,
그 동작을 멈추고 실행하는 부분을 해결해줘야 하기에,
비대한 업데이트문을 만들거나, 유지보수가 굉장히 어렵게 한다!

이렇게 한 컴포넌트 내에서 업데이트와 다르게 잠깐동안 실행되어야 하는 서브동작을 구현하기 위해, 어떠한 다른 작업이 처리되는 것을 기다려야하는 코드를 작성해야할때, 코루틴을 이용한다!

예시

예시로 스페이스키를 누르면, 점프를 한다고 가정하고, 점프를 하면 2초동안 점프를 못하게 막는 코드를 만들었다.

1.스페이스 키를 누르면 isDelayed가 false일때, isdelayed를 true로 바꿔주며, Jump라는 문자열을 출력하고, 아닌경우에는 Delay라는 문자열을 출력한다

  1. 추가 조건으로 isDelayed가 참이면, 타이머의 값을, 로컬타임이 흘러가는 만큼 증가시켜주고, 타이머가 delayTime(2f)보다 크거나 같다면, timer를 0으로 만들어주고, isDelayed를 false로 바꿔줘서, space를 입력했을때, Jump가 출력되게 했다

    이렇게 적용이 된다.

하지만 이런방법은 너무나 업데이트가 자체적으로 해야할 일이 많아지고, 비대해지고, 나중에 유지보수가 어렵게 된다는 단점이 있기에,

원하는 시점에 잠시 종료해줘야하는 (2초기다려야하는)코드를 코루틴으로 만들면, 유지보수가 쉬워질 뿐더러 가급적 사용을 지양해야하는 업데이트문을 덜 비대하게 만들수 있어진다

코루틴 실행법!

간단한 사용법 3개가 있다.

일단 코루틴은 IEnumerator라는 반환형을 사용해야 한다.
그리고 무조건 내부에 코루틴을 제어할 수 있는 yield return이라는 반환값이 들어가야 한다.

예를들어

IEnumerator Func() 
{
	//yield return null; => 1프레임 기다림
	yield return new WaitForseconds(2f);
}

라고 한다면, 코루틴이 실행되기까지 2초 기다리게 된다.
그 이후, 저 yield아래쪽에 있는 코드들이 실행된다.

그 다음 원하는 코루틴을 StartCoroutine();을 이용하여 사용한다.

코루틴 사용시 주의사항! (매우 중요)

주의사항1

코루틴을 start메서드가 호출된 이후, 게임오브젝트가 활성화된(setactive(true)) 이후에 사용해주어야 한다.

start가 호출되기 이전인 Awake나, 게임오브젝트가 비활성화 된 상태에서 실행하게 되면, 에러가 나게 된다.

주의사항2 (매우중요!!)

코루틴을 서브업데이트처럼 사용하기 위해, 코루틴함수를 무한루프를 돌릴경우이다.

이렇게 무한루프를 돌릴, 혹은 반복문 외부에서 yield return을 해주는 경우가 심심찮게 많다.

이렇게 코드를 작성해도 아~~~무 오류가 나오지 않는데, 저장후 프로젝트를 실행하게 되면, 프로젝트가 오류가 나며 멈춰서 꺼져버린다.

이유는 반복문 내에서 코루틴을 제어할 수 있는 yield return이 없기 때문...
코루틴이 코드 제어권을 독점해버려서 게임이 멈추는것이다.

코루틴 사용 예시

이렇게 4가지 방법으로 코루틴을 시작해줄 수 있다.

코루틴 사용 중지법

1.

2.

3.
이렇게 사용한다.
이중에 두번째 방법은, 인자값을 1개밖에 넣지 못하므로,
인자값이 없는 코루틴메서드거나 1개이하인 경우에만 사용하는것이 좋다

ㅤㅤㅤ
ㅤㅤㅤㅤ
첫번째 방법과 세번째 방법의 차이점은..

만약 첫번째 방법에서
코루틴메서드를 100개 실행하고,.종료한다라고 가정해보자..
그럼 인자값이 100개인 메서드일경우 100개를 계속 입력해줘야 할것이다..
굉장히 귀찮은 작업이 되지않을가 싶다..

그래서 3번째 방법을 이용하면, 한번의 초기화만으로 그 코루틴 메서드를 전부 관리할 수 있기때문에, 상황에 맞춰 사용하면 될것같다!

그냥 주의사항!

모든 프로그래밍 언어가 그렇듯, 문자열 비교는 최대한 지양해야한다.
이유는, 코스트가 굉장히 많이 드는 작업이기 때문이다.
그래서 사용법4번중지법2번은 지양하자!

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글