/ / Afetando a posição de um objeto através da rotação de outro objeto no Unity - c #, unity3d, gameobject

Afetando a posição de um objeto através da rotação de outro objeto em Unity - c #, unity3d, gameobject

Eu tenho um objeto de jogo flutuante (brickRot) queexamina qual objeto está embaixo dele através de um raycast e altera a posição y (andarY) desse objeto com base na rotação do brickRot. No entanto, estou tendo problemas para converter a rotação em uma métrica útil para alterar a posição Y. Quero que a rotação atual do brickRot seja igual à posição y do floorY e depois mude apenas em relação à rotação do brickRot ( Se isso faz algum 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);
}
}
}
}

Pense no brickRot como um prato que você coloca nomesa e, quando você gira a placa, altera a posição y da mesa (se essa analogia a torna menos confusa). A razão pela qual estou usando um raycast é porque existem várias "tabelas" que o tijolo pode encontrar, e ele precisa diferenciar entre eles. Se alguém tiver uma idéia de como tornar isso mais fácil, eu ficaria agradecido para sempre!

Respostas:

0 para resposta № 1

Os valores de rotação que você obtém estão em Quaternion ângulos, não as rotações comuns de Euler em 360 graus. O Unity, ou qualquer outro mecanismo de jogo, usa o Euler apenas para representação para nós, mas nunca o usa internamente para qualquer tipo de cálculo de rotação.

Vou sugerir não aprofundar a compreensão dos Quaternions. Mas, em vez disso, pense em como mais você poderia alcançá-lo.

Para uma métrica adequada, adicione um objeto de jogo filho,girado 90 em x ou y ou z (verifique isso, depende de como você orientou seus pais) e a alguma distância do pai, para o jogo de tijolosObject. Agora, quando você gira o tijolo, a criança se move automaticamente em y, seguindo um movimento circular em torno do pai. Você pode usar o Y da criança como uma métrica para atualizar o pisoY.


0 para resposta № 2

use o valor "eulerAngles" em vez disso, ele converteráo quaternion para um vector3 então você usa a função de ângulo do vetor3 para obter alguma flutuação; você pode multiplicar a flutuação por outro valor se precisar de uma escala maior / menor

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