2024. 9. 11. 20:31ㆍ카테고리 없음
개요
코루틴에 대해서 알아보자.
내용 - 코루틴이란?
코루틴은 IEnumerator를 반환하는 함수이다.코루틴은 따로 작동하는게 아닌 전체 흐름에서 잠깐동안 작동을 하는거다.
코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니다.
대부분의 경우 메서드를 호출하면 실행을 완료한 뒤 호출한 메서드에 제어와 선택적 반환 값을 반환합니다. 즉 메서드 내에서 발생한 모든 행동은 단일 프레임 업데이트 내에서 발생해야 합니다.
시간의 흐름에 따른 이벤트의 시퀀스나 절차상의 애니메이션을 포함하기 위해 메서드 콜을 사용하고자 하는 상황에서 코루틴을 사용할 수 있습니다.
코루틴의 동기 작업은 여전히 메인 스레드에서만 실행이 됩니다. 그래서 메인 스레드에 소요되는 CPU 시간을 줄이려면 다른 스크립트 코드에서와 마찬가지로 코루틴의 작업 차단을 방지하는 것이 중요합니다.
내용 - 코루틴 함수 생성방법
코루틴은 Ienumerator반환 타입과 바디 어딘가에 포함된 yield 반환문으로 선언하는 메서드입니다.
예시)
IEnumerator Fade()
{
Color c = renderer.material.color;
for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
{
c.a = alpha;
renderer.material.color = c;
yield return null;
}
}
yield return null 라인은 실행이 일시 정지되고 다음 프레임에서 다시 시작되는 지점입니다. 코루틴 실행을 설정하려면 다음과 같이 StartCoroutine함수를 사용해야 합니다.
예시)
void Update()
{
if (Input.GetKeyDown("f"))
{
StartCoroutine(Fade());
}
}
Fade 함수의 루프 카운터는 코루틴의 수명 동안 올바른 값을 유지하며 다른 변수나 파라미터는 yield 문 간에 보존됩니다.
내용 - 코루틴 시간지연
기본적으로 Unity는 yield 문 다음 프레임에 코루틴을 다시 시작합니다. 시간 지연을 도입하려면 다음과 같이 WaitForSeconds를 사용합니다.
예시)
IEnumerator Fade()
{
Color c = renderer.material.color;
for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
{
c.a = alpha;
renderer.material.color = c;
yield return new WaitForSeconds(.1f);
}
}
내용 - 코루틴 정지
StopCoroutine과 StopAllCoroutines 을 사용하여 코루틴을 정지할 수 있습니다. 코루틴에 연결된 게임오브젝트를 비활성화하기 위해 SetActive를 false로 설정하면 코루틴이 정지됩니다.
내용 - 코루틴 시작코드
코루틴의 모든 시작 코드(코루틴 메서드의 시작부터 첫 번째 yield문까지)는 Unity가 코루틴을 시작할 때마다 트레이스에 나타납니다. 시작 코드는 StartCoroutine 메서드가 호출될 때마다 종종 나타납니다
내가 사용한 코루틴 코드
public void Shuffle()
{
Time.timeScale = 0.0f;
shuffleImage.SetActive(true);
audioSource.PlayOneShot(clip);
int[] arr = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
arr = arr.OrderBy(x => Random.Range(0, 15)).ToArray();
for (int i = 0; i < 16; i++)
{
float x = (i % 4) * 1.4f - 2.1f;//-2.1,-0.7,+0.7,2.1
float y = (i / 4) * 1.4f - 3.0f;//-3.0,-1.6,-0.2,1.2
if(cardList[arr[i]]!=null)cardList[arr[i]].transform.position = new Vector3(x, y, -1f);
}
StartCoroutine(WaitFor(0.5f));
}
IEnumerator WaitFor(float delayTime)
{
yield return new WaitForSecondsRealtime(delayTime);
Time.timeScale = 1.0f;
shuffleImage.SetActive(false);
}
코루틴 해석
1. StartCoroutine(WaitFor(0.5f)); :
- StartCoroutine가 코루틴의 시작을 알린다
- WaitFor(0.5f)라는 함수를 호출
2. IEnumerator WaitFor(float delayTime) :
- IEnumerator형을 반환하는 함수 생성
- WaitFor이라는 함수생성
- 실수형 매개변수 delayTime생성
3. yield
- 양보하다
4. return
- 반환하다
5. WaitForSecondsRealtime(delayTime)
- WaitForSceondsRealtime으로 하면 진짜시간이 흐르는 거야서 delayTime동안 흐른다.
- (참고)WaitForRealtime만 하면 프로그램 자체의 시간이기 때문에 시간이 0.5초만큼 안흐른다.
6. Time.timeScale :
유니티프로그램 자체의 시간이다
전체해석
StartCoroutine를 만나면 WaitFor이라는 함수가 실행이된다.
WaitFor내용은 = 0.5초만큼의 진짜시간을 기다린뒤에 돌아올떄까지 양보할게 그 다음에 양보한 시간 돌아오게끔 timeScale = 1.0f로 만든다.