///// <summary> ///// AnimClip을 PlayUnit에 담아서 바로 재생한다. ///// Queue에 저장된 모든 클립에 바로 FadeOut을 지정하여 자연스럽게 종료하도록 한다. ///// </summary> ///// <param name="blendMethod"></param> ///// <param name="isAutoEndIfNotloop">True이면 Clip의 재생 후 자동으로 종료한다. (Loop일 경우 무시됨)</param> //public apAnimPlayUnit CrossFade(apAnimPlayData playData, apAnimPlayUnit.BLEND_METHOD blendMethod, bool isAutoEndIfNotloop, float fadeTime) //{ // apAnimPlayUnit newPlayUnit = MakePlayUnit(playData, blendMethod, isAutoEndIfNotloop); // newPlayUnit.Play(fadeTime, 0.0f); // //TODO : 이 AnimClip을 CalculatedParam에 연결해야한다. // //Debug.LogError("TODO : 이 AnimClip을 CalculatedParam에 연결해야한다"); // //플레이 유닛은 플레이 시작 // //나머지는 End로 만든다. // for (int i = 0; i < _animPlayUnits.Count; i++) // { // if (newPlayUnit != _animPlayUnits[i]) // { // _animPlayUnits[i].FadeOut(fadeTime); // } // } // _nPlayedUnit = _animPlayUnits.Count; // return newPlayUnit; //} ///// <summary> ///// AnimClip을 PlayUnit에 담아서 기다린 뒤 재생한다. ///// Queue에 저장된 클립들이 모두 끝나면 Fade Time만큼 섞어서 재생한다. ///// </summary> ///// <param name="animClip"></param> ///// <param name="blendMethod"></param> ///// <param name="isAutoEndIfNotloop">True이면 Clip의 재생 후 자동으로 종료한다. (Loop일 경우 무시됨)</param> ///// <returns></returns> //public apAnimPlayUnit CrossFadeQueued(apAnimPlayData playData, apAnimPlayUnit.BLEND_METHOD blendMethod, bool isAutoEndIfNotloop, float fadeTime) //{ // //현재 재생되는 플레이 유닛 중에서 "가장 많이 남은 플레이 시간"을 기준으로 타이머를 잡자 // //Fade 타임은 없고, 자동 삭제 타이머 + 자동 재생 대기 타이머를 지정 // //현재 Queue에 있는 객체가 없다면 CrossFade와 동일하다 // if(_nPlayedUnit == 0) // { // return CrossFade(playData, blendMethod, isAutoEndIfNotloop, fadeTime); // } // float maxRemainPlayTime = -1.0f; // float curRemainPlayTime = 0.0f; // bool isAnyOnceAnimClip = false; // for (int i = 0; i < _nPlayedUnit; i++) // { // _tmpCurPlayUnit = _animPlayUnits[i]; // if(_tmpCurPlayUnit.IsLoop) // { // //하나라도 루프이면 실패다. > 수정 // //루프는 무시하고 Queue 시간을 잡자 // //만약 Loop를 만나고 Queue가 있다면 그냥 기본값인 0.5초를 Queue 시간으로 쓴다. // //Queue에 넣어도 작동하지 않는다. // //Debug.LogError("PlayQueued Failed : Any Clip has Loop Option. Adding to Queue will be ignored"); // //return null; // continue; // } // isAnyOnceAnimClip = true; // curRemainPlayTime = _tmpCurPlayUnit.GetRemainPlayTime; // if(maxRemainPlayTime < curRemainPlayTime) // { // maxRemainPlayTime = curRemainPlayTime; // } // } // if(!isAnyOnceAnimClip) // { // maxRemainPlayTime = 0.5f; // } // if(maxRemainPlayTime < 0.0f) // { // maxRemainPlayTime = 0.0f; // } // //딜레이 시간 = 최대 "남은 시간" - "페이드아웃 시간" // //-----------------..............---> // //[ 딜레이 ] + [ 페이드아웃 ] // //Debug.Log("------------------------------------------------------------"); // //Debug.Log("CrossFadeQueued Request [" + playData._animClipName + "]"); // float delayTime = maxRemainPlayTime - fadeTime; // //Debug.Log("Max Remain Time : " + maxRemainPlayTime); // //Debug.Log("Fade Time : " + fadeTime); // //Debug.Log("Delay Time : " + delayTime); // if(delayTime < 0.0f) // { // // 만약 남은 시간이 적어서 Delay 시간이 음수가 된다면 // //Delay Time = 0으로 두고 // //남은 시간이 모두 FadeTime이다. // fadeTime = maxRemainPlayTime; // delayTime = 0.0f; // //Debug.LogError("Adjusted > Fade Time : " + fadeTime + " / Delay Time : 0"); // } // //Debug.Log("------------------------------------------------------------"); // //최대 RemainPlayTime 만큼 Delay한다. // // Delay후 신규 플레이 또는 플레이 종료를 한다. // //Fade 시간은 0 // apAnimPlayUnit newPlayUnit = MakePlayUnit(playData, blendMethod, isAutoEndIfNotloop); // newPlayUnit.Play(fadeTime, delayTime); // //Debug.LogError("TODO : 이 AnimClip을 CalculatedParam에 연결해야한다"); // for (int i = 0; i < _nPlayedUnit; i++) // { // _tmpCurPlayUnit = _animPlayUnits[i]; // if (newPlayUnit != _tmpCurPlayUnit) // { // _tmpCurPlayUnit.FadeOut(fadeTime, delayTime); // } // } // _nPlayedUnit = _animPlayUnits.Count; // return newPlayUnit; //} #endregion /// <summary> /// 모든 PlayUnit을 종료한다. Clear와 달리 blendTime을 지원한다. /// 이 프레임에서 바로 종료하는게 아니므로, 만약 바로 정리를 하고자 한다면 ReleaseForce를 호출하자 /// </summary> public void StopAll(float blendTime) { //if(blendTime < 0.001f) //{ // Clear(); // return; //} //Stop을 하면서 서서히 줄어드는 걸 요청한다. apAnimPlayRequest request = PopRequest(); request.SetCurrentPlayedUnits(this, _animPlayUnits); request.Stop(blendTime); //for (int i = 0; i < _nPlayedUnit; i++) //{ // _tmpCurPlayUnit = _animPlayUnits[i]; // _tmpCurPlayUnit.FadeOut(fadeTime, delayTime); //} }
///// <summary> ///// AnimClip을 PlayUnit에 담아서 바로 재생한다. ///// Queue에 저장된 모든 클립에 바로 FadeOut을 지정하여 자연스럽게 종료하도록 한다. ///// </summary> ///// <param name="blendMethod"></param> ///// <param name="isAutoEndIfNotloop">True이면 Clip의 재생 후 자동으로 종료한다. (Loop일 경우 무시됨)</param> //public apAnimPlayUnit CrossFade(apAnimPlayData playData, apAnimPlayUnit.BLEND_METHOD blendMethod, bool isAutoEndIfNotloop, float fadeTime) //{ // apAnimPlayUnit newPlayUnit = MakePlayUnit(playData, blendMethod, isAutoEndIfNotloop); // newPlayUnit.Play(fadeTime, 0.0f); // //TODO : 이 AnimClip을 CalculatedParam에 연결해야한다. // //Debug.LogError("TODO : 이 AnimClip을 CalculatedParam에 연결해야한다"); // //플레이 유닛은 플레이 시작 // //나머지는 End로 만든다. // for (int i = 0; i < _animPlayUnits.Count; i++) // { // if (newPlayUnit != _animPlayUnits[i]) // { // _animPlayUnits[i].FadeOut(fadeTime); // } // } // _nPlayedUnit = _animPlayUnits.Count; // return newPlayUnit; //} ///// <summary> ///// AnimClip을 PlayUnit에 담아서 기다린 뒤 재생한다. ///// Queue에 저장된 클립들이 모두 끝나면 Fade Time만큼 섞어서 재생한다. ///// </summary> ///// <param name="animClip"></param> ///// <param name="blendMethod"></param> ///// <param name="isAutoEndIfNotloop">True이면 Clip의 재생 후 자동으로 종료한다. (Loop일 경우 무시됨)</param> ///// <returns></returns> //public apAnimPlayUnit CrossFadeQueued(apAnimPlayData playData, apAnimPlayUnit.BLEND_METHOD blendMethod, bool isAutoEndIfNotloop, float fadeTime) //{ // //현재 재생되는 플레이 유닛 중에서 "가장 많이 남은 플레이 시간"을 기준으로 타이머를 잡자 // //Fade 타임은 없고, 자동 삭제 타이머 + 자동 재생 대기 타이머를 지정 // //현재 Queue에 있는 객체가 없다면 CrossFade와 동일하다 // if(_nPlayedUnit == 0) // { // return CrossFade(playData, blendMethod, isAutoEndIfNotloop, fadeTime); // } // float maxRemainPlayTime = -1.0f; // float curRemainPlayTime = 0.0f; // bool isAnyOnceAnimClip = false; // for (int i = 0; i < _nPlayedUnit; i++) // { // _tmpCurPlayUnit = _animPlayUnits[i]; // if(_tmpCurPlayUnit.IsLoop) // { // //하나라도 루프이면 실패다. > 수정 // //루프는 무시하고 Queue 시간을 잡자 // //만약 Loop를 만나고 Queue가 있다면 그냥 기본값인 0.5초를 Queue 시간으로 쓴다. // //Queue에 넣어도 작동하지 않는다. // //Debug.LogError("PlayQueued Failed : Any Clip has Loop Option. Adding to Queue will be ignored"); // //return null; // continue; // } // isAnyOnceAnimClip = true; // curRemainPlayTime = _tmpCurPlayUnit.GetRemainPlayTime; // if(maxRemainPlayTime < curRemainPlayTime) // { // maxRemainPlayTime = curRemainPlayTime; // } // } // if(!isAnyOnceAnimClip) // { // maxRemainPlayTime = 0.5f; // } // if(maxRemainPlayTime < 0.0f) // { // maxRemainPlayTime = 0.0f; // } // //딜레이 시간 = 최대 "남은 시간" - "페이드아웃 시간" // //-----------------..............---> // //[ 딜레이 ] + [ 페이드아웃 ] // //Debug.Log("------------------------------------------------------------"); // //Debug.Log("CrossFadeQueued Request [" + playData._animClipName + "]"); // float delayTime = maxRemainPlayTime - fadeTime; // //Debug.Log("Max Remain Time : " + maxRemainPlayTime); // //Debug.Log("Fade Time : " + fadeTime); // //Debug.Log("Delay Time : " + delayTime); // if(delayTime < 0.0f) // { // // 만약 남은 시간이 적어서 Delay 시간이 음수가 된다면 // //Delay Time = 0으로 두고 // //남은 시간이 모두 FadeTime이다. // fadeTime = maxRemainPlayTime; // delayTime = 0.0f; // //Debug.LogError("Adjusted > Fade Time : " + fadeTime + " / Delay Time : 0"); // } // //Debug.Log("------------------------------------------------------------"); // //최대 RemainPlayTime 만큼 Delay한다. // // Delay후 신규 플레이 또는 플레이 종료를 한다. // //Fade 시간은 0 // apAnimPlayUnit newPlayUnit = MakePlayUnit(playData, blendMethod, isAutoEndIfNotloop); // newPlayUnit.Play(fadeTime, delayTime); // //Debug.LogError("TODO : 이 AnimClip을 CalculatedParam에 연결해야한다"); // for (int i = 0; i < _nPlayedUnit; i++) // { // _tmpCurPlayUnit = _animPlayUnits[i]; // if (newPlayUnit != _tmpCurPlayUnit) // { // _tmpCurPlayUnit.FadeOut(fadeTime, delayTime); // } // } // _nPlayedUnit = _animPlayUnits.Count; // return newPlayUnit; //} #endregion //모든 PlayUnit을 종료한다. Clear와 달리 blendTime을 지원한다. //이 프레임에서 바로 종료하는게 아니므로, 만약 바로 정리를 하고자 한다면 ReleaseForce를 호출하자 public void StopAll(float blendTime) { //현재 상태에서 실행되지 않은 Queued 애니메이션 재생 요청은 삭제한다. PushAllNoActiveRequests(); //Stop을 하면서 서서히 줄어드는 걸 요청한다. apAnimPlayRequest request = PopRequest(); //request.SetCurrentPlayedUnits(this, _animPlayUnits); request.SetCurrentPlayedUnits(this); //현재 플레이 중인 AnimPlayUnit들의 LinkKey를 넣어준다. for (int i = 0; i < _animPlayUnits.Count; i++) { request.AddPrevPlayUnitKeyLink(_animPlayUnits[i].LinkKey, _animPlayUnits[i].UnitWeight); if (blendTime < 0.0001f) { if (_animPlayUnits[i]._linkedAnimClip != null) { if (!_animPlayUnits[i]._linkedAnimClip.IsPlaying_Opt) { _animPlayUnits[i]._linkedAnimClip.ResetFrame(); } } } } request.Stop(blendTime); //Order를 갱신한다. RefreshOrder(); }