/ / Wpływanie na pozycję obiektu poprzez obrót innego obiektu w Unity - c #, unity3d, gameobject

Wpływa na pozycję obiektu poprzez obrót innego obiektu w Unity - c #, unity3d, gameobject

Mam pływający obiekt typu gameobject (brickRot)spogląda na obiekt znajdujący się pod spodem poprzez raycast, a następnie zmienia pozycję y obiektu (floorY) na podstawie obrotu brickRota. Mam jednak problem z przekształceniem rotacji w użyteczną metrykę dla zmiany pozycji Y. Chcę, aby aktualny obrót brickRot był równy cokolwiek jest pozycją y floorY, a następnie zmienia się tylko względem obrotu brickRot ( jeśli to ma sens).

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);
}
}
}
}

Pomyśl o brickRot jako płycie, na którą kładziesztabeli, a gdy obrócisz płytkę, zmienisz pozycję y stołu (jeśli ta analogia sprawi, że będzie mniej dezorientująca) .Dzięki temu używam raycasta, ponieważ istnieje wiele "stołów", które cegła może znaleźć i musi je rozróżnić. Jeśli ktoś ma pomysł, jak to ułatwić, byłbym zawsze wdzięczny!

Odpowiedzi:

0 dla odpowiedzi № 1

Otrzymane wartości obrotu są w Kwaternion kątami, a nie powszechnym obrotem Eulera o 360 stopni. Unity, lub jakikolwiek inny silnik gry, używa Eulera tylko do reprezentacji dla nas, ale nigdy nie używa go wewnętrznie do jakichkolwiek obliczeń rotacji.

Zamierzam zasugerować, aby nie zagłębić się w dogłębne zrozumienie kwater czwartorzędu. Zamiast tego zastanów się, jak inaczej możesz to osiągnąć.

Aby uzyskać odpowiednią metrykę, dodaj obiekt gry dla dzieci,obrócone o 90 na x lub y lub z (sprawdź to, to zależy od tego, jak zorientowałeś swojego rodzica) i w pewnej odległości od rodzica, do brick gameObject. Teraz, gdy obrócisz klocek, dziecko automatycznie przeniesie się y, po ruchu okrężnym wokół rodzica.Możesz użyć Y dziecka jako metryki do aktualizacji floorY.


0 dla odpowiedzi nr 2

zamiast tego użyj wartości "eulerAngles", to się skonwertujekwaternion do wektora3 następnie używasz funkcji kątowej wektora3, aby uzyskać trochę zmiennoprzecinkowe, możesz pomnożyć zmienną z inną wartością, jeśli potrzebujesz większej / niższej skali

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