ecsimsw

Coroutine 본문

Coroutine

JinHwan Kim 2019. 3. 7. 10:59

Coroutine

- 총알 발사시 muzzle flash를 출력하도록 하다가 불꽃의 지연 시간을 딜레이가 아닌 코루틴으로 처리하는 방법을 공부하게 되었다.
Muzzle flash는 구글링으로 이미지 파일을 다운로드 한 후 gameObject - 3D object - Quad를 생성하고 메테리얼로 해당 이미지를 대입하여 만들었다.
  • MuzzleFlash
    - 총알을 발사할때마다 불꽃 오브젝트가 유효했다가 1초 후에 다시 무효로 되는 코드를 짜면 발사시 불꽃을 구현할 수 있을 것이다.
      만약 이런 상황에서 이 코드를 MuzzleFlash.enabled = true -> Thread.sleep(1000) -> MuzzleFlash.enabled = false 으로 처리한다면 sleep 동안 프로그램이 동작하지 못할 것이고, 다른 스레드를 만들어 멀티 스레딩으로 1초를 세고 처리한다니 너무 귀찮을 것이다.
      물론 MuzzleFlash 자체가 instinate 후 1초가 지나고 자동 distruct 하도록 할 수 있겠지만, 위치가 고정된 상황이고 개수가 하나인 단순히 꺼졌다 켰다를 반복하면 될 상황에서, 생성자와 소멸자를 너무 많이 쓰는 것은 과한 것 같다.
      이렇게 함수를 나눠서 사용하고 싶을때, 처리를 일부러 지연 시키고자 할때 코루틴을 사용하면 매우 편하다.
  • Coroutine
    - 코루틴은 함수를 나눠서 처리할 수 있도록 도와주는 함수 형식이다. 실행을 중지하여 Unity에 제어권을 돌려주고, 다음 호출 시 이전 중단 부분 이후의 실행을 처리한다.
    StartCoroutine("methodName")
    - StartCoroutine 함수명을 주는 것으로 코루틴을 실행하고, IEnumerator 형식을 반환값하여 yield return 구문을 사용하는 것으로 함수를 나눠 반환한다.
      yield 직후의 프레임이 재개되지만 리턴으로 WaitForSeconds 함수를 반환하는 것으로 시간 지연 후 이후 처리를 가능하도록 한다.
  • Example
    "IEnumerator ShowMuzzleFlash()" IEnumerator ShowMuzzleFlash() { MuzzleFlash.enabled = true; MuzzleFlash.transform.localRotation = Quaternion.Euler(new Vector3(90, Random.Range(80,100), 278)); MuzzleFlash.transform.localScale = Vector3.one * Random.Range(0.3f, 1.5f); yield return new WaitForSeconds(0.1f); MuzzleFlash.enabled = false; }

'Etc > Unity' 카테고리의 다른 글

Socket connection  (3) 2019.02.27
Blend Tree  (0) 2019.02.25
Transition  (0) 2019.02.24
Mecanim  (0) 2019.02.23
Input Class / Input Manager / GetKey / GetButton  (0) 2019.02.22
Comments