Jump to content
Unity Insider Forum

KaBau

Members
  • Content count

    85
  • Joined

  • Last visited

  • Days Won

    2

KaBau last won the day on April 2

KaBau had the most liked content!

Community Reputation

6 Neutral

About KaBau

  • Rank
    Advanced Member
  • Birthday 08/03/1973

Profile Information

  • Gender
    Male
  • Location
    Hildesheim

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. 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: RotierenUridium3.mp4 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.
  2. 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
  3. Danke, ich habe es nun auf ply = GameObject.Find("Player"); eingekürzt. Die Transform Komponente hole ich mir nun an einer anderen Stelle des Script. Mal schauen, ob nun irgendwann die Fehlermeldung doch noch kommt - was ja nicht passieren sollte. @Sascha, einige Fragen noch zu deinem Blog auf http://blog.13pixels.de/2019/why-strings-are-not-your-friend/ : Ich verstehe zwar, wieso man keine Strings nutzen soll, aber kann man sich bei der Angabe einer Komponente in einem Script nicht auch vertippen? Oder kann es beim Umbenennen der "Zielkomponente" (was man eigendlich nicht machen sollte) nicht auch dazu kommen, dass ein Script diese nicht mehr findet? Wo ist da der Unterschied zur Eingabe eines Namen, wie ich es mit .Find("Player") gerade mache? Liegt der Unterschied darin, dass beim Eintippen des Script mir hier schon der Fehler angezeigt wird, während ein falscher Name erst beim Testen des Spiel als Fehler erscheint?
  4. Hi, folgendes Script liegt auf den Objekten, welche nach dem Zerstören eines Feindes erstellt werden (also Münzen zum aufsammeln). Ziel des Script ist es, dass diese Münzen sich zum Player bewegen, wenn er eine bestimmte Entfernung zu den Münzen unterschritten hat. Nun kann es natürlich sein, dass in dem Moment, wo diese Münzen per "instantiate" erstellt werden mein Player zerstört wird. Somit habe ich in der Start Function folgendes eingebaut: ply = GameObject.Find("Player").GetComponent <Transform>(); if (ply == null) { Destroy (gameObject); } Trotzdem wird mir manchmal eine Fehlermeldung angezeigt, das eine Referenz (die genaue Meldung liegt mir gerade nicht vor) nicht gefunden wird, und es wird auf die erste Codezeile verwiesen. Liegt das daran, dass ich hier direkt auf die Transform Komponente zugreife (welche ich später für die Bewegung zum Player benötige) und nicht auf das GameObject als solches?.
  5. KaBau

    Animation Control

    Auch das sind nicht mehr wie ein paar Zeilen Code. Im Grunde ist es ein Looping nichts anderes wie eine Kreisbewegung, nur in einer anderen Achse. Und bei einer Rolle machst du auch nichts anderes, als dein GameObjekt zu bewegen. Wie @Sascha schon schreibt, scheint mir für jede einzelne verschiedene Bewegung eine Animation zu aufwendig sein. Beispiel 1: für eine engen Kreisbewegung benutzt du denselben Code wie für eine weite Kreisbewegung, nur mit einen anderen Wert einer Variable für die Drehung. Diesen Wert kannst du deinem Gegner beim Erstellen zuweisen. Somit hast du für zwei verschiedene Bewegungen denselben Code (ja, ich wiederhole mich). Bei einer Animation müsstest du aber für diese zwei Kreisbewegungen doch auch zwei Animationen erstellen. Beispiel 2: du kannst einem roten runden Gegner dasselbe Beweggungsscript wie dem blauen eckigen Gegner geben. Somit nutzt du auch hier wieder denselben Code. Bei der Animation müsstest du doch wieder zwei Animationen erstellen (eventuell täusche ich mich hier aber). Zu deinem Grundsatzproblem: durch die Nutzung von Code mit Variablen kannst du die Geschwindigkeit schnell im Inspektor einstellen und gleich testen. Oder du schreibst deinen Code so, dass der Gegner in einer Zeit X die Distanz Y zurücklegt, was ja "der Länge einer Strecke" entsprechen würde. Anmerkung: tu uns bitte den Gefallen und nutz gerne die Groß- und Kleinschreibung - das macht uns das Lesen einfacher. Danke.
  6. Hallo @Sascha und @Jomnitech, danke für die Tipps. Ich denke mir, dass der Tipp von Jomnitech auch funktioniert, nur schmirt mit in letzter Zeit bei einer "while" Schleife immer mein Unity (Version 2018.3.0f2) ab. Das hatte ich schon an anderer Stelle gehabt. Sascha: beim Aufrufen der Coroutine meinte Visual Studio, dass eine Klammer am Ende fehlt: StartCoroutine(AnimateRotationSpeed(backRotSpeed, slowRotDuration)); Die habe ich nachgetragen. Zudem hat Visual Studio bei "time += Time.deltaTime" gemeckert, weil der Typ "float" nicht in "int" konvertiert werden kann. Somit habe ich diese Zeile wie folgt abgeändert: for (var time = 0.0f; time < duration; time += Time.deltaTime) Der Unterschied ist im vordersten "time = 0.0f". Klappt wunderbar. Ich spare mir einige Variablen am Anfang (ist somit übersichtlicher), und die "Zeitschleife" ist aus der FixedUpdate Methode raus. Sollte der Code noch erweitert werden bleibt das somit übersichtlicher. Danke. So, und mit "Mathf.Lerp" muss ich mich nun dringend doch einmal auseinander setzen.
  7. Hi, ich habe häufig die Anforderung, dass am Anfang (beim Start oder beim Aktivieren des Script), sich der Wert einer Variable in einem definierten Zeitraum vom Wert "A" zu Wert "B" ändern soll. Im beigefügten, funktionierndem Beispiel soll die Drehgeschwindigkeit "backRotSpeed" von 0.0f auf 0.3f innerhalb von 5 Sekunden ansteigen: public class EnyBBackRotY : MonoBehaviour { float backRotY; [SerializeField] float backRotSpeed = 0.3f; float realBackRotSpeed = 0.0f; float slowBackRotEnd; float slowBackRotSlowDown; [SerializeField] float slowRotDuration = 5.0f; [SerializeField] Transform player; [SerializeField] float between = 1.0f; bool slowRotYes = true; private void Start() { backRotY = transform.eulerAngles.y; slowBackRotEnd = Time.time + slowRotDuration; slowBackRotSlowDown = backRotSpeed / slowRotDuration / 50; // durch 50 für die Durchläufe in der Fixupdate Methode } private void Update() { if (player.transform.position.x > between) { backRotY += 1 * realBackRotSpeed * (player.transform.position.x - between); } if (player.transform.position.x < -between) { backRotY += 1 * realBackRotSpeed * (player.transform.position.x + between); } } private void FixedUpdate() { if (slowRotYes && Time.time <= slowBackRotEnd) { realBackRotSpeed += slowBackRotSlowDown; } transform.eulerAngles = new Vector3(0, -backRotY, 0); } } Nur muss ist nun zum einem in der Start Methode zwei Zeilen eintragen und noch einmal in der FixedUpdate Methode. Somit habe ich für eine Sache (welche nur kurz benötigt wird) an zwei Stellen Eintragungen, was der Lesbarkeit des Code nicht zugute kommt. Gefühlt würde ich sagen, dass ich mit einer Coroutine arbeiten muss. Aber irgendwie fehlt mit hier noch der Ansatz, wie ich sagen kann, dass der Wert der Variable innerhalb der Coroutine von A nach B wechselt und das in der vorgegebenen Zeitvorgabe. Wie geschrieben: es funktioniert, sollte aber sicher übersichtlicher möglich sein.
  8. KaBau

    Terrain drehen / rotieren

    Im nachhinein sicher. Aber meine gesamten anderen Level basieren auf der Logik, dass der Untergrund unter meiner statischen Camera hinweggleitet. Nun alle Beweggungen, Einstellungen von Partikel Systemen (zum Generieren von Wolken und Asteroiden) etc. umzustellen wirft mich doch weit zurück. Ich mach es anders: meine Basis setzten ich auf eine Platte mit anderen technischen Aufbauten. Diese Platte inkl. der Basis kann ich drehen. Mein Terrain ist komplett ausserhalb des Sichtbereich der Camera und bereitet mir somit keine Probleme. Sicher nicht die schönste Lösung, aber als "Alleinkämpfer" möchte man doch immer wieder kleine Fortschritte und Erfolge sehen, um den Spaß nicht zu verlieren.
  9. Hi, kann ich irgendwie ein Gelände um die Y-Achse drehen? Ich habe viele einzelne Terrains aneinander gesetzt um darüber zu fliegen. Am Ende meines Level soll nun eine Basis sein. Mein Raumschiff soll um diese Basis herum fliegen. Nun ist es jedoch so, das meine Camera sich eigendlich nicht bewegt, sondern das Level unter der Camera vorbeifliegt. Um nun am Levelende um die Basis zu fliegen muss ich aber das Gelände mit der Basis um die Y-Achse drehen - aber wie? Es verändert zwar seine Position, behält dabei aber immer eine identische Ausrichtung. Edit: kann ich alternativ ein in Unity erstelltes Terrain in ein Mesh inkl. Texturen konvertieren? Das könnte ich dann ja als normales Game Objekt drehen.
  10. Danke. Nun habe ich mein großes langes Terrain in mehrere quadratische Terrains aufgeteilt und es sieht gut aus. Kann mir noch jemand bei den beiden Fehlermeldungen helfen? Es läuft zwar, aber ich würde gerne wissen, was ich falsch mache? Gemäß Google Übersetzung bedeutet die erste: "Sie können den CPU-Anrufaufruf reduzieren, indem Sie die Detailauflösung pro Patch im Verhältnis zur Detailauflösung so hoch wie möglich einstellen. " Aber: ich kann nur Werte zwischen 8 und 128 eingeben, und die Meldung bleibt noch immer bestehen, und zum anderen: welche Einstellungen sind den sinnvoll, wenn das Terrain ca. 40m unter mir vorbeifliegt? Gemäß Google Übersetzung bedeutet die zweite Meldung: " Die vorberechnete / indirekte Auflösung für dieses Gelände ist wahrscheinlich zu niedrig. Wenn die Clustering-Phase sehr lange dauert, versuchen Sie, eine höhere Einstellung für Echtzeit- / indirekte Auflösung in den Beleuchtungsfenstern zu verwenden, oder weisen Sie LightmapParameters zu, die eine höhere Auflösungseinstellung verwenden. " Bringt eine höhere Auflösung nicht eine schlechtere Performance (bei einem Mobil-Spiel)?
  11. Hi, was du beachten musst: du bewegst nun dein Schiff. Auch wenn dein Schiff dein sichtbares Spielfeld verlässt, bewegt es sich noch immer weiter. Grundsätzlich: 2D oder 3D? Bei 2D startest du eine Drehanimation, bei 3D musst du das Schiff wirklich drehen. Dann muss für den Richtungswechsel ersteinmal eine Abfrage kommen, ob die Drehung schon beendet wurde oder nicht. Ansonsten kann es hier zu Komplikationen kommen. Edit: hatte @Sascha ja schon genannt und bearbeitet. Wie soll die Drehung aussehen: wie bei C64 Klassiker Uridium? Da ist es (wenn ich es richtig in Erinnerung habe) so, dass auch erst die Drehung beendet werden muss, bevor das Schiff wieder gedreht werden kann um in die andere Richtung gedreht werden zu können. Ich mache einen Top Down Shooter. Hier das Thema, welches ich damals erstellt habe: https://forum.unity-community.de/topic/13545-c-player-controlller-für-space-ship-maus-ruckelt/ Und das Thema, für die Touch-Steuerung (wirst du sicher auch noch machen wollen): https://forum.unity-community.de/topic/13806-player-controller-für-space-ship-touch-steuerung-gelöst/?tab=comments#comment-100574 Ich habe die in den Themen eingestellte Scripte später noch etwas verfeinert, aber eventuell helfen dir die hier genannten Scripte trotzdem. Bei mir dreht sich das Raumschiff auch etwas. Diese Drehung habe ich als eigenes Script an mein Model gehängt, welches als Child unter meinem Haupt Game Objekt liegt. Dem Haupt Game Objekt (nennt man dass so?) habe ich das Steuerungs Script gegeben. Ich bewege konstant den Hintergrund. Die Bewegung des Schiff passiert nur im Sichtbereich der Camera (welche sich mit einem eigenen Script etwas nach links und rechts bewegt). Bei dir scheint der Hintergrund statisch zu sein. Dann musst du deine Camera auch mit bewegen. Hierzu gibt es auf Youtube gute Videos von Michael Mark. Er bewgt zwar 2D einen Roboter, aber ich denke mir, das du hier viele Anregungen bekommen kannst.
  12. KaBau

    Schöner oder kurzer Code?

    Ich finde den schönen Code besser. Dort kann ich besser verfolgen, was der Code machen soll. Den kurzen Code kann vielleicht nicht jeder hier lesen, um zu helfen. Konkret: ohne den langen Code hätte ich nun den kurzen Code nicht als if / else erkannt (auch wenn ich in einm Tutorial mal gesehen habe, dass man Code so kürzen kann).
  13. Hi, ich erstelle gerade mein ersten Terrain. Als Space Shooter fliege ich hierfür über dem Mond. Entsprechend hat mein Terrain folgende Maße: Terrain Width: 50 - Breite des Sichtfeld der Camera Terrain Lenght: 1200 - als Länge des Levels Terrain Height: 600 - Hier möchte ich sehr tiefe Schluchten erzeugen, welche in den Mond gegraben wurden. Nun ergeben sich beim Modellieren unschöne Effekte, weil scheinbar durch das extrem unterschiedliche Seitenverhältnis das Modellierraster in die Länge gezogen wird : Zuerst ein Ausschnitt aus dem Game View, danach ein Ausschnitt des SceneView als "Wireframe", zuletzt ein Ausschnitt des SceneView als "Shaded" Was kann ich einstellen, damit das Terrain ordentlich erstellt wird? Anbei meine weiteren Einstellungen - von denen ich kaum weis, was sie bewirken, da es in Tutorials immer heißt "Das sind unwichtige Einstellungen, darum müßt ihr euch nicht kümmern.": Detail Resolution Per Patch: 8 Detail Resolution: 8 Fehlermeldung "You may reduce CPU draw call overhead by setting the detail resolution per patch as high as possible, relative to detail resolution." Anmerkung: egal was ich bei "Detail Resolution Per Patch" eingeben: die Fehlermeldung bleibt bestehen, zumal ich nur einen Wert bis 128 eingeben kann. Detail patches currently allocated: 1 Detail instance denssity: 262144 Base Texture Resolution 1024 Control Texture Resolution: 512 Heightmap Resolution: 512 Lightmap Static: aktiv Scale In Lightmap: 0.0512 (habe ich nie geändert) Lightmap Parameters: Defailt-VeryLowResolution Fehlermeldung: "Precompute/indirect resolution for this terrain is probably too low. If the Clustering stage takes a long time, try using a higher realtime/indirect resolution setting in the Lighting windows or assign LightmapParameters that use a higher resolution setting." Nun werden noch zwei Lightmap angezeigt: "Baked Lightmap" und "Realtime Lightmap".
  14. KaBau

    Mehrere Collider Trigger in einem GameObject?

    Ich weis nicht genau, aber eventuell hilft es ein Empty Game Objekt zu erstellen, welches 3 Child Objekte hat: 1x das zu bewegende Game Objekt und 2x ein Game Objekt mit den Collider und dem dann entsprechenden Script, in dem zu mit Inspectorzuweisung das zu bewegende Game Objekt einbindest.
  15. KaBau

    Berufliche Zukunft

    Wenn du dass schon mit 34 Jahren schreibst, überleg bitte einmal, wie du in 10 Jahren gesundheitlich sein möchtest. Ich bin nun in diesem Alter und finde, dass 12 Stunden Schichten (die vor einer Abgabe im Architekturbüro immer mal anfallen können) für mich anstrengender geworden sind, als vor 10 Jahren.
×