Jump to content
Unity Insider Forum

Unity Hintergrundbewegung funktioniert nicht ganz


Fabi0011
 Share

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

@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 to comment
Share on other sites

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...