Don’t use RotateAround. Just make these objects children of a central empty pivot object and rotate it. RotateAround is going to accumulate error over time which will become significant eventually.
So:
for rotation, simply rotate the parent.
For the in and out motion, simply change the object’s local positon.
They don’t override but you do have to keep updating the moveDirection as the direction of the center constantly changes. Although from the video I’m guessing that your moveDirection or currentSpeed is set to zero before the rotating starts.
Spawn is just invisible marker points around the circle where the objects should move depending on radius.
private void CircleAround()
{
for (int i = 0; i < BodyParts.Count; i++)
{
/* Distance around the circle */
var radians = 2 * Mathf.PI / BodyParts.Count * i;
/* Get the vector direction */
var vertical = Mathf.Sin(radians);
var horizontal = Mathf.Cos(radians);
var spawnDir = new Vector3(horizontal, 0, vertical);
/* Get the spawn position */
var spawnPos = playerObject.transform.position + spawnDir * circleRadius; // Radius is just the distance away from the point
Vector3 moveDirection = spawnPos - BodyParts[i].transform.position;
/* Rotate */
BodyParts[i].transform.RotateAround(playerObject.transform.position, rotation, speed * Time.deltaTime);
/* Move */
BodyParts[i].transform.position += moveDirection * lerpSpeedCircle * Time.deltaTime;
/* Rotate the objects to face towards player */
BodyParts[i].transform.LookAt(playerObject.transform.position);
}
}