Jump to content
Unity Insider Forum

Unity Hintergrundbewegung funktioniert nicht ganz


Fabi0011

Recommended Posts

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

@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 :D und das obige funktioniert auch nicht so.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...