private void RebuildCardPosition() { float step = 1.0f / _cards.Count; int cardIndex = 0; var offsetCenter = _arc.p1 + Vector3.down * 2000; var sortedCard = _cards.OrderBy(card => card.transform.position.x).ToList(); sortedCard.ForEach(card => card.DOKill()); for (float t = 0; t < 1; t += step, cardIndex++) { var point = Math.CalculateCubicBezierPoint(t, _arc); var angle = Vector3.Angle(point + offsetCenter, Vector3.down); if (t > 0.5f) { angle = -angle; } // Debug.DrawLine(O, point, Color.red, 10); // Debug.DrawRay(O, Vector3.left * 1000, Color.green, 10); // Debug.Log("point " + point + " angle " + angle); point = Arc3Root.TransformPoint(point); var lDirection = new Vector3(0, Mathf.Sin(Mathf.Deg2Rad * angle), Mathf.Cos(Mathf.Deg2Rad * angle)); sortedCard[cardIndex].transform.DOMove(point, 0.25f); sortedCard[cardIndex].transform.DORotate(lDirection, 0.25f); // _cards[cardIndex].transform.position = point; // _cards[cardIndex].transform.Rotate(Vector3.forward, angle); } }