IEnumerator WiggleIntoPlace(Vector3 startingPos, Vector3 endingPos) { float duration = 0.3f; int wiggles = 3; float damping = 3f; //> 1 float wiggle_duration = duration / (wiggles + 1); bool easein = false; for (int i = 0; i <= wiggles; i++) { float elapsedTime = 0f; Vector3 tempPos = endingPos - (startingPos - endingPos) / damping; while (elapsedTime < wiggle_duration) { float t = elapsedTime / wiggle_duration; t = t * t * t * (t * (6f * t - 15f) + 10f); //t = t * t * (3f - 2f * t); if (i == 0 && easein) { t = Mathf.Sin(t * Mathf.PI * 0.5f); } if(i == wiggles) { tempPos = endingPos; } float x = startingPos.x - (startingPos.x - tempPos.x) * t; float y = startingPos.y - (startingPos.y - tempPos.y) * t; float z = startingPos.z - (startingPos.z - tempPos.z) * t; transform.localPosition = new Vector3(x, y, z); elapsedTime += Time.deltaTime; yield return new WaitForEndOfFrame(); } startingPos = tempPos; } transform.localPosition = endingPos; }