2014. 7. 31. 14:43ㆍ프로그래밍/Coroutine
이번 글에서는 이미지의 이동과 관련한 코루틴을 작성해보려합니다.
현재위치보다 지정높이만큼 위에서 시작하여 현재위치로 떨어지는 듯한 이펙트로 활용가능한 코루틴입니다.
주로 이펙트로 사용할 로직이다보니 이동을 하고나서, 원래 위치로 돌아와야 다음에 사용할 때 제위치에서 동작할 수 있을 겁니다.
그래서 코루틴 로직 종료시점에 이미지를 원래 위치로 복귀시키는 로직을 작성해봅시다.
//내용
//지정 높이만큼 다운(-면 업) 이동 후 제자리로
// img 를 downHeight 값만큼 totalTime시간동안 아래로 이동시킨 다음
// init이 트루면 모든동작이 끝나고 initTimer 시간이후 원래자리로 돌아간다
{
yield return new WaitForEndOfFrame();
float elapseTime = 0f;
Vector3 downVctor = new Vector3(0f,downHeight,0f);
Vector3 tempVctor = img.transform.localPosition;
while(elapseTime < totalTime)
{
elapseTime +=Time.deltaTime;
if(elapseTime >= totalTime) elapseTime = totalTime;
img.transform.localPosition = tempVctor - (downVctor*elapseTime/totalTime);
yield return new WaitForEndOfFrame();
}
if(init)
{
elapseTime = 0f;
while (elapseTime < initTimer)
{
elapseTime +=Time.deltaTime;
yield return new WaitForEndOfFrame();
}
img.transform.localPosition = tempVctor;
}
}
결국 코루틴이라는 것은 양보구문을 통한 주고받기로 자신만의 시간을 가지는 서브루틴인데,
이 서브루틴도 문장이 종료되면 끝난다는 것은 마찬가지 입니다.
Update 함수처럼 자기 루틴을 가지는 것은 while문과 같은 반복문을 이용하였기 때문입니다.
이 반복문안에 양보구문이 존재하기 때문에 지금의 코루틴 동작이 유효하게 되는 것이죠.
결국, 반복문과 양보구문이 없다면 기존의 IEnumerator 를 반환하지 않는 메소드들과 동일한 것입니다.
그래서 코루틴의 종료시점은 곧 반복문이 끝나고 최종 } 를 통과할 때라는 것을 알 수 있습니다.
반복문 종료 후 최종 } 를 만나기 전, 위 함수의 파란글씨로 된 if 문 부분이 우리가 원하던 부분이 됩니다.
지금까지 제가 작성하여 예를 들어드리고 있는 코루틴들의 로직 자체는 이해하기 어렵지 않은 수준이라고 생각하여 풀이하지 않았습니다.
'코루틴' 카테고리의 글들을 통해서 여러분에게 보여드리고자 하는 것은 코루틴의 활용과 응용방법일 뿐입니다.
이런식으로 코루틴을 사용하면 이런 방식의 알고리즘이 된다라는 것을 간단히 이해하시고, 각자의 프로젝트에서 활용하시면 센스있는 코루틴 로직이 많이 등장하리라고 생각합니다.
활용
'프로그래밍 > Coroutine' 카테고리의 다른 글
StopCoroutine() 의 활용 (0) | 2015.06.16 |
---|---|
KhjCoroutines - AniSprite (0) | 2014.08.25 |
KhjCoroutines - AlphaOnOffLoop (0) | 2014.07.31 |
KhjCoroutines - ScaleChange (0) | 2014.07.30 |
KhjCoroutines - AlphaChange (0) | 2014.07.29 |