Rotaciones en Unity

Visto en: https://gamedevbeginner.com/how-to-rotate-in-unity-complete-beginners-guide/

Vector3 newPosition = new Vector3(0, 10, 0);
transform.position = newPosition;

Así es como ponemos una nueva posición a un objeto. Para poner una nueva rotación (pitch, yaw and roll):

Vector3 newRotation = new Vector3(0, 10, 0);
transform.eulerAngles = newRotation;

No podemos usar directamente la propiedad transform.rotation con un vector, ya que internamente es un valor tipo Quaternion. Tendríamos que hacerlo así:

// Copiando directamente desde otro objeto
Quaternion objectRotation = otherObject.transform.rotation;
transform.rotation = objectRotation;

// o usando el metodo Quaternion.Euler
transform.rotation = Quaternion.Euler(new Vector3(0,10,0));

Estos métodos nos sirven para establecer una vez el valor de la rotación, pero si queremos hacer incrementos debemos usar el metodo Rotate:

transform.Rotate(new Vector3(0,10,0));

Si lo metemos en un bucle rotamos 10 grados en y cada vez. También lo podemos usar en la funcion Update:

float gradosPorSegundo = 15;
private void Update()
{
 transform.Rotate(new Vector3(0, gradosPorSegundo, 0) * Time.deltaTime);
}

Local rotation vs world rotation

Vector3 worldRotation = transform.eulerAngles;
Vector3 localRotation = transform.localEulerAngles;

// World Rotation 
transform.eulerAngles = new Vector3(0,90,0);

// Local Rotation
transform.localEulerAngles = new Vector3(0,90,0);

Rotar alrededor de un punto

Si quiero rotar alrededor de un punto diferente al pivote del objeto, puedo usar el truco de hacerlo hijo de otro gameObject vacío.

También puedo usar un método:

// Rota alrededor de un punto, eje y, 90 grados
transform.RotateAround(new Vector3(1,1,1), Vector3.up, 90);

// Rota alrededor de la posición del pivote del objeto, eje Y, 90 grados
transform.RotateAround(objectToRotateAround.position, Vector3.up, 90);

Vector3.left -> X-Axis, Vector3.up -> Y-Axis y Vector3.forward -> Z-Axis. Vector3.up representa up global dirección, Transform.up representa up en relación al Transform de un gameObject.

Orbitar en el tiempo:

public Transform objectToOrbit; 
void Update() 
{     
   transform.RotateAround(objectToOrbit.position, Vector3.up, 10 * Time.deltaTime); 
}

Hay que tener en cuenta que cuando rotamos alrededor de un objeto, rotamos siempre mirando al objeto. Esto puede ser útil si somos una cámara que orbita sobre un objeto, pero si somos un planeta, queremos girar también sobre nuestro eje y no mirar siempre al sol.