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
            }