KaBau Geschrieben 21. April 2019 Melden Share Geschrieben 21. April 2019 Hi, ich möchte mit folgendem Script mein Schiff wie in beigefügtem Video drehen (was alles nicht klappt, schreibe ich am Ende): public class PlyRotUridium : MonoBehaviour { [SerializeField] GameObject ply; [SerializeField] Transform plyShipMain; [SerializeField] GameObject plyShip; [SerializeField] Transform plyGun; [SerializeField] GameObject background; // [SerializeField] // GameObject backgroundStars; [SerializeField] float plyRotUridiumDuration = 1.0f; public float plyShipMainRotX; public float plyShipMainRotZ; public float plyShipRotZ; float plyShipRotZSpeed; float plyRotAngelEnd = 180.0f; float plyRotRealAngelEnd; float backgroundMoveSpeed; float backgroundStop = 0.0f; [SerializeField] float backgroundEndSpeed = -0.06f; bool rotUridiumYes = false; void Update() { if (Input.GetKeyDown("u") && !rotUridiumYes) { rotUridiumYes = true; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; // Kanonen ausstellen, damigt beim Drehen nicht sonstwohin geschossen wird. var plyRotScript = plyShip.GetComponent<PlyShipRot>(); plyShipRotZ = plyShip.GetComponent<PlyShipRot>().plyRotZ; plyShipRotZSpeed = plyShip.GetComponent<PlyShipRot>().plyRotSpeed; plyRotScript.enabled = !plyRotScript.enabled; // leichtes Drehen um Z Achse ausschalten, damit das Script mit diesem nicht zusammenkommt. Vector3 gunRot = plyGun.eulerAngles; gunRot.y += 180.0f; // Kanonen um 180 Grad drehen, damit später die Schußrichtung stimmt. plyGun.eulerAngles = gunRot; plyShipMainRotX = plyShipMain.eulerAngles.x; plyShipMainRotZ = plyShipMain.eulerAngles.z; // var rotx = plyRotX; // plyRotRealAngelEnd = (rotx += plyRotAngelEnd); // eigentlich möchte ich hier zum vorhandenen Winkel zusätzlich 180° hinzurechnen. backgroundMoveSpeed = background.GetComponent<TransformForward>().moveSpeed; // StartRot(); StartCoroutine(PlyRotXZUridium(backgroundStop, backgroundEndSpeed, plyRotAngelEnd, plyRotUridiumDuration)); } } /* void StartRot() { while (plyShipRotZ == 0) { if (plyShipRotZ < 0) { plyShipRotZ += 1 * plyShipRotZSpeed; } if (plyShipRotZ > 0) { plyShipRotZ -= 1 * plyShipRotZSpeed; } } if (plyShipRotZ == 0) { StartCoroutine(PlyRotXZUridium(backgroundStop, backgroundEndSpeed, plyRotAngelEnd, plyRotUridiumDuration)); } } */ private void FixedUpdate() { if (rotUridiumYes) { // plyShip.transform.eulerAngles = new Vector3(0, 0, -plyShipRotZ); plyShipMain.eulerAngles = new Vector3(plyShipMainRotX, 0, plyShipMainRotZ); background.GetComponent<TransformForward>().moveSpeed = backgroundMoveSpeed; } } private IEnumerator PlyRotXZUridium(float targetBackStop, float targetBackStart, float targetRot, float duration) { var startBack = backgroundMoveSpeed; var startRotX = plyShipMainRotX; var startRotZ = plyShipMainRotZ; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStop, progress); plyShipMainRotX = Mathf.Lerp(startRotX, targetRot, progress); yield return null; } plyShipMainRotX = targetRot; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStart, progress); plyShipMainRotZ = Mathf.Lerp(startRotZ, targetRot, progress); yield return null; } backgroundMoveSpeed = targetBackStart; plyShipMainRotZ = targetRot; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; var plyRotScript = plyShip.GetComponent<PlyShipRot>(); plyRotScript.enabled = !plyRotScript.enabled; yield return new WaitForSeconds(0.2f); rotUridiumYes = false; } } Hier die Drehung: RotierenUridium.mp4 Erläuterung: wie im Video zu erkennen ist, hat mein Player verschiedene Child Objekte: - PlyShip (welches im Script eine Variable ist): dieses nutze ich, um ein kleines Kippen (Drehung um die Z-Achse) zu erzeugen, wenn man sich seitlich bewegt. Diese Drehung schalte ich im Script aus. - Child zu PlyShip: PlyMain (auch eine Variable im Script): hier sind alle sichtbaren Komponenten des Schiff enthalten - PlyGun (eine weitere Variable im Script): Die Spawn Punkte der verschiedenen Waffen Folgende Probleme habe ich: 1: ich drehe das GameObject "PlyMain" nur um die X und Z Achse. Wie im Video zu erkennen ist, stehen diese nach der Drehung wieder auf "0" und die Y Achse auf "-180", obwohl ich diese gar nicht ändere. Das ist warscheinlich mein Ursprungsproblem für den folgenden Punkt. 2: ich schaffe es nicht, die Drehung zu wiederholen, sprich mich zurück zu drehen. Eigendlich dachte ich, dass ich mit den Zeilen "var rotx = plyRotX;" und "plyRotRealAngelEnd = (rotx += plyRotAngelEnd);" iin der Update Funktion mir den aktuellen Wert der Achsen hole und dann 180° hinzurechne - klappt aber nicht. 3: wie geschrieben, hat mein GameObjekt "PlyShip" ein eigenes Script zu leichten Kippen des Schiff. Wenn mein "PlyShip" noch etwas gekippt ist, hat das natürlich optisch Auswirkungen auf das Child "PlyMain". Was mich wundert: es werden aber auch von "PlyMain" die Werte der Z Achse geändert (siehe Video am Ende). 4: um das zu umgehen habe ich die Funktion "StartRot" (im Script aktuell inaktiv geschaltet) eingebaut, um vor der eigendlichen Drehung das Kippen von "PlyShip" wieder auf "0" zu setzten. Das klappte aber auch nicht. 5: ich kann derzeit keine While Schleife ausführen. Unity stürzt mit dabei immer komplett ab. Ich muss es mit den Taskmanager beenden. Hier noch die Drehung, wenn das Schiff etwas gekippt ist: RotierenUridium2.mp4 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
KaBau Geschrieben 23. April 2019 Autor Melden Share Geschrieben 23. April 2019 So, ich habe etwas experememtiert: - wenn ich "float plyRotAngelEnd = 179.0f;" eingebe ist das Ergebnis nach der Drehung für "Rotation" X, Y, Z: 1, -180,-1 - wenn ich nur über die X Achse drehe und nicht noch über Z Achse ist das Ergebnis nach der Drehung: -180, 0, 0 - wenn ich die X Achse und die Y Achse drehe ist das Ergebnis nach der Drehung: 0, 0, -180 Es scheint also so, dass Unity versucht die Werte für "Rotation" nach der Drehung zu optimieren - das mache ich mir doch zu Nutze für mein Problem Nummer 2. Dadurch, dass mein Schiff aufgrund des Wert "Rotation" Y = -180 gedreht ist, und die anderen Achsen nun wieder auf "0" stehen, nehme ich die Y Achse mit in meinem Script auf: Ich ergänze public float plyShipMainRotY; und in der Update Function plyShipMainRotY = plyShipMain.eulerAngles.y; und ändere in der FixedUpdate Function plyShipMain.eulerAngles = new Vector3(plyShipMainRotX, plyShipMainRotY, plyShipMainRotZ); Nun sieht die Drehung wie folgt aus - zur Verdeutlichung habe ich die Drehtzeit "plyRotUridiumDuration" etwas erhöht. Im Spiel drehe ich natürlich schneller. Edit: da ich weiter unten das fertige Video zeige, habe ich an dieser Stelle den Zwischenschritt gelöscht. Da ich nun wirklich alle Achse nutze könnte ich eventuell anstatt 3 float Variablen mit einer Vector3 Variable arbeiten. Ich setzte mich aber ersteinmal an meine weiteren Probleme und hoffe, dass nicht in einem Update die Optimierung der Werte für "Rotation" wieder aufgehoben wird. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
KaBau Geschrieben 24. April 2019 Autor Melden Share Geschrieben 24. April 2019 Juhu, ich hab´s geschaft. Da das Problem ja nicht im Child "PlyMain" war, sondern durch die Drehung im darüberliegenden "PlyShip" entstanden ist, habe ich mein Dreh-Script nun auch dort angesiedelt: public class PlyRotUridium : MonoBehaviour { [SerializeField] GameObject ply; // [SerializeField] // GameObject plyShip; [SerializeField] Transform plyGun; [SerializeField] GameObject background; // [SerializeField] // GameObject backgroundStars; [SerializeField] float plyRotUridiumDuration = 1.0f; public Vector3 plyShipRot; float plyRotAngelEnd = 180.0f; float plyRotRealAngelEnd; float backgroundMoveSpeed; float backgroundStop = 0.0f; [SerializeField] float backgroundEndSpeed = -0.06f; bool rotUridiumYes = false; bool plyRotScriptYes = true; void Update() { if (Input.GetKeyDown("u") && !rotUridiumYes) { rotUridiumYes = true; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; // Kanonen ausstellen, damigt beim Drehen nicht sonstwohin geschossen wird. var plyRotScript = GetComponent<PlyShipRot>(); plyRotScript.enabled = !plyRotScript.enabled; // leichtes Drehen um Z Achse ausschalten, damit das Script mit diesem nicht zusammenkommt. plyRotScriptYes = false; Vector3 gunRot = plyGun.eulerAngles; gunRot.y += 180.0f; // Kanonen um 180 Grad drehen, damit später die Schußrichtung stimmt. plyGun.eulerAngles = gunRot; plyShipRot = transform.eulerAngles; backgroundMoveSpeed = background.GetComponent<TransformForward>().moveSpeed; StartCoroutine(PlyRotXZUridium(backgroundStop, backgroundEndSpeed, plyRotAngelEnd, plyRotUridiumDuration)); } } private void FixedUpdate() { if (!plyRotScriptYes) { transform.eulerAngles = plyShipRot; background.GetComponent<TransformForward>().moveSpeed = backgroundMoveSpeed; } } private IEnumerator PlyRotXZUridium(float targetBackStop, float targetBackStart, float targetRot, float duration) { var startBack = backgroundMoveSpeed; var startRotX = plyShipRot.x; var startRotZ = plyShipRot.z; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStop, progress); plyShipRot.x = Mathf.Lerp(startRotX, targetRot, progress); yield return null; } plyShipRot.x = targetRot; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStart, progress); plyShipRot.z = Mathf.Lerp(startRotZ, targetRot, progress); yield return null; } backgroundMoveSpeed = targetBackStart; plyShipRot.z = targetRot; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; yield return new WaitForSeconds(0.1f); plyRotScriptYes = true; var plyRotScript = GetComponent<PlyShipRot>(); plyRotScript.plyRot = new Vector3(0, transform.eulerAngles.y, 0); plyRotScript.enabled = !plyRotScript.enabled; yield return new WaitForSeconds(0.1f); rotUridiumYes = false; } } Was nun wie folgt aussieht: RotierenUridium4.mp4 Somit habe ich meine Probleme 1 bis 4 gelöst und Problem 5 umgangen. Nun noch die Bewegung des Background anpassen und fertig. 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.