2014. 7. 31. 14:27ㆍ프로그래밍/Coroutine
이번엔 지난 AlphaChange 를 일회성이 아닌 반복해서 보여지도록
Loop로직을 작성해보려합니다.
//내용
//알파값 토글 반복
//onTime기간동안 0->1 (or) offTime기간동안 1->0 변환하는 토글, crescendo면 0->1 반대는 1->0부터 토글을 시작한다
//무한루프일 경우 roop변수를 트루, 아닐경우 펄스하고 반복횟수를 cnt로 조정해준다
public IEnumerator AlphaOnOffLoop(UISprite img, float onTime, float offTime, bool crescendo = true, bool roop = false, int cnt = 1)
{
yield return new WaitForEndOfFrame();
float elapseTime = 0f;
int nowCnt = 0;
bool halfEnd = false;
while(roop || nowCnt < cnt)
{
elapseTime+= Time.deltaTime;
if(crescendo)
{
img.alpha = elapseTime/onTime;
if(elapseTime >= onTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
else
{
img.alpha = 1f - elapseTime/offTime;
if(elapseTime >= offTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
yield return new WaitForEndOfFrame();
}
}
내부에서 조건 만족시 crescendo를 토글시켜주면서 무한반복 혹은 카운트만큼 반복시키고 있다.
인자값의 onTime, offTime 으로 켜지는데 걸리는 시간 꺼지는데 걸리는 시간을 따로 지정할 수 있다.
지난 기본메소드에 추가된 것은 디폴트 인자를 지정했다는 점이다.
bool crescendo = true, bool roop = false, int cnt = 1
처럼 디폴트값을 지정해주면 사용자가 필요없을경우 인자로 넘기지 않아도 된다.
사용시 주의할점은 디폴트 인자가 여러개일때 중간의 인자들은 디폴트값을 사용하더라도,
마지막 인자를 변환하기위해 인자를 넘기려고 한다면,
디폴트 인자들도 값을 다 넣어줘야한다는 점이다.
그래야 어떤 변수에 인자를 넣은 것인지 컴파일러가 확정할수 있기 때문이다.
활용
StartCoroutine( KhjCoroutines.Instance.AlphaOnOffLoop( img, 1f, 1f, false, true ) );
StartCoroutine( KhjCoroutines.Instance.AlphaOnOffLoop( img, 1f, 1f, true, false, 5 ) );
//추가내용 // 알파루프의 최소알파값을 0 이아닌 지정한 변수로 하여 반복
public IEnumerator AlphaMinOnOffLoop(UISprite img, float minimunAlpah, float onTime, float offTime, bool crescendo = true, bool roop = false, int cnt = 1)
{
yield return new WaitForEndOfFrame();
float elapseTime = 0f;
int nowCnt = 0;
bool halfEnd = false;
while(roop || nowCnt < cnt)
{
elapseTime+= Time.deltaTime;
if(crescendo)
{
img.alpha = minimunAlpah + (1f-minimunAlpah)*(elapseTime/onTime);
if(elapseTime >= onTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
else
{
img.alpha = minimunAlpah + (1f-minimunAlpah)* (1f - elapseTime/offTime);
if(elapseTime >= offTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
yield return new WaitForEndOfFrame();
}
}
//추가 내용의 panel 버전
{
yield return new WaitForEndOfFrame();
float elapseTime = 0f;
int nowCnt = 0;
bool halfEnd = false;
while(roop || nowCnt < cnt)
{
elapseTime+= Time.deltaTime;
if(crescendo)
{
imgPanel.alpha = minimunAlpah + (1f-minimunAlpah)*(elapseTime/onTime);
if(elapseTime >= onTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
else
{
imgPanel.alpha = minimunAlpah + (1f-minimunAlpah)* (1f - elapseTime/offTime);
if(elapseTime >= offTime)
{
elapseTime = 0f;
crescendo = !crescendo;
if(halfEnd) ++nowCnt;
halfEnd = !halfEnd;
}
}
yield return new WaitForEndOfFrame();
}
}
'프로그래밍 > Coroutine' 카테고리의 다른 글
KhjCoroutines - AniSprite (0) | 2014.08.25 |
---|---|
KhjCoroutines - DownMove (0) | 2014.07.31 |
KhjCoroutines - ScaleChange (0) | 2014.07.30 |
KhjCoroutines - AlphaChange (0) | 2014.07.29 |
코루틴 기본형태 (0) | 2014.07.02 |