티스토리 뷰
코루틴이란?
실행을 일시 중지하고 Unity에 제어권한을 반환한 후 다음 프레임에서 중단했던 위치에서 계속할 수 있는 함수
코루틴의 특징 : 일반적인 함수는 한번 실행이 되면 종료될 때까지 제어권한을 넘기지 않는다. 간단히 말해 어떤 코드를 읽는 동안에는 다른 코드 실행을 할 수가 없다. 반면에 코루틴 함수는 실행 중에 yield 구문이 나왔을 때 Unity에 제어권한을 양도해줘서 다른 코드를 실행하다가 yield 구문의 조건이 끝났을 때 다시 코루틴 함수로 돌아와서 코루틴을 마저 실행한다.
코루틴 형식 : 코루틴 함수는 반드시 IEnumerator 메서드여야 하고, yield return이 한번 이상 반드시 사용되어야 한다.
IEnumerator 메서드 형식으로 코루틴 함수를 만들고 StartCoroutine 함수로 실행해주면 코루틴 함수가 실행되다가 yield return 구문이 실행될 때 Unity에 제어권한을 양도해줘서 다른 코드를 실행하다가 yield return의 조건이 끝나면 다시 코루틴 함수에 제어권한이 넘어간 뒤 MoveNext 함수를 호출해서 멈춰 있던 코루틴 함수 코드의 다음 부분부터 실행한다.
아래는 yield return 반환 형식의 종류이다.
yield return null | 다음 프레임까지 대기 |
yield return new WaitForSeconds(float) | 지정한 초만큼 대기 |
yield return new WaitForFixedUpdate() | 다음 FixedUpdate까지 대기 |
yield return new WaitForEndOfFrame() | 모든 렌더링 작업이 끝날 때까지 대기 |
yield return StartCoroutine() | 다른 코루틴이 끝날 때까지 대기 |
yield return new WWW(string) | 웹 통신 작업이 끝날 때까지 대기 |
yield return new AsyncOperation | 비동기 작업이 끝날 때까지 대기 |
유니티 엔진에서의 구현 :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineExample : MonoBehaviour
{
public Transform moleTf;
bool isMoving = false;
void Update()
{
if(Input.GetMouseButtonDown(0) && !isMoving)
{
StartCoroutine(MoleCoroutine());
}
}
IEnumerator MoleCoroutine()
{
isMoving = true;
yield return StartCoroutine(MoleTranslate(Vector3.up));
yield return new WaitForSeconds(2f);
yield return StartCoroutine(MoleTranslate(Vector3.down));
isMoving = false;
}
IEnumerator MoleTranslate(Vector3 dir)
{
for(int i = 0; i < 10; i++)
{
moleTf.Translate(dir * 0.1f);
yield return new WaitForSeconds(0.1f);
}
}
}
화면을 클릭하면 두더지가 올라왔다가 내려가는데, 움직이고 있을 때 화면을 클릭하면 멈출 때까지 기다리는 예제이다.
moleTf 변수가 움직일 두더지가 된다.
isMoving 변수는 두더지가 움직이고 있는지 확인해주는 변수이다.
MoleTranslate 코루틴 함수는 매개변수로 들어온 방향으로 두더지를 yield return WaitForSeconds를 사용해 0.1초마다 0.1f만큼 10번 움직여주는 역할이다.
MoleCoroutine 코루틴 함수는 isMoving 변수를 true로 변경해 움직이는 중이라고 알리고 yield return StartCoroutine을 사용해 MoleTranslate 코루틴에 의해서 위로 올라갈때까지 대기하다가 끝나면, 2초 대기, 다시 MoleTranslate 코루틴에 의해서 아래로 내려갈 때까지 대기하다가 끝나면 모든 동작이 끝났으니 isMovnig을 다시 false로 바꾸고 움직이지 않는 중이라고 알리는 역할이다.
아래는 유니티에서 실행했을 때의 모습이다.
'Programming > Unity' 카테고리의 다른 글
[Unity] Background Scroll (배경 이미지 스크롤) (0) | 2023.02.26 |
---|---|
[Unity] 픽셀 아트가 너무 작거나 흐릿하게 보이는 문제 (101) | 2022.12.18 |
[Unity] Pixels Per Unit (3) | 2020.12.06 |
[Unity] Object Pooling (오브젝트 풀링) (114) | 2020.09.05 |
[Unity] Singleton Pattern (싱글톤 패턴) (0) | 2020.08.30 |
- Total
- Today
- Yesterday
- wargame
- reversing.kr
- Level 06
- hackerschool
- xcz.kr
- CodeEngn
- Level 02
- 안드로이드
- HackingCamp
- c++
- Advance RCE
- Level 03
- Write-up
- 풀이
- C#
- Basic RCE
- 유니티
- 멘토링
- Reversing
- Level 04
- Programming
- pwnable
- unity2d
- Level 05
- ftz
- Level 01
- Unity
- 안드로이드 멘토링
- Android
- 17th HackingCamp CTF
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |