void onJumping() { float jumpProgress = (Time.time - jumpStartTime) / maxJumpTime; if (jumpProgress > 1f) { lastIntersectedFloor = landingSiteGameObject.GetComponent<LandingSite> ().Floor; IsJumping = false; floatingEffect.enableEmission = false; speed = maxSpeed; float nextProgress = (float)lastIntersectedFloor.Order + lastIntersectedFloor.GetPercentage (transform.position); progress = nextProgress; } else { float localX = Mathf.Cos (Mathf.PI * jumpProgress); float localY = Mathf.Sin (Mathf.PI * jumpProgress); Vector3 yAxis = lastIntersectedFloor.GetTangentDir (jumpStartPosition).normalized; Vector3 xAxis = -(landingSiteGameObject.transform.position - jumpStartPosition).normalized; Vector3 zAxis = Vector3.Cross (yAxis, xAxis); float radius = (landingSiteGameObject.transform.position - jumpStartPosition).magnitude / 2f; Vector3 center = (landingSiteGameObject.transform.position + jumpStartPosition) / 2f; Vector3 nextPosition = center + xAxis * localX * radius + yAxis * localY * radius; Vector3 up = (nextPosition - center).normalized; Vector3 forward = Vector3.Cross (up, zAxis); Quaternion nextRotation = Quaternion.LookRotation (forward, up); transform.rotation = nextRotation; transform.position = nextPosition; } }