Jump to content
Unity Insider Forum

Türen zwischen Scenen in 2d game


Brighthell96

Recommended Posts

Hi,

ich hab ein kleines Problem bei dem ich grade nicht so ganz weiterkomme... Und zwar hab ich aktuell in meinem 2D Platformer auf jeder Stage 2 Türen und jede Stage ist eine eigene Scene. Die eine Tür soll einen eine Stage weiter führen, die andere eine Stage zurück. 

Also soll zum Beispiel die Tür am Ende der Stage 2 verbunden sein mit der Eingangstür zu Stage 3. Die Endtür von Stage 3 wiederrum mit der Eingangstür von Stage 4 und so weiter. 

Aktuell habe ich das ganze mit folgendem System umgesetzt: Jede Tür hat nen bool isEntry welcher dann true ist wenn die Tür die "Eingangstür" der Stage ist. wenn der Spieler diese Benutzt dann landet er an der Position der "Ausgangstür" der vorherigen Stage, also der Tür bei der isEntry = false ist.

Allerdings gefällt mir dieses System garnicht. es ist sehr dirty coded und funktioniert nur mit der Annahme das ein Raum genau 2 Türen hat. Eine Stage soll aber auch manchmal nur eine Tür (Sackgasse) oder mehr als 2 Türen haben. Außerdem macht mir das animieren der Türen Probleme. ich bewege den Spieler zwar mithilfe von Stageweiten "startpoint" und "endpoint"-Transforms an die richtige Position, aber mir fällt kein Weg ein wie ich eine Bestimmte Tür targeten kann und sagen kann: Spiel deine onOpen Animation. 

Hier eine Skizze wie ich mir das System in etwa vorgestellt habe.

 

Unbenannt.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde da gar nicht so viel Semantik reinmachen wollen (so mit "welche Rolle hat die Tür im Raum"). Einfach ein Script wie dieses an das Tür-Prefab hängen:

[SerializeField]
private string sceneToOpen;

private void OnTriggerEnter2D(Collider2D other)
{
  if (other.GetComponent<Player>()) // simpler check, ob es der Spieler ist
  {
    SceneManager.LoadScene(sceneToOpen);
  }
}

Kann man natürlich noch hübscher machen und um alles mögliche erweitern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke erstmal für die Antworten.

dank euch bin ich jetzt auf die Idee für ein funktionierendes System gekommen.

vor 5 Stunden schrieb Sascha:

Ich würde da gar nicht so viel Semantik reinmachen wollen (so mit "welche Rolle hat die Tür im Raum")

klar das möchte ich auch garnicht. Es soll ja so simpel wie möglich sein. Das Problem war jedoch dass ich praktisch dem LoadScene() 2 dinge mitgeben können müsste: 

  1. die Position der verknüpften Tür in der geladenen Scene an der der Spieler spawnen soll.
  2. diese Tür muss eine "onOpen" Animation spielen, bei der sie sich öffnet wo dann der Spieler rauskommt. 

Ich hab jetzt mit dem was ihr mir geschrieben habt ein funktionierendes System hinbekommen:

ich habe ein enum DoorTag erstellt welches die möglichen Zustände(Tags) A,B,C,D enthält. Dann habe ich ein ScriptableObject erstellt welches ein public DoorTag hat .Außerdem hat jede Tür ebenfalls ein public DoorTag. Dadurch kann ich jeder Tür im Inspector einen Tag von A-D zuweisen. wenn nun der Player in den Trigger läuft  speichere ich den DoorTag der benutzen Tür in der variable des ScriptableObjects. Dann, auf der nächsten Scene wird in der Awake Methode von den Doors überprüft: ist der Tag im ScriptableObject äquivalent zu dem der Door? dann spawn den Spieler dort und starte die onOpen animation!

