Jump to content
Unity Insider Forum

Möglichkeiten um gleichen Spawnpoint zu verhindern?


Adrian H

Recommended Posts

Hallo, 

wie kann man es Verhindern, dass die Panels nicht an gleicher stelle spawnen? 

 

void Spawn()
    {
        int randomNumbr = UnityEngine.Random.Range(0,9);
        
        Vector3 spawnpointsv = spawnpoints[randomNumbr].GetComponent<Transform>().position;
        
        PhotonNetwork.Instantiate("PlayerPanel",spawnpointsv , quaternion.identity, 0 );
    }

Danke im voraus 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Du könntest in einer Liste die bereits belegten Punkte speichern. Wenn diese Indices erneut gewürfelt werden, würfelst du noch einmal. 

Also: würfeln - prüfen, ob das Ergebnis in der Liste ist - wenn nicht anzeigen und in liste schieben - wenn es drin ist, erneut würfeln. 

 

Christoph 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin ja kein Fan von "Dinge zufällig oft tun" in Code. Die alternative Variante mit berechenbarer Laufzeit ist das Gegenteil: Du hast eine Liste mit allen möglichen Ergebnissen. Nach dem Würfeln streichst du das gewählte Ergebnis aus der Liste und hast beim nächsten Wurf nur noch die übrigen Möglichkeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 4.4.2021 um 17:21 schrieb chrische5:

Hallo

 

Du könntest in einer Liste die bereits belegten Punkte speichern. Wenn diese Indices erneut gewürfelt werden, würfelst du noch einmal. 

Also: würfeln - prüfen, ob das Ergebnis in der Liste ist - wenn nicht anzeigen und in liste schieben - wenn es drin ist, erneut würfeln. 

 

Christoph 

danke Ich hab es jetzt  probiert jedoch wird bei randomNumbr diese Fehlermeldung angezeigt: 

local variable named 'randomNumbr cannot be declared in this scope because it would give a diffrent meaning to random Number, which is already used in a parent or current scope to denote something else.

 

 void Spawn()
    {
        
        int randomNumbr = UnityEngine.Random.Range(0,9);

        Vector3 spawnpointsv = spawnpoints[randomNumbr].GetComponent<Transform>().position;
        
        PhotonNetwork.Instantiate("PlayerPanal",spawnpointsv , quaternion.identity, 0 );
        
        if (randomNumbr == 1 && Playeristschonaufspawn[1])
        {
            int randomNumbr = UnityEngine.Random.Range(0,9);
        }
        else
        {
            PhotonNetwork.Instantiate("PlayerPanal",spawnpointsv , quaternion.identity, 0 );
        }

    }

Danke im voraus 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wie @Sascha das schon ungefähr erwähnt hat, wenn du "perfektes" Spawnsystem benutzen willst, wo man nicht auf der selben stelle spawnst kannst du folgendes tun:

Eine Liste mit Spawnpunkte, Eine Liste, wo du die Liste reinkopierst z.b. AvailableSpawns. Sagen wir mal es gibt A, B, C, D  Spawnpunkte.

Jetzt kannst du random aus AvailableSpawns ausziehen und wenn es bei 0 ankommt (also keine Spawns mehr) füllst du die liste wieder mit den Spawnpunkten. Somit kann es NIEMALS zu Fehlern kommen. Manche machen das ja gerne mit while Schleifen, was ich nicht empfehle, weil da das Programm bei Fehler hängen bleibt (spreche aus Erfahrung xD).

Falls du auch oder nur überprüfen willst, ob ein Spieler auf ein Spawn noch ist und gar nicht weg ist, kann man das mit Boxcollider + ein Script halt überprüfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb MaZy:

Also wie @Sascha das schon ungefähr erwähnt hat, wenn du "perfektes" Spawnsystem benutzen willst, wo man nicht auf der selben stelle spawnst kannst du folgendes tun:

Eine Liste mit Spawnpunkte, Eine Liste, wo du die Liste reinkopierst z.b. AvailableSpawns. Sagen wir mal es gibt A, B, C, D  Spawnpunkte.

