Fabi0011 Geschrieben 17. Oktober 2021 Melden Share Geschrieben 17. Oktober 2021 Hi, ich wollte mit dem folgenden Code machen, dass sich der Hintergrund sich unendlich lange bewegt und "wiederherstellt": using System.Collections; using System.Collections.Generic; using UnityEngine; public class BackgroundMove : MonoBehaviour { void Start() { } // Update is called once per frame void Update() { GameObject background = GameObject.Find("Background"); GameObject background2 = GameObject.Find("Background2"); background.transform.Translate(Vector2.left * Time.deltaTime * 5); background2.transform.Translate(Vector2.left * Time.deltaTime * 5); if (background.transform.position.x < 6) { background.transform.position.Set(78, 0, 0); } if (background2.transform.position.x < 6) { background2.transform.position.Set(78, 0, 0); } } } Die 2 Hintergrundobjekte bewegen sich zwar, aber bei if (background.transform.position.x < 6) { background.transform.position.Set(78, 0, 0); } if (background2.transform.position.x < 6) { background2.transform.position.Set(78, 0, 0); } passiert nichts. Im angehangenen Video sieht man, was ich meine. :3 UnityBackgroundMoveDoesntWorkRight.mp4 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. Oktober 2021 Melden Share Geschrieben 17. Oktober 2021 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 17. Oktober 2021 Melden Share Geschrieben 17. Oktober 2021 Wo hast du denn her, dass es ein .Set Befehl gibt? Gibt es das wirklich? Da du ja immer auf 78,0,0 verschieben willst, legst du dir einfach eine Vector3 Variable(Konstante) an, die dann übergeben wird. const Vector3 movePosition = new Vector3(78f,0f,0f); void Update(){ if (background.transform.position <=-6){ background.transform.position=movePosition; } } Noch besser wäre es, wenn dieses dein Background selber machen würde. Dafür müsstest du das Script einfach nur auf den Background legen. Dann kann der Background seine eigene Position selbst abfragen und auch selbst setzen, ohne dass da irgendein Script auf einem anderen GameObject das tun muss. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. Oktober 2021 Melden Share Geschrieben 17. Oktober 2021 vor 10 Stunden schrieb malzbie: Wo hast du denn her, dass es ein .Set Befehl gibt? Gibt es das wirklich? Vector3.Set vor 10 Stunden schrieb malzbie: Da du ja immer auf 78,0,0 verschieben willst, legst du dir einfach eine Vector3 Variable(Konstante) an, die dann übergeben wird. Macht doch hier keinen Unterschied? Mal davon abgesehen, dass du keine Vector3-Konstanten machen kannst. vor 10 Stunden schrieb malzbie: Dann kann der Background seine eigene Position selbst abfragen und auch selbst setzen, ohne dass da irgendein Script auf einem anderen GameObject das tun muss. @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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 17. Oktober 2021 Melden Share Geschrieben 17. Oktober 2021 @Sascha Jo. Da hab ich Brett vorm Kopp gehabt. transform.position.Set ist ja ein Setzen eine Vector3. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 20. Oktober 2021 Melden Share Geschrieben 20. Oktober 2021 @Sascha Oh, das mit Set kannte ich auch noch nicht. Oh man hätten sie auch noch gleich SetX, SetY, SetZ gemacht (hab ich aber als extension gemacht) z.B. transform.position = transform.position.SetX(0).SetY(0). Ich weiß man kann position[0] fürs x setzen machen, aber die Schreibweise ist irgendwie doof und das obige funktioniert auch nicht so. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 20. Oktober 2021 Melden Share Geschrieben 20. Oktober 2021 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(...); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 20. Oktober 2021 Melden Share Geschrieben 20. Oktober 2021 Verstehe. Theorietisch müsste man so machen, damit es geht: Vector3 pos = transform.position; pos.Set(100,0,0); transform.position = pos; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 20. Oktober 2021 Melden Share Geschrieben 20. Oktober 2021 Genau. Und das kann man sich dann auch irgendwie sparen 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.