public void RotateStepTowardsTarget(float rawTargetZAngle) { float clampedTargetZAngle = Mathfx.Modulo(rawTargetZAngle, 360); float maxShipRotationPerFrame = maxRotationSpeed; //If difference between target and current z angle is not less than degrees per frame, begin moving if (!(transform.eulerAngles.z - clampedTargetZAngle < maxShipRotationPerFrame && transform.rotation.eulerAngles.z - clampedTargetZAngle > -maxShipRotationPerFrame)) { //If angle from current to target clockwise is less than or equal to 180, turn right. if (Mathfx.Modulo(clampedTargetZAngle - transform.eulerAngles.z, 360) > 180) { transform.eulerAngles = new Vector3(0, 0, transform.eulerAngles.z - maxShipRotationPerFrame); } else { //Otherwise, turn left transform.eulerAngles = new Vector3(0, 0, transform.eulerAngles.z + maxShipRotationPerFrame); } } else { //Since target z angle is less than max degrees per frame away, simply set z angle to target transform.eulerAngles = new Vector3(0, 0, clampedTargetZAngle); } }
public float GetRotationOffset(Vector3 targetPosition) { var lastAngleZ = transform.eulerAngles.z; float rawOffset = GetTargetAngleZ(targetPosition) - lastAngleZ; return(Mathfx.Modulo(rawOffset, 360)); }