/ / Afecta la posición de un objeto a través de la rotación de otro objeto en Unity - c #, unity3d, gameobject

Afectando la posición de un objeto a través de la rotación de otro objeto en Unity - c #, unity3d, gameobject

Tengo un objeto de juego flotante (brickRot) quemira qué objeto está debajo de él a través de un raycast, y luego cambia el objeto "s y position (floorY) basado en la rotación de brickRot". Sin embargo, estoy teniendo problemas para convertir la rotación en una métrica útil para cambiar la posición Y. Quiero que la rotación actual de brickRot sea igual a lo que sea la posición y de floorY, y luego solo cambie con respecto a la rotación de brickRot ( Si eso tiene algún sentido).

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FloorRotation : MonoBehaviour {

private float brickRot;
private float floorY;

void Update () {
brickRot = transform.rotation.y;

RaycastHit hit;
Ray floorRay = new Ray(transform.position, Vector3.down);

if(Physics.Raycast(floorRay, out hit)) {
if(hit.collider.tag == "floor") {
floorY = hit.transform.position.y;
floorY = floorY + brickRot;
Debug.Log(floorY);
}
}
}
}

Piensa en brickRot como un plato que colocas en ely cuando gira la placa, cambia la posición "s" de la tabla (si esa analogía lo hace menos confuso). La razón por la que estoy usando un raycast es porque hay varias "tablas" que el ladrillo puede Encuentra, y necesita diferenciarse entre ellos. Si alguien tiene una idea de cómo hacer esto más fácil, ¡siempre estaré agradecido!

Respuestas

0 para la respuesta № 1

Los valores de rotación que obtienes están en Cuaternio Los ángulos, no son las rotaciones comunes de 360 ​​grados de Euler. Unity, o cualquier otro motor de juego, usa Euler solo como representación para nosotros, pero nunca lo usa internamente para ningún tipo de cálculo de rotación.

Voy a sugerir no profundizar en comprender profundamente los Cuaterniones. Pero en cambio, piensa en cómo podrías lograrlo.

Para una métrica adecuada, agregue un objeto de juego hijo,girado por 90 en x o y o o z (verifique esto, depende de cómo haya orientado a su padre) y a cierta distancia de su padre, al juego de ladrillos Objeto. Ahora, cuando gire el ladrillo, el niño se moverá automáticamente en y, siguiendo un movimiento circular alrededor del padre. Puede usar la Y del niño como una métrica para actualizar el piso Y.


0 para la respuesta № 2

use el valor "eulerAngles" en su lugar, se convertiráel cuaternion a un vector3 luego usa la función de ángulo de vector3 para obtener algo de flotación, puede multiplicar la flotación con otro valor si necesita una escala mayor / menor

brickRot = angle = Vector3.Angle(transform.rotation.eulerAngles, transform.forward);