Exemple #1
0
        ///// <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);
            //}
        }
Exemple #2
0
        ///// <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();
        }