StolleJay Geschrieben 23. April 2019 Melden Share Geschrieben 23. April 2019 Hallöchen, ich Melde mich heute mal wieder mit einem kleinen Problemchen an dem ich schon seit 1-2 Tagen hänge und nicht weiter komme. Ich habe ein Script für meine Kamera mit dem ich das Übergeordnete Objekt (Mein Camera Controller) um jeweils 45 Grad drehen kann. Zusätzlich kann man die Kamera aber auch wenn gewünscht ohne diese 45 Grad Frei Rotieren. Mein Problem dabei ist jetzt jedoch das wenn ich die Kamera Frei Drehe und und bei einem Winkel von zb. 51 lasse wie bekomme ich es hin das wenn ich die Kamera wieder um normale 45 Grad drehen will er erst mal von den 51 auf 90 Grad hoch geht bzw. auf 45 runter bevor diese wieder um ganze 45 Grad Rotiert? using UnityEngine; public class CameraController : MonoBehaviour { public Camera camera; public Transform controller; public float moveSpeed = 4; public float rotateSpeed = 20; public bool leftMove = false; public bool rightMove = false; public bool upMove = false; public bool downMove = false; public float zoomMin = 0.75f; public float zoomMax = 3; public float zoomSpeed = 0.25f; // Update is called once per frame void Update () { // Movement moveLeftRight(); moveUpDown(); // Rotation rotateLeftRight(); // Zoom zoomInOut(); } void moveLeftRight() { //MoveLR... } void moveUpDown() { //MoveUD... } void rotateLeftRight() { if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt)) { controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0); } else if (Input.GetKeyDown(KeyCode.E)) { controller.transform.Rotate(0, -45, 0); } if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt)) { controller.transform.Rotate(0, +rotateSpeed * Time.deltaTime, 0); } else if (Input.GetKeyDown(KeyCode.Q)) { controller.transform.Rotate(0, +45, 0); } } void zoomInOut() { //Zoom... } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 24. April 2019 Melden Share Geschrieben 24. April 2019 Verstehe das Script nicht ganz. - Warum controller.transform.Rotate? controller ist doch bereits als Transform deklariert, müsste es nicht controller.Rotate() heissen? - Wo drehst du den die Kamera selbst? Wenn ich das richtig verstanden habe ist sie ein child Object vom Controller? aber ich sehe nur dass du den controller drehst? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
StolleJay Geschrieben 24. April 2019 Autor Melden Share Geschrieben 24. April 2019 Das Script ist noch nicht richtig Optimiert deshalb habe ich noch das .transform. drin Ja die Camera ist ein Child vom Controller. Die Camera selber drehe ich nicht sondern den Controller. Dadurch wird die Camera ja mit gedreht. Der Controller ist auch eine Art PoV (Point of View). Das mit den jeweils 45° klappt ja einwandfrei nur das von "Frei" Drehen zurück zu den jeweils 45° Schritten bekomme ich nicht hin. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 24. April 2019 Melden Share Geschrieben 24. April 2019 Aso, ich dachte du willst das parent und child objekt separat drehen, und ich dachte mir noch warum sollte man sowas wollen 🙃 Jetzt noch eine Frage zur funktion, soll die Kamera direkt nach dem loslassen von Alt+E / Alt+Q, also nach dem frei drehen, direkt auf den nächsten 45Grad Schritt gehen oder erst wenn man eine Taste Q oder E drückt? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
StolleJay Geschrieben 24. April 2019 Autor Melden Share Geschrieben 24. April 2019 Ja so was wäre dann doch mehr oder weniger Sinnfrei Die Camera soll die Position halten bis man wieder Q oder E drücke ohne ALT. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 24. April 2019 Melden Share Geschrieben 24. April 2019 Oh, Rotation, meine Achillesferse. Rotation geht von 0 bis 180 und von 0 bis -180, euler angels sind wiederum von 0 bis 360, da bekomme ich immer die Kriese. Also die 0 360 Grad übergänge müsste man nochmals bearbeiten, aber ev. hilft es dir ja soweit? using System.Collections; using System.Collections.Generic; using UnityEngine; public class rotateTest : MonoBehaviour { public Transform controller; public float moveSpeed = 4; public float rotateSpeed = 20; public bool leftMove = false; public bool rightMove = false; public bool upMove = false; public bool downMove = false; public float zoomMin = 0.75f; public float zoomMax = 3; public float zoomSpeed = 0.25f; private Vector3 newPosition; public int rotationY; public float _rotationY; public float testeulerangle; // Update is called once per frame void Update() { // Movement moveLeftRight(); moveUpDown(); // Rotation rotateLeftRight(); } void moveLeftRight() { //MoveLR... } void moveUpDown() { //MoveUD... } void rotateLeftRight() { if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt)) { //controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0); _rotationY -= 1; } else if (Input.GetKeyDown(KeyCode.E)) { if(_rotationY != 0) { _rotationY = 0; } //controller.transform.Rotate(0, -45, 0); if(rotationY >=1 ) { rotationY -= 45; } else { rotationY =45; } } if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt)) { //controller.transform.Rotate(0, +rotateSpeed * Time.deltaTime, 0); _rotationY += 1; } else if (Input.GetKeyDown(KeyCode.Q)) { if (_rotationY != 0) { _rotationY = 0; } //if(controller.eulerAngles.y != ) //controller.transform.Rotate(0, +45, 0); if (rotationY <= 359) { rotationY += 45; } else { rotationY =360; } } float yRoation = Mathf.Lerp(controller.eulerAngles.y, rotationY+_rotationY, rotateSpeed * Time.deltaTime);// lerp smooth out between two values controller.eulerAngles = new Vector3(0, yRoation, 0); testeulerangle = controller.eulerAngles.y; } } Ist noch nicht ganz schick und zu Ende gedacht, aber ich hab irgendwie gad ne blockade 🙃 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
StolleJay Geschrieben 24. April 2019 Autor Melden Share Geschrieben 24. April 2019 Danke. Ich werde es mal versuchen. Aktuell schnell mal getestet und ja das mit den 0 und 360 stimmt irgendwie noch nicht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 24. April 2019 Melden Share Geschrieben 24. April 2019 Also das hier funktioniert wesentlich besser, fehlt nur noch ein smoother Übergang beim drücken von Q oder E using System.Collections; using System.Collections.Generic; using UnityEngine; public class rotateTest : MonoBehaviour { public Transform controller; public float moveSpeed = 4; public float rotateSpeed = 20; public bool leftMove = false; public bool rightMove = false; public bool upMove = false; public bool downMove = false; public float zoomMin = 0.75f; public float zoomMax = 3; public float zoomSpeed = 0.25f; public int rotationY; public float _rotationY; // Update is called once per frame void Update() { // Movement moveLeftRight(); moveUpDown(); // Rotation rotateLeftRight(); } void moveLeftRight() { //MoveLR... } void moveUpDown() { //MoveUD... } void rotateLeftRight() { if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt)) { //controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0); _rotationY -= rotateSpeed*Time.deltaTime; } else if (Input.GetKeyDown(KeyCode.E)) { if(_rotationY != 0) { _rotationY = 0; } rotationY -=45; } if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt)) { _rotationY += rotateSpeed*Time.deltaTime; } else if (Input.GetKeyDown(KeyCode.Q)) { if (_rotationY != 0) { _rotationY = 0; } rotationY += 45; } controller.eulerAngles = new Vector3 (0, rotationY+_rotationY,0); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.