public static Vector3 getNextPosValue_Ex(Vector3 now, FduTransformObserver_Ex observer)
        {
            var dts = observer.getDataTransmitStrategy();

            if (dts == null || !dts.GetType().Equals(typeof(FduDTS_EveryNFrame)))
            {
                return(Vector3.zero);
            }
            FduDTS_EveryNFrame dtsN = (FduDTS_EveryNFrame)dts;

            try
            {
                FduDTS_EveryNFrame.InterpolationOption interOp = dtsN.getInterPolationOption();
                FduDTS_EveryNFrame.ExtrapolationOption extraOp = dtsN.getExtrapolationOption();

                int interval = dtsN.getInterval();
                int cur      = dtsN.getCurFrame();

                Vector3 offset    = Vector3.zero;
                Vector3 lastValue = observer.getCachedPos(observer.getCachedPosCount() - 1);
                if (extraOp != FduDTS_EveryNFrame.ExtrapolationOption.Disable)
                {
                    int count = observer.getCachedPosCount();
                    if (count >= 2)
                    {
                        if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedEarliest)
                        {
                            offset = (lastValue - observer.getCachedPos(0)) / (count - 1.0f);
                        }
                        else if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedLatest)
                        {
                            offset = (lastValue - observer.getCachedPos(count - 2));
                        }
                    }
                }
                lastValue = lastValue + offset;
                if (interOp == FduDTS_EveryNFrame.InterpolationOption.Disable)
                {
                    return(lastValue);
                }
                else if (interOp == FduDTS_EveryNFrame.InterpolationOption.EstimateStep)
                {
                    int count = observer.getCachedPosCount();
                    if (count >= 2)
                    {
                        float step = Vector3.Distance(lastValue - offset, observer.getCachedPos(count - 2)) / interval;
                        return(Vector3.MoveTowards(now, lastValue, step));
                    }
                    return(lastValue);
                }
                else if (interOp == FduDTS_EveryNFrame.InterpolationOption.FixedStep)
                {
                    if ((interval - cur + 1) > 0)
                    {
                        var res = Vector3.Lerp(now, lastValue, 1.0f / (interval - cur + 1));
                        return(res);
                    }
                    else
                    {
                        return(lastValue);
                    }
                }
                else if (interOp == FduDTS_EveryNFrame.InterpolationOption.Lerp)
                {
                    return(Vector3.Lerp(now, lastValue, Time.deltaTime * dtsN.getLerpSpeed()));
                }
                return(lastValue);
            }
            catch (System.Exception)
            {
                return(Vector3.zero);
            }
        }