Jetzt kannst du random aus AvailableSpawns ausziehen und wenn es bei 0 ankommt (also keine Spawns mehr) füllst du die liste wieder mit den Spawnpunkten. Somit kann es NIEMALS zu Fehlern kommen. Manche machen das ja gerne mit while Schleifen, was ich nicht empfehle, weil da das Programm bei Fehler hängen bleibt (spreche aus Erfahrung xD).

Falls du auch oder nur überprüfen willst, ob ein Spieler auf ein Spawn noch ist und gar nicht weg ist, kann man das mit Boxcollider + ein Script halt überprüfen.

Hallo,

danke für deine Erklärung ich verstehe  nur nicht wie man in eine Liste eine Liste reinkopiert.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso kopieren?

var list = new List<int>(new int[]{10,20,30,40,50,60});

while (list.Count > 0)
{
  var rollIndex = Random.Range(0, list.Count); // Suche dir zufällig ein Element der Liste aus
  Debug.Log($"Rolled a {list[rollIndex]}."); // Zeige es an (sonst mach was anderes damit)
  list.RemoveAt(rollIndex); // Entferne das Ding aus der Liste, damit es nicht nochmal drankommt
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Sascha:

Wieso kopieren?


var list = new List<int>(new int[]{10,20,30,40,50,60});

while (list.Count > 0)
{
  var rollIndex = Random.Range(0, list.Count); // Suche dir zufällig ein Element der Liste aus
  Debug.Log($"Rolled a {list[rollIndex]}."); // Zeige es an (sonst mach was anderes damit)
  list.RemoveAt(rollIndex); // Entferne das Ding aus der Liste, damit es nicht nochmal drankommt
}

 

Da kommt die ganze Zeit dieser Fehler: Cannot implicitly convert type 'System.Collections.Generic.List<int>' to 'int'

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Sascha:

Wieso kopieren?



var list = new List<int>(new int[]{10,20,30,40,50,60});

while (list.Count > 0)
{
  var rollIndex = Random.Range(0, list.Count); // Suche dir zufällig ein Element der Liste aus
  Debug.Log($"Rolled a {list[rollIndex]}."); // Zeige es an (sonst mach was anderes damit)
  list.RemoveAt(rollIndex); // Entferne das Ding aus der Liste, damit es nicht nochmal drankommt
}

 

Mein Fehler, hab an Spielerspawns wie beim Multiplayer gedacht :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Sascha:

Den kannte ich noch nicht. Sollte aber beides funktionieren.

@Adrian H Bei einer Fehlermeldung steht immer die Zeile dran, in der sie auftritt. Schau dir mal diese Zeile genauer an.

Ich habe es jetzt so probiert:

 void Spawn()
    {
        var list = new List<int>{1,2,3,4,5,6,7,8,9,10};
        
        int rollIndex = 0;
       
        while (list.Count > 0)
        {
            rollIndex = UnityEngine.Random.Range(0, list.Count);
            Debug.Log($"Rolled a {list[rollIndex]}.");
            list.RemoveAt(rollIndex); 

        }
        Vector3 spawnpointsv = spawnpoints[list[rollIndex]].GetComponent<Transform>().position;
       
        PhotonNetwork.Instantiate("PlayerPanal",spawnpointsv , quaternion.identity, 0 );
    }

es ist jetzt zwar kein Fehler mehr im Script aber beim starten taucht dieser Fehler auf:  Index was out of range. Must be non-negative and less than the size of the collection.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst dir angewöhnen, Code zu lesen und dabei auch zu verstehen, was jeder Teil tut. Bitte nicht einfach Code kopieren, irgendwelche Dinge einfügen und dann glauben, dass das wie durch ein Wunder funktioniert.

Ich habe drangeschrieben, was in jeder Zeile passiert, und eine Zusammenfassung hast du auch. Sie lautet: "Es werden so lange Elemente aus der Liste genommen, bis sie leer ist." Meine while-Schleife macht also die Liste leer. Und danach, wenn die Schleife schon durch ist, willst du irgendetwas spawnen und greifst dabei auf die Liste zu. Einmalig. Wozu also die ganze Liste, wenn du einmal etwas spawnen willst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Sascha:

Du musst dir angewöhnen, Code zu lesen und dabei auch zu verstehen, was jeder Teil tut. Bitte nicht einfach Code kopieren, irgendwelche Dinge einfügen und dann glauben, dass das wie durch ein Wunder funktioniert.

Ich habe drangeschrieben, was in jeder Zeile passiert, und eine Zusammenfassung hast du auch. Sie lautet: "Es werden so lange Elemente aus der Liste genommen, bis sie leer ist." Meine while-Schleife macht also die Liste leer. Und danach, wenn die Schleife schon durch ist, willst du irgendetwas spawnen und greifst dabei auf die Liste zu. Einmalig. Wozu also die ganze Liste, wenn du einmal etwas spawnen willst?

Den Code ansich verstehe ich ja ich verstehe aber nicht warum man solange würfeln muss bis es 0 wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Minuten schrieb Adrian H:

Den Code ansich verstehe ich ja

Glaube ich irgendwie nicht, ansonsten würdest du nicht nach meiner Schleife auf ein Element in der leere Liste zugreifen.

spawnpoints[list[rollIndex]]

Daher kommt nämlich der Fehler.

vor 7 Minuten schrieb Adrian H:

ich verstehe aber nicht wolarumr man solange würfeln muss bis es 0 wird.

Deine anfängliche Frage war, wie du aus einer Menge an Ergebnissen zufällig wählen kannst, aber jedes Ergebnis nur einmal gewählt werden kann. Genau das wird hier implementiert. Du hast alle möglichen Ergebnisse in einer Liste (wobei das in meinem Beispiel Zahlen sind, und es in deinem eher Referenzen auf Spawnpunkte sein sollten). Du würfelst ein zufälliges Element der Liste, benutzt es (das passiert in deinem Code nicht, du hast stattdessen das Debug.Log drin gelassen) und entfernst es danach aus der Liste, damit es beim nächsten Würfeln nicht noch einmal gezogen werden kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb Sascha:

Glaube ich irgendwie nicht, ansonsten würdest du nicht nach meiner Schleife auf ein Element in der leere Liste zugreifen.


spawnpoints[list[rollIndex]]

Daher kommt nämlich der Fehler.

Deine anfängliche Frage war, wie du aus einer Menge an Ergebnissen zufällig wählen kannst, aber jedes Ergebnis nur einmal gewählt werden kann. Genau das wird hier implementiert. Du hast alle möglichen Ergebnisse in einer Liste (wobei das in meinem Beispiel Zahlen sind, und es in deinem eher Referenzen auf Spawnpunkte sein sollten). Du würfelst ein zufälliges Element der Liste, benutzt es (das passiert in deinem Code nicht, du hast stattdessen das Debug.Log drin gelassen) und entfernst es danach aus der Liste, damit es beim nächsten Würfeln nicht noch einmal gezogen werden kann.

Würden dann nicht mehrere Objekte gespawnt werden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Du musst dich zuerst! damit beschäftigen, was du genau willst. Dann versuchst du im Internet zu suchen und nachdem du ein paar Versuche gemacht hast, kommst du hierher und zeigst uns, was du willst, was du probiert hast und was dabei nicht so lief, wie du dir vorgestellt hast. 

Eine andere Reihenfolge ist extrem verlockend, weil man sich Mühe spart, aber das stimmt nur kurzfristig. Natürlich werden die meisten an ihre Grenzen kommen und dann fragen, aber eben erst nachdem sie die anderen Schritte gemacht haben. Dabei kann man sehr viel lernen und profitiert mittel- bis langfristig davon. 

Du wolltest unterschiedliche Spawnpoints und hier wurden dir Möglichkeiten gezeigt, wie du das erreichen kannst. Nun findest du es blöd, wenn mehrere Objekte auftauchen. Das ist aber gar nicht das, was uns mitgeteilt hast. Das ist anstrengend....für dich, aber auch für uns. Hilf uns und dir und denke an die Reihenfolge!

 

Christoph 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...