0. 들어가며..
전에 코루틴 예제를 나름 간단하면서도 실용적인 예제를 만들려고했는데 결론은 실패로 끝난거같았습니다. ㅜ.ㅜ;
(참고 : http://www.gamedevforever.com/251 )
그래서 나름 시간날때 마다 고심을해봤습니다.
물론 매우 길게 장황하게 예제를 만들면 되지만 그렇게 해봤자 안그래도 난해한 코루틴에 더 인상만 않좋을거같아서 간결하면서도 쉬운예제를 고민을 해봤습니다.
그러다가 불현듯 안철수후보의 사퇴 연설을 듣던중 갑자기 스치는 생각이 있어서 짧게 정리 해보았습니다.
1. 문제의 정의
예전에 실용적이지 못했던게 Destroy 함수에 두번째 인자에 시간값을 두어 객체가 파괴되는 시간을 조절할수있었는데 사실 굳이 코루틴을 쓸필요는 없었습니다.
그래서 이번에는....
두둥!~~...
....시간이 아니라...
"거리"......로 바꾸어보았습니다.
...
생각 해보니 좀 억지 스럽기도 하네요 ㅡ.ㅡ;;
2. 대기 함수 만들기
전에 kgc강의에서도 했던 이야기인데요. 사실 비동기 처리때문에 쓰레드를 쓰고 막상 쓰레드가 하는일은 기다리는 일이라는 아이러니가 있다는 말씀을 드렸습니다.
대부분의 코루틴은 그래서 대기 관련 함수입니다.(꼭 대기는 아니더라도 먼가 기다려야하는 것과 관련이 많은 일이죠. 그래서 어느 질문자분의 말씀처럼 io도 그중에서 가장 흔한 예중에 하나고요) 사실 대기하는 동안 넌블럭 상태를 유지하려고 코루틴이나 쓰레드를 쓰는것이죠.
암튼 그래서 ....
일정 거리까지 날라갈때까지 끝나지 않는 함수를 일단 만들어 봅시다.
function WaitDist(dist_limit:float,speed:float) {
var total_dist:float = 0;
var loop:boolean = true;
while(loop) {
total_dist += Time.deltaTime * speed;
if(total_dist > dist_limit) {
loop = false;
}
}
}
이렇게 함수를 만들고
WaitDist(유효사거리 , 탄속);
이런식으로 호출해주면 블럭 상태에 걸리고 말겠죠.
3. 넌 블럭킹을 위한 양보구문
이전에 만들었던 함수에 다음과 같이 몇가지를 추가해줍니다.
function WaitDist(dist_limit:float,speed:float) {
var total_dist:float = 0;
var loop:boolean = true;
while(loop) {
total_dist += Time.deltaTime * speed;
if(total_dist > dist_limit) {
loop = false;
}
yield;
}
}
바로 이와같이 루프문 끝부분에 빨간색 양보 구문을 추가해줍니다.
그리고 호출할때 다음과 같이 해줍니다.
yield WaitDist(유효사거리,탄속);
이렇게 해주면 WaitDist함수가 끝나기 전까지 그다음 라인으로 실행이 넘어가지않지만 그렇다고 블럭 상태에 걸리지도 않습니다.
(자세한 흐름은 이전 강의를 참고해주세요.)
그 다음 라인에서 아래와 같이 해서 객체를 지워주면됩니다.
Destroy(this,gameObject);
4. 결론 & 전체 소스
사실 이번에도 코루틴을 사용하지않은 코드와 비교할때 예제는 코드량이 극단적으로 줄거나 그러지는 않습니다만...
그렇지만 코루틴을 사용하면 Update함수에서는 단순히 객체를 그냥 날라가는것에 중점을 두어 구현 할수있습니다. 그래서 지우는 코드를 만들기위해서 추가적으로 비교구문같은것이 붙지않기때문에 오직 날라가는 효과에만 집중할수있어서 그것도 장점이 될 수 있을거 같습니다
'프로그래밍' 카테고리의 다른 글
WPF로 툴 만들기. MVVM은 부록! #1 (11) | 2012.12.03 |
---|---|
Fast Object Picking (8) | 2012.12.03 |
유니티4의 애니메이션 시스템의 모바일 활용 (5) | 2012.11.23 |
cocos2d-x 스프라이트 애니메이션 ( cocos2d-x sprite animation ) (4) | 2012.11.18 |
유니티 엔진의 코루틴활용예 1편 (16) | 2012.11.05 |