public void UnlinkAll() { #if UNITY_2017_1_OR_NEWER for (int i = 0; i < _nClipData; i++) { _c_curClipData = _clipData[i]; _c_curClipData.Unlink(); _c_curClipData._isCalculated = false; _c_curClipData._isCalculatedPrev = false; } #endif }
public void Update(apAnimPlayManager animPlayManager) { #if UNITY_2017_1_OR_NEWER _c_curTime = _parentTrackSet._playableDirector.time; _lastPlayedTimelineClip = null; #endif _lastPlayedLocalTime = 0.0f; //1. 전체 Reday To Update for (int i = 0; i < _nClipData; i++) { _clipData[i].ReadyToUpdate(); } #if UNITY_2017_1_OR_NEWER //2. 범위 체크해서 업데이트 여부 결정과 Set Data _c_curClipData = null; _c_clipA = null; _c_clipB = null; _c_localTimeA = 0.0; _c_localTimeB = 0.0; _c_weightA = 0.0f; _c_weightB = 0.0f; _c_nPlayClips = 0; for (int i = 0; i < _nClipData; i++) { _c_curClipData = _clipData[i]; if (_c_curTime < _c_curClipData._timelineClip.start || _c_curTime > _c_curClipData._timelineClip.end) { continue; } if (_c_clipA == null) { _c_clipA = _c_curClipData; _c_nPlayClips = 1; _c_localTimeA = _c_clipA._timelineClip.ToLocalTimeUnbound(_c_curTime); } else if (_c_clipB == null) { //단, A와 AnimClip이 겹치면 안된다. if (_c_clipA._animClip != _c_curClipData._animClip) { _c_clipB = _c_curClipData; _c_nPlayClips = 2; _c_localTimeB = _c_clipB._timelineClip.ToLocalTimeUnbound(_c_curTime); break; //B까지 연결했으면 끝 } } } if (_c_nPlayClips == 1) { //PlayClip이 1개일 때 if (_c_localTimeA < _c_clipA._timelineClip.easeInDuration) { _c_weightA = GetWeightIn(_c_localTimeA, _c_clipA._timelineClip.easeInDuration); } else if (_c_localTimeA < _c_clipA._timelineClip.duration - _c_clipA._timelineClip.easeOutDuration) { _c_weightA = 1.0f; } else { _c_weightA = GetWeightOut(_c_localTimeA, _c_clipA._timelineClip.easeOutDuration, _c_clipA._timelineClip.duration); } _c_clipA.SetData(true, _c_weightA, (float)_c_localTimeA, _blendMethod, _layerOrder); //Clip A가 마지막에 계산되었다. _lastPlayedTimelineClip = _c_clipA._timelineClip; _lastPlayedLocalTime = (float)_c_localTimeA; } else if (_c_nPlayClips == 2) { //PlayClip이 2개일 때 (무조건 Blend) _c_weightA = GetWeightOut(_c_localTimeA, _c_clipA._timelineClip.blendOutDuration, _c_clipA._timelineClip.duration); _c_weightB = 1.0f - _c_weightA; _c_clipA.SetData(true, _c_weightA, (float)_c_localTimeA, _blendMethod, _layerOrder); _c_clipB.SetData(false, _c_weightB, (float)_c_localTimeB, _blendMethod, _layerOrder); //Clip B가 마지막에 계산되었다. _lastPlayedTimelineClip = _c_clipB._timelineClip; _lastPlayedLocalTime = (float)_c_localTimeB; } //3. 클립데이터 확인하여 Link/Unlink 및 Update for (int i = 0; i < _nClipData; i++) { _c_curClipData = _clipData[i]; if (!_c_curClipData._isCalculated) { //업데이트가 안되었다면 Release if (_c_curClipData._isCalculatedPrev) { //이전 프레임에서는 계산이 되었던 ClipData다. _c_curClipData.Unlink(); } } else { //업데이트가 되었으면 연결을 하고, 프레임과 Weight를 업데이트 한다. if (!_c_curClipData._isCalculatedPrev) { //이전 프레임에서는 계산이 안되었다. _c_curClipData.Link(); //Root Unit을 갱신할 수도 있다. animPlayManager.SetOptRootUnit(_c_curClipData._linkedRootUnit); } //업데이트 <중요!> _c_curClipData.UpdateTimelineClipAndPlayUnit(); } //Prev 갱신 _c_curClipData._isCalculatedPrev = _c_curClipData._isCalculated; } #endif }