private void UpdateSpreadAnim()
    {
        curTime += Time.deltaTime;
        if (curTime > totalTime)
        {
            isSpreadAnim = false;
        }

        float t = Mathf.Clamp01(curTime / totalTime);

        for (int i = 0; i < animChilds.Count; i++)
        {
            AnimChild child = animChilds[i];
            float     angle = child.rotAngle * t;
            child.transform.Rotate(child.rotAxis, angle - child.lastAngle, Space.World);
            child.lastAngle = angle;

            Vector3 posVec = Vector3.Slerp(child.startPosVec, child.endPosVec, t);
            child.transform.position = midPos + posVec;
        }
    }
    private void StartSpreadAnim(bool normalToSpread, float speed)
    {
        totalTime     = speed;
        curTime       = 0;
        circleForward = track.Circles[0].forward;

        Vector3 tangent, up;
        float   distance;

        track.Curve.Build(track.Circles, track.CurveType);
        track.Curve.GetBottomMidSample(out midPos, out tangent, out up, out distance);
        float halfLength = 0.5f * track.Curve.Length;

        //计算起点偏移,使中点为midPos
        track.StartOffset = distance - halfLength;
        if (normalToSpread)
        {
            //从收拢到平铺
            SetKeyframe((int)TrackState.Normal);
            track.IsSpread = true;
        }
        else
        {
            //从平铺到收拢
            SetKeyframe((int)TrackState.Spread);
            track.IsSpread = false;
        }

        int midIndex = Mathf.FloorToInt(halfLength / track.Spacing);

        List <TrackChildInfo> endTransInfos = track.ComputeTrack();

        animChilds.Clear();
        for (int i = 0; i < track.transform.childCount; i++)
        {
            Transform child     = track.transform.GetChild(i);
            AnimChild animChild = new AnimChild();
            animChilds.Add(animChild);

            animChild.transform    = child;
            animChild.startPosVec  = child.position - midPos;
            animChild.endPosVec    = endTransInfos[i].position - midPos;
            animChild.startTangent = child.rotation * Vector3.left;
            animChild.endTangent   = endTransInfos[i].rotation * Vector3.left;

            animChild.rotAngle = Mathf.Rad2Deg * Mathf.Acos(Mathf.Clamp(Vector3.Dot(animChild.startTangent, animChild.endTangent), -1, 1));

            //修正旋转动画角度
            Vector3 cross = Vector3.Cross(animChild.startTangent, animChild.endTangent);
            if (i <= midIndex)
            {
                animChild.rotAxis = circleForward;
            }
            else
            {
                animChild.rotAxis = -circleForward;
            }

            if (Vector3.Dot(cross, animChild.rotAxis) < -0.0001f)
            {
                animChild.rotAngle = 360 - animChild.rotAngle;
            }
        }

        if (!track.IsSpread)
        {
            //反过来转
            for (int i = 0; i < animChilds.Count; i++)
            {
                if (animChilds[i].rotAngle > 0.001f)
                {
                    animChilds[i].rotAxis  = -animChilds[i].rotAxis;
                    animChilds[i].rotAngle = 360 - animChilds[i].rotAngle;
                }
            }
        }

        isSpreadAnim = true;
    }