Jump to content
Unity Insider Forum

Sichtfeld eingrenzen


Timbo3

Recommended Posts

Hallo Forum, ich versuche gerade sowas wie einen fps Controller selbst zu bauen halt etwas schlichter.

Angefangen habe ich damit, dass sich der Spieler zum Blickwinkel dreht(y achse) und, dass sich die Kamera dreht(x Achse). Das funktioniert soweit, allerdings will ich die Drehung der Kamera auf der x Achse von 90 bis -90 Grad begrenzen aber es funktioniert nicht: 

using UnityEngine;

public class Player : MonoBehaviour
{
    public int yRotate;
    public int xRotate;
    public Camera cam;

    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        if (cam.transform.rotation.x < 90 && cam.transform.rotation.x > -90)
        {
            cam.transform.Rotate(-Input.GetAxis("Mouse Y") * yRotate, 0, 0);
        }

        transform.Rotate(0, Input.GetAxis("Mouse X") * xRotate, 0);

    }
} 

Hat jemand eine Idee wie ich es besser machen kpnnte?

Danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin zwar kein Klempner aber Clamp klingt gut..

Danke

edit:

ich kann die Kamera trotzdem um 360 grad drehen:

Zitat

using UnityEngine;

public class Player : MonoBehaviour
{
    public int yRotate;
    public int xRotate;
    public Camera cam;

    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        float clamp = Mathf.Clamp(cam.transform.rotation.x, -90, 90);

        if (clamp == cam.transform.rotation.x)
        {
            cam.transform.Rotate(-Input.GetAxis("Mouse Y") * yRotate, 0, 0);
        }

        transform.Rotate(0, Input.GetAxis("Mouse X") * xRotate, 0);

    }
} 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klassiker mit einfacher Lösung und komplexer Begründung.

Vereinfachte Begründung: Rotationen in Unity werden in Form von Quaterionen abgespeichert, nicht Eulerwinkeln. EulerWinkel sind dieses "Wie viel wird um die Achsen X, Y und Z gedreht" was man im Editor einstellt, Quaternions sind... komplizierter. Wenn du jedenfalls Eulerwinkel als Rotation setzt oder sie als solche ausliest, dann wird immer von bzw. zu einem Quaternion umgewandelt. Und dabei gehen gewisse Informationen verloren. Du kannst daher problemlos einen Winkel reinstecken und einen anderen Winkel rauskriegen, z.B. -10 rein und +350 raus.

Die simple Lösung: Nicht die Roation aus deiner Transform-Komponente auslesen, sondern einen eigenen Wert deklarieren und verwalten. Dieser eigene Wert ist dann einfach nur eine Zahl, bei der nix konvertiert wird. Das, was du als Wert reinsteckst, bleibt auch als Wert drin. Beispielimplementation:

private float pitch;
public float pitchMin = -80;
public float pitchMax = 80;

private void Update()
{
  pitch -= Input.GetAxis("Mouse Y");
  pitch = Mathf.Clamp(pitch, pitchMin, pitchMax);
  
  transform.localEulerAngles = Vector3.right * pitch;
}

Der "pitch"-Wert ist hier der Wert, den du ansonsten aus transform.localEulerAngles ausgelesen hättest. Jetzt setzt du ihn einfach nur und kannst deshalb gemütlich clampen, weil sonst nix mit dem Wert passiert.

Hier ist noch etwas zusätzliche Lektüre für Kamera-Setups: http://blog.13pixels.de/2019/creating-a-camera-setup-in-unity/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...