Jump to content
Unity Insider Forum

Sascha

Administrators
  • Posts

    12,932
  • Joined

  • Last visited

  • Days Won

    706

Sascha last won the day on October 23

Sascha had the most liked content!

6 Followers

About Sascha

  • Birthday 08/13/1990

Contact Methods

  • Website URL
    http://13pixels.de

Profile Information

  • Gender
    Male
  • Location
    Hamburg
  • Interests
    Programmierung

Recent Profile Visitors

74,552 profile views

Sascha's Achievements

Advanced Member

Advanced Member (3/3)

2.6k

Reputation

  1. Moin! Da dürfte dir eine Coroutine helfen. Das ist eine Methode, die über mehrerere Frames hinweg laufen kann. Um mal dein Beispiel in Coroutine-Form umzuwandeln: private void OnEnable() { StartCoroutine(DoStuff()); } private void OnDisable() { StopAllCoroutines(); } private IEnumerator DoStuff() { while (enabled) { for (int x = coord.x; x < coord.x; x++) { for (int z = coord.z; z < coord.z; z++) { Aufgabe(z,y); yield return null; // Warte einen Frame } } } } OnEnable und OnDisable sind so eingerichtet, dass die Coroutine immer läuft, solange die Komponente enabled ist, und wieder stopt, wenn sie disabled wird. Das yield return null wartet einen Frame und setzt die Methode im nächsten Frame an dieser Stelle fort. Du könntest diese Zeile auch hinter die innere Schleife packen, dann wartest du nur einmal pro "Spalte", also einmal pro Durchlauf der äußeren Schleife, und nicht bei jeder "Zelle". Du kannst auch einen Zähler einbauen und einfach alle X "Aufgaben" einmal warten: private IEnumerator DoStuff() { int counter = 0; while (enabled) { for (int x = coord.x; x < coord.x; x++) { for (int z = coord.z; z < coord.z; z++) { Aufgabe(z,y); counter++; if (counter == SOME_VALUE) { yield return null; // Warte einen Frame counter = 0; } } } } } Mit einer Stopwatch könntest du sogar Zeit messen und diesen Aufgaben ein festes Zeitbudget geben.
  2. Jau! Die Reihenfolge, in der du deine Methoden definierst, ist egal. Eine Methode hat eine Signatur (für dich erstmal wichtig: der Name) und wird über diese aufgerufen. Unity hat jetzt diese etwas merkwürdige Eigenschaft, besondere Methodennamen (Start, Update, ...) selber aufzurufen. Wenn du also irgendwo in deine Komponente eine Methode namens OnEnable definierst, dann wird Unity diese Methode aufrufen, wann immer die Komponente aktiviert wird. Das ist zum einen immer, wenn das Häckchen der Komponente aus ist und wieder angemacht wird (bzw. enabled false ist und auf true gesetzt wird), aber zum anderen auch einmalig am Anfang des "Lebens" der Komponente. Und daran ändert sich nichts, wenn du OnEnable über oder unter eine andere Methode definierst. Und OnDisable wird halt aufgerufen, wann immer du eine Komponente ausschaltest. Das schließt auch den Moment ein, wo sie zerstört wird.
  3. Super! Ja! Und das funktioniert nicht nur - es ist auch eine sehr gute Lösung. Drei kleine Änderungen würde ich jedoch vorschlagen: Du hast jetzt die Schleife Anfrage - Warten - Anfrage - Nochmal Das heißt, dass zwischen der zweiten und der dritten Abfrage keine Wartezeit liegt. Entferne einfach die zweite Anfrage aus deinem Code - die Wiederholung hast du ja schon durch die Schleife. while (enabled) { // Anfrage // Warten } Du benutzt "enabled" als Schleifen-Bedingung. Das ist super! Wenn du deine Komponente deaktivierst, arbeitet sie nicht mehr weiter. Genau dafür ist enabled ja auch da. Wenn du jetzt allerdings deine Komponente wieder anschaltest, dann wird die Coroutine nicht noch einmal neu gestartet. Start wird nur einmal pro Komponente ausgeführt. Du könntest die StartCoroutine-Zeile aber auch statt in Start in OnEnabled packen. Dann wird die Coroutine jedes Mal wieder gestartet, wenn du die Komponente reaktivierst. Um es komplett abzurunden, würde ich die Coroutine noch in OnDisable stoppen wollen. Wenn die Komponente deaktiviert ist und der Code-Fluss am "while (enabled)" ankommt, dann wird die Schleife, und damit die Coroutine, abgebrochen. Wenn du die Komponente aber deaktivierst, bricht die Coroutine deshalb noch nicht automatisch ab. Deaktivierst du deine Komponente und aktivierst du sie wieder, bevor die Schleife einmal ihre Bedingung überprüft, dann wird die Coroutine nicht beendet. Und wegen 2. startet dann eine neue, und du hast zwei gleichzeitig laufen. Daher einmal ein StopAllCoroutines() in OnDisable - nur zur Sicherheit.
  4. Nur, wenn du es nicht richtig machst Mit der Lösung, die ich dir zuletzt gegeben habe, kannst du Space.World benutzen. Nein, das ist keine gute Idee. Ändere niemals die Koordinaten eines Quaternions direkt. Mach's lieber so wie in meiner Lösung.
  5. Da würde ich nicht über EulerAngles gehen, das kann schief gehen. Lieber einmal die Y-Koordinate des Richtungsvektors auf 0 setzen, bevor da eine Rotation draus gemacht wird: var lookDirection = myCamera.forward; lookDirection.y = 0; var lookRotation = Quaternion.LookRotation(lookDirection); var input = new Vector3(...); var moveDirection = lookRotation * input; Mit Cinemachine ist das immer so schön einfach, was kleines zu basteln, aber sobald man da was spezifisches von will, wird's immer gleich hakelig. Deswegen benutz ich das Ding nie. Ich mag's z.B. viel lieber, mir eine kleine GO-Hierarchie zu bauen und da als Parent der Kamera ein Objekt zu haben, das sowieso schon horizontal ausgerichtet ist. Dann spart man sich solche Umwege im Code.
  6. Aah, Verzeihung, verstehe. In dem Fall kannst du aber trotzdem die erste von meinen beiden Zeilen nehmen und "transformedDirection" statt "Bewegungsrichtung" in Quaternion.LookRotation reinschmeißen. "Bewegungsrichtung" ist ja einfach nur der Vektor deines Gamepad-Sticks oder WASD oder so. Wenn du den Stick nach oben drückst, dann ist das (0, 0, 1). Völlig egal, was die Kamera in dem Moment macht. Und in diese Richtung drehst du dich aktuell einfach immer.
  7. Korrekt. Du sollst halt nicht ein Array definieren dürfen, das die Nummern 0, 1, 2, 3 und 5 hat. Du kannst einfach nur eine Liste von Elementen aufschreiben, und dir Nummerierung ist dabei implizit. Die Form für ein Array ist: [ element, element, element ] Das ist ein Array mit 3 Elementen ([0], [1] und [2]), wobei "element" natürlich durch korrektes Json ersetzt werden müsste. Z.B. [ {"x": 10, "y": 20}, {"x": 10, "y": 30}, {"x": 10, "y": 40} ] Hier haben wir 3 Objekte, die jeweils die Eigenschaften "x" und "y" besitzen. Passt also z.B. auf Vector2. Das Äquivalent zu diesem gesamten Json-String wäre also z.B. Vector2[] wenn man es in C# definiert. Du kannst aber eben kein Array als Wurzel haben, also muss da ein Objekt drumherum: { "points": [ {"x": 10, "y": 20}, {"x": 10, "y": 30}, {"x": 10, "y": 40} ] } Das Äquivalent dazu wäre [System.Serializable] public struct PointArray { public Vector2[] points; }
  8. Ich tippe mal auf das hier: Das heißt, dass wenn du ein Objekt reinziehst, das relativ zu dessen Parent nicht gedreht ist, dann läufst du immer nach "Norden". Wenn du die World Space-Ausrichtung eines Objekts benutzen willst, dann würde ich den Parameter weglassen und stattdessen schreiben: var transformedDirection = Kamera.TransformDirection(Bewegungsrichtung); transform.Translate(transformedDirection * Geschwindigkeit * Time.deltaTime);
  9. Merkste, oder? Wenn dein Root-Element ein Objekt ist... dann ist es nicht gleichzeitig ein Array. Du hast da auch kein Element Nummer 0 ([0]), du hast da ein Feld mit dem Namen "[0]". Wenn du eine Json-Bibliothek benutzt, wo du alles per Hand ausliest, dann kannst du das Element mit dem Namen "[0]" natürlich auslesen. Wenn du aber JsonUtility nutzt, dann musst du Klassen und/oder Structs erstellen, die dein Json wiederspiegeln. Und "[0]" ist kein gültiger Name für eine Eigenschaft: struct Foo { public int [0]; // Nö. public int number; // Jo. } Lies dir das hier bitte nochmal durch. Du kannst wunderbar Arrays benutzen, wenn du das willst. Du musst sie halt nur in ein Objekt rein packen. Und genau dafür ist das ManyThings-Struct schon da.
  10. Genau. Und das kann man sich dann auch irgendwie sparen
  11. Hah, au weia... Also... @malzbie @MaZy und natürlich auch @Fabi0011. Das ist ne echt fiese Falle, der ich jetzt auch auf den Leim gegangen bin, weil ich Set() nie benutze. Man kann ja nicht transform.position.x setzen, weil Transform.position eine Struct-Property ist. Wenn man transform.position schreibt, dann wird eine neue Vector3-Instanz erstellt und zurückgegeben. Schreibt man transform.position.x = blub, dann käme blub nicht beim Transform an, weil dieser neue Vector3 abgeändert und nie irgendwie zurückgeführt wird. Deshalb verbietet C# das - es ergibt einfach niemals Sinn. Was C# nicht verbietet ist, auf Structs, die von einem Property-Getter zurückgegeben werden, Methoden aufzurufen. Da kann ja alles mögliche drin passieren. Was aber nicht passieren kann ist, dass diese Methode Werte des Structs ändert und diese dann wieder automagisch in der Property landen. Genau wie transform.position.x = blub nicht geht, geht auch transform.position.Set(blub) nicht. Hab's gerade nochmal ausprobiert. Der einzige Unterschied ist, dass der Compiler hier keinen Riegel vorschiebt, weil er sich nicht sicher sein kann, dass der Aufruf keinen Sinn ergibt. Also... Lange Rede, kurzer Sinn: transform.position.Set(...) funktioniert nicht. Niemals. Stattdessen: transform.position = new Vector3(...);
  12. Vector3.Set Macht doch hier keinen Unterschied? Mal davon abgesehen, dass du keine Vector3-Konstanten machen kannst. @Fabi0011 Das solltest du wirklich tun. Dann musst du nicht jedes Mal deinen Code um quasi immer dieselben drei Zeilen erweitern, wenn du ein neues Objekt haben willst.
  13. Sicher, dass nichts passiert? Hast du denn mal nachgeschaut, wo die Hintergründe jetzt sind? Einfach mal im laufenden Spiel einen der Hintergründe selektieren und dann im Inspektor auf die X-Position schauen.
  14. Now that makes more sense, thank you
  15. Moin! Ich hab mir das mal angeschaut (auch, weil ich das Ding gar nicht kannte und mal ausprobieren wollte...). Ist ja ein ganz cooles Teil. Es würde mich nicht wundern, wenn das Ding da einfach die Beschränkung hat, dass nur das fokussierte Fenster Daten kriegt. Ich hab ein bisschen rumprobiert und muss leider sagen: Das sieht schlecht aus.
×
×
  • Create New...