KhjCoroutines - AlphaOnOffLoop

2014. 7. 31. 14:27프로그래밍/Coroutine

반응형
SMALL

이번엔 지난 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 ) );

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 버전

public IEnumerator AlphaMinOnOffLoop(UIPanel imgPanel, 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)  
   {
    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();
  }
 }
반응형
LIST

'프로그래밍 > 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