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; }