Jump to content
Unity Insider Forum

Background y Position soll Spieler y Position folgen


Matz1987
 Share

Recommended Posts

Hallo.

Ich bin noch ein neuling im umgang mit Unity, also seht es mir bitte etwas nach...

 

Ich mache grade ein 2D Platformer mit einem Parallax background, funktioniert soweit auch ganz gut.

Ich benutze auch die Virtual camera und das funktioniert auch wunderbar.

Nur habe ich das Problem, dass mein background relativ klein ist. wenn ich also ein Level erstelle in dem man nach unten oder oben eine Ebene, Plattform oder was auch immer

hinauf oder herab steigt, der background auf der x Achse bleibt und ich über oder unter dem background alles blau sehe.

Gibt es eine einstellung, in der man festlegen kann, dass der background dem Spieler in der y position folgt?

 

Ich hoffe ihr versteht so einigermaßen was ich meine 😃

 

danke schon einmal.

Link to comment
Share on other sites

Hi!
Da deim Player und auch der Background (und sowieso jedes GameObject) eine Transform komponente haben, kannst du ganz einfach die Positionen der Objekte auslesen und nutzen.
Es gibt jetzt viele Möglichkeiten um die 2 Objekte miteinander kommunizieren zu lassen. Aber egal wie, ein Objekt muss ein anderes kennen um Daten abzufragen und zu manipulieren.
Ich zähle mal ein paar Möglichkeiten auf:

1. Beide Objekte sind zu Beginn in der Szene und beide Objekte werden nie zerstört. Dann kannst du entweder bei Objekt Background eine public Transform Variable erstellen und den Player im Inspector das rein fallen lassen. Diese Referenz kann dann der Background abfragen und sich anhand der Werte selbständig anpassen. Du kannst das auch andersherum machen, indem der Player eine Transform Refernz vom Background hat, diese würde dann vom Player aufgrund seiner eigenen Position angepasst werden.
 

2. Es gibt ein Vermittlungsscript auf irgendeinem Objekt in der Szene, wo der Player seine Y Position in eine öffentliche float Variable rein schreibt und der Background diese Variable für seine eigene Positionsänderung abfragt. In diesem Fall müssen beide Objekte dieses Vermittlungsscript kennen, also eine ReferenzVariable dafür haben.
Wenn der Player innerhalb dieser Szene zerstört werden kann und neu instanziert würde, dann muss der Player natürlich immer beim entstehen nach diesem Script suchen und selbstständig die Referenz bilden. Das kannst du dann nicht im Inspector per Hand festlegen.

3. Fast wie bei 1. aber der Player kann im Spiel zerstört werden und wird dann wieder Instanziert. Jetzt ist da das Problem, dass der ursprüngliche Player weg ist und als neues Objekt wieder entsteht. Eine Referenz vom Player ist somit verloren gegangen und falls der Background eine Referenz vom alten Player hatte, wird eine
"Null Referenz Exception" als Fehlermeldung kommen, denn das Objekt von dem du die Position wissen willst existiert nicht mehr.

Hier bietet sich an, dass der Player, immer wenn er entsteht, sich eine Referenz vom Backgroundscript bildet. Ja, von einem Script und nicht von der Transformkomponente.
Ich gehe davon aus, dass dein Background zu Beginn nicht die selbe Y Position wie den Player hat. Du also einen Versatz (offset) zwischen den beiden Objekten.
Dein Background Script bekommt jetzt eine öffentliche Methode, in die das Playerscript rein springen soll. Damit es das kann muss es das Script erst einmal in der Szene finden und referenzieren. Das geht recht leicht, wenn dein Background einen Tag hat. Wie das in den Scripts aussieht zeige ich gleich.
Jedenfalls sucht der Player einmalig nach dem Backgroundscript und springt dann in jedem Updatezyklus in die Methode vom Backgroundscript rein um seine Y Position zu übermitteln.
In der Methode vom Backgroundscript wird der übermittelte Wert genutzt um seine eigene Y Position an die Y Position vom Player anzupassen.
Beim allerersten Mal ermittelt diese Methode auch diesen Offset, der dann immer bei der Verschiebung mit berücksichtigt wird.

So, hier die Einträge im Script für den Background.
 

bool hasOffset= false;  // diese Variable wird nach dem ersten Empfangen auf true gesetzt
float myOffset;			// hier steht dann der Unterschied der beiden Objekte in der Y Position drin.

public void SetPlayerY(float playerYPosi){ // der Player wird hier rein Springen und einen Wert übergeben

  if(!hasOffset){ // nur beim ersten Mal machen, deswegen wird das gleich auf true gesetzt.
    myOffset = transform.position.y - playerYPosi; // Unterschied ermitteln.
    hasOffset = true;  
  }

  Vector3 myNewPosi= transform.position; // kurz meine Positionswerte ermitteln
  myNewPosi.y = playerYPosi + offset; // den Y Wert verändern
  transform.position= myNewPosi; // Der Transform Komponente die neue Position übergeben

}

 

Und hier das Playerscript, welches an den Background was senden soll:

backgroundScript theBackground; // backgroundScript ist nur ein Beispielname. Musst du so ändern, wie dein Script heißt

void Start(){
  theBackground = GameObject.FindGameObjectWithTag("Background").GetComponent<backgroundscript>(); // einmal nach dem Obj mit dem Tag suchen und das Script verknüpfen
  if( theBackground == null){
    Debug.LogError("kann das Background Script nicht finden!");
  }                 
}

void Update(){
  if(theBackground != null){ 
    theBackground.SetPlayerY(transform.position.y); // bei jedem Update meine Y Position an die Methode im BackgroundScript übergeben.
  }
    
}

Das ist alles.
Der Player sagt dem Background einfach wo er sich auf der Y Achse im Raum befindet und der Background passt sich diesem Wert an.

Das ist nur ein Beispiel ohne, dass ich es getestet habe. Könnten also Fehler drin sein. Gerade beim Offset bin ich mir nicht 100%ig sicher...sollte aber gehen.
Trotzdem wird es dir helfen. Wie du dass dann machst, ist egal. Hauptsache du verstehst wie es geht. :)

 

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...