· [중급자를 위한 유니티 스크립팅 튜토리얼] - Static
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 제네릭(Generic)
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 상속
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 다형성
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 인터페이스
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 확장 메서드
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 네임스페이스
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 리스트
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 딕셔너리
이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.
-----------------------------------------------------------------------------------
코루틴(Coroutine)
코루틴은 일정한 간격으로 실행되는 메서드라고 생각할 수 있다.
이러한 메서드는 특별한 yield문과 함께 작동하여 메서드 밖으로 코드 실행을 반환한다.
그런 다음 메서드가 계속될 때, 중단된 지점부터 다시 시작된다.
솔직히 뭔 소린지 모르겠다.
코루틴의 정의보다는 기능을 중점으로 설명하자면
코루틴은 메서드의 실행을 유동적으로 조절할 수 있게 하는 기능이다.
해당 메서드의 작업을 원하는 시점에 중단시키고, 원하는 시점에 재개할 수 있으며
메서드의 실행을 여러 프레임에 분산시켜 실행할 수 있다.
-----------------------------------------------------------------------------------
먼저 코루틴의 문법에 대해 알아보자
첫 번째로 살펴볼것은 코루틴 메서드이다
코루틴 메서드는 인터페이스 IEnumerator를 반환하는 메서드이다
즉 인터페이스 IEnumerator를 구현하는 모든 것을 반환할 수 있다.
두 번째로 살펴볼것은 yield return null이다. return은 익숙한데 yield return은 무엇일까?
yield는 양보한다는 뜻이다. 즉 메서드의 실행을 양보(중지)하고 return null , 다음 프레임까지 대기하겠다는 뜻이다.
return null에 대해서는 나중에 설명하겠다.
그 다음 살펴볼건 Start메서드 내에 StartCoroutine메서드이다.
이 메서드는 string 매개변수로 코루틴 메서드의 이름을 받아
해당 이름을 가진 코루틴 메서드를 시작하겠다는 뜻이다.
그렇다면 이 코루틴 메서드의 실행을 한 줄 한 줄 따라가 보겠다.
1. 일단 start메서드에서 코루틴을 시작했으니 코루틴 메서드가 시작된다.
2. while 조건을 검사하고 참이기 때문에 num값을 1증가시킨다.
3. num값을 출력한다.
4. 코루틴 메서드의 실행을 yield(양보)한다. 따라서 나머지 코루틴 메서드의 실행은 중지되고 다음 프레임까지 대기한다(return null이기 때문에)
5. 여러 이벤트 함수의 실행 순서를 거쳐 코루틴의 순서가 왔다.
6. 다시 while조건을 검사하고 참이기 때문에 while 내부의 로직을 처리한다.
7. yield문을 만났기 때문에 다시 양보한다. 다음 프레임까지 대기.
...
이런식으로 총 100프레임 동안 코루틴 메서드가 진행된다.
-----------------------------------------------------------------------------------
yield 뒤에는 무엇이 올까?
우리는 null을 반환했다.
이는
"뭐... 특정 조건은 없고 다음 프레임까지 대기하셈" 이라는 뜻이다
yield 뒤에는 다양한 기능이 올 수 있다.
yield return WaitForSecond(second)는 넘겨준 second만큼 대기 후 다시 재개
yield return WaitForEndOfFrame()은 현재 프레임이 끝날때까지 대기 후 재개
yield break 코루틴을 즉시 종료
-----------------------------------------------------------------------------------
코루틴은 프로퍼티와 조합했을 때 더욱 강력해진다.
영상에서 훔쳐온 코드라 간단하게 설명하자면
플레이어가 땅 클릭시 클릭한 땅 좌표를 target값으로 set한뒤
코루틴을 통해 target값으로 물체를 이동시키는
클릭이동 기능을 구현한 것이다.
프로퍼티와 코루틴을 조합해
프로퍼티의 값이 변경될때(땅을 클릭했을때)
즉시 프로퍼티값이 의미하는 좌표로 이동하는 기능을 간단하게 구현할 수 있다.
-----------------------------------------------------------------------------------
유니테스크 없는 시대에 태어난 그뿐의 범부여
start와 첫 update는 한 프레임 안에서 실행되기 때문 아님?
Start에서 코루틴 실행 > 1프레임 대기 > 프레임 넘어가기 전에 첫 Update 실행 > 다음 프레임 > 정상작동
메서드는 stack에 쌓여서 호출되기 때문에 먼저 쌓이는 넘이 먼저 호출되서 처리됨스택 : start()start 실행중 코루틴을 스택에 추가스택 : start() -> corourine()coroutine() 실행coroutine yield스택 : start()start() 종료update() stack에 추가스택 : update()update 호출update() 종료스택 : coroutine() stack에 추가스택 : coroutine()update 실행coroutine() 실행update 실행.... 반복 - dc App
뭔가 오해가 있는것같음 코루틴은 비동기가 아님...코루틴의 실행은 당연히 코루틴을 실행한 프레임에서 이뤄지는거지 유니티의 생명주기와 관련 없음 Start에서 스타트코루틴으로 코루틴 함수를 호출했으니 스타트 다음에 코루틴이 실행되는건 당연한거임
코루틴 메서드가 업데이트 이후에 실행되는 실행순서의 보장이 아님 코루틴 메서드도 일반 메서드와 동일하게 동작함 다만 유니티 PlayerLoop안에서 Update이후에 yield를 체크해서 코루틴의 분기를 바꿔주기때문에 마치 비동기처럼 동작하는것처럼 보일뿐임 실상은 Update에서 델타타임 더해서 시간체크하는거랑 크게 다르지 않음
헉 제가 잘못이해한채로 올렸나봐요 다른분들이 잘못알수도있어서 일단 지웠습니다