2017-01-04 4 views
1

Dieser Code wird an eine Kamera angehängt:bewegen sich in Richtung transform.forward, ignorieren Rotation

transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

Ich .forward verwendet habe und .right weil der Spieler in der Lage, die Kamera auf dem Y Axiz zu drehen, so dass Ganz gleich, auf welche Weise die Kamera auf die Vorwärts-Taste gerichtet ist, sie bewegt die Kamera immer relativ nach vorne, die linke Taste bewegt sie relativ nach links und so weiter. Nur um zu verdeutlichen - ich möchte, dass es sich im lokalen Raum bewegt, nicht im Welt-Raum, also ist die Richtung, in die es gerichtet ist, nicht unbedingt Vector3 (0,0,1).

Die Kamera ist frei roaming und hat keine Eltern oder Ziel zu folgen.

Das Problem ist die Kamera hat eine X-Drehung von 45 nach unten zu sehen. Mit transform.forward wird also die Höhe geändert. Es gibt auch einen Scroll-Code, um die Höhe der Kamera zu ändern, so dass ich die Höhe nicht auf einen festen Wert einstellen möchte. Wie kann ich die Bewegung nur auf X und Z beschränken, am besten ohne es zu leeren?

Update: Dieser Code funktioniert, aber es ist nicht schön, ich bin sicher, es gibt eine elegantere Lösung mit Vector3.Project, wie xyLe_ vorschlägt. Wenn ich es herausfinde, füge ich seiner Antwort noch etwas hinzu.

mod = Time.deltaTime * 30; 
float yPos = transform.position.y; 
pos = transform.position; 
pos += Input.GetAxis("Vertical") * transform.forward * mod; 
pos.y = yPos; 
pos += Input.GetAxis("Horizontal") * transform.right * mod; 
pos += Input.GetAxis("Mouse ScrollWheel") * transform.up * mod * -30; 
+0

[Math.Clamp] (https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html) könnte helfen. – Catwood

+0

Sie wollen also "Welt" Vorwärtsrichtung verwenden? Wenn das der Fall ist, dann sind die Richtungen der Welt konstant 'Vector3.Up = new Vector3 (0, 1, 0);' –

+0

Drehen Sie 'transform.forward' mit Ihrer Rotation um' transform.right', um es mit der xz-Ebene – TheDjentleman

Antwort

3

Ich könnte Unsinn jetzt sprechen, aber es scheint ziemlich einfach zu mir:

Vector3 desiredDirection = Vector3.Normalize(new Vector3(transform.forward.x, transform.position.y, transform.forward.z))

Gerade transform.forward auf die x-z-Ebene projiziert, die auf der Höhe der transform.position.y angesiedelt ist. Dies führt (normalerweise) zu einem etwas kürzeren Vektor, so dass Sie es renormalisieren müssen.

Zur Visualisierung:

vec img

Wenn ich Sie richtig verstehe, transform.forward auf dem schwarzen Vektor entspricht und Sie die grüne Vektor haben. Wenn Sie die y-Komponente des schwarzen Vektors auf die y-Komponente der y-Komponente für die roten Punkte setzen, erhalten Sie den lila Vektor, der renormiert werden muss.

+0

Das ist auf den Punkt gebracht, ja. Ich werde sehen, ob ich es kodieren kann, aber ich muss vielleicht für deine Hilfe zurückkommen;) – Absinthe

0

Auch wenn dies gelöst wurde, sollte die folgende Lösung anderen Menschen helfen, dieses Problem zu haben.

Hier ist ein richtiger Weg in Richtung transform.forward zu bewegen, während seine Drehung zu ignorieren:

.Get die transform.forward.

.Convert es zu lokalem Raum mit InverseTransformDirection

.Set die y Achse 0;

.Normalisieren Sie es mit dir.Normalize();

.Die neue Position an transform.position anhängen.

public float mod = 2; 

void Update() 
{ 
    //Get Forward face 
    Vector3 dir = transform.forward; 
    //Convert to local Space 
    dir = transform.InverseTransformDirection(dir); 
    //Reset/Ignore y axis 
    dir.y = 0; 
    dir.Normalize(); 

    //Append the new pos to the `transform.position`. 
    transform.position += dir * Input.GetAxis("Vertical") * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 
} 

Ein anderes Verfahren (nicht empfohlen):

Da die Kamera um 45 Winkel geneigt ist:

.Rotate es -45

.Move die Kamera normalerweise

.Rotate es 45 zurück

public float startingOffset = 45; 
public float mod = 2; 


// Update is called once per frame 
void Update() 
{ 
    //Rotate it to -45 
    transform.Rotate(new Vector3(-startingOffset, 0, 0)); 

    // Move the camera normally 
    transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

    //Rotate it back to 45 
    transform.Rotate(new Vector3(startingOffset, 0, 0)); 
} 

Beide sollten diese funktionieren, aber die bevorzugte Art und Weise der erste sein soll.

Verwandte Themen