bin ziemlich happy mit dem System auch wenn das vermutlich wiedermal eine eher unschöne Verwendung von ScriptableObjects ist @Sascha? :( 

Jedenfalls danke für die Hilfe ❤️ endlich funktionieren die Doors.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Brighthell96:

bin ziemlich happy mit dem System auch wenn das vermutlich wiedermal eine eher unschöne Verwendung von ScriptableObjects ist @Sascha? :( 

Nö, ist doch super. Eine statische Variable würde es auch tun und würde verhindern, dass man irgendetwas im Editor versehentlich falsch zuweist. Aber klingt doch gut!

Eine Sache evtl. noch: Da es hier keinen Sinn ergibt, einen Wert im Editor einzustellen, da er vor dem ersten Auslesen sowieso von einer Tür überschrieben wird. "public" ist hier die richtige Wahl, da alle das Ding lesen und überschreiben können sollen. Aber dann kommt Unity halt an und will das serialisieren und im Editor anzeigen und was nicht alles. Wenn du aber das hier machst:

[System.NonSerialized]
public .....;

...dann taucht das Feld nicht mehr im Editor auf und müllt dein Projekt auch nicht mit Speicherdaten zu.

Ist aber echt nur ne Kleinigkeit, ansonsten ist das halt genau richtig imo, was du schreibst:

vor 2 Stunden schrieb Brighthell96:

. Dann, auf der nächsten Scene wird in der Awake Methode von den Doors überprüft: ist der Tag im ScriptableObject äquivalent zu dem der Door? dann spawn den Spieler dort und starte die onOpen animation!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

alles klar danke!

wo wir grad bei dem Thema sind, wo ist eigentlich der unterschied zwischen:

[System.NonSerialized]

und dem hier?:

[HideInInspector]

Generell wollte ich fragen kennst du ein gutes Video oder ne Seite welche diese ganzen Unity-Eigenen, in eckigen Klammern stehenden Features umfasst? Natürlich gibt es die offizielle Dokumentation aber wenn ich etwas nicht kenne (z.b. [System.NonSerialized] war mir nicht bekannt) kann ich schlecht nach sowas suchen. 

Ich hab oft das Gefühl das man damit richtig coole Sachen machen kann aber hab keine Ahnung davon. Es gibt zum Beispiel dieses [System.Serializeable] welches ich ständig in tutorials sehe aber ich verstehe nicht genau was es macht. Es wäre cool wenn es für diese ganzen Funktionen ein Tutorial gäbe und wo/wie/wann man sie benutzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Schau mal hier:

using UnityEngine;

public class Example : MonoBehaviour
{
    // Make the variable p not show up in the inspector
    // but be serialized.
    [HideInInspector]
    int p = 5;
}

und dem:

class Test
{
    // p will not be shown in the inspector or serialized
    [System.NonSerialized]
    public int p = 5;
}

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 24 Minuten schrieb Brighthell96:

Ich hab oft das Gefühl das man damit richtig coole Sachen machen kann aber hab keine Ahnung davon.

Ja, aber eine richtig umfassende Sammlung gibt es nicht. Wäre auch zu viel, muss man mit der Zeit kennenlernen. Aber du kannst einfach mal nach "things i wish i knew earlier unity"-Videos suchen... oder ähnlichen :)

vor 24 Minuten schrieb Brighthell96:

Es gibt zum Beispiel dieses [System.Serializeable] welches ich ständig in tutorials sehe aber ich verstehe nicht genau was es macht. Es wäre cool wenn es für diese ganzen Funktionen ein Tutorial gäbe und wo/wie/wann man sie benutzt.

Für das spezifisch hab ich was für dich: http://blog.13pixels.de/2019/an-intro-to-serialization-in-unity/

[System.Serializable] kommt da drin nicht vor, aber baut auf dem Hintergrundwissen auf. Es markiert eine Klasse oder ein Struct als serialisierbar. Wenn eine Klasse von UnityEngine.Object erbt (so wie GameObject, Component oder ScriptableObject), dann kannst du das Objekt per Drag and Drop in ein Feld ziehen. Bei Klassen (und Structs), die nicht davon erben, aber dieses Attribut (so heißen die Dinger in eckigen Klammern übrigens) haben, werden die Objekte einfach mit Foldout im Editor angezeigt. Unity baut dabei immer ein Objekt, kann also nicht null sein. Probier's einfach mal aus:

public class Test : MonoBehaviour
{
  [System.Serializable]
  private struct Thing
  {
    public int number;
    public string text;
  }
  
  [SerializeField]
  private Thing thing;
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...