Jump to content
Unity Insider Forum

Möglichkeiten um gleichen Spawnpoint zu verhindern?


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

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 

  • Thanks 1
Link to post
Share on other sites

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.

  • Thanks 1
Link to post
Share on other sites
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 to post
Share on other sites

Hallo

 

Mutmaßlich hast du randomNumbr innerhalb von Scope() deklariert, obwohl du sie schon außerhalb (also als private klassenvariable) nutzt. das gibt das konflikte. 

 

christoph

Link to post
Share on other sites

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

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 to post
Share on other sites
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 to post
Share on other sites
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 to post
Share on other sites
vor 11 Minuten schrieb chrische5:

Mach es einfach so:

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.

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

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 to post
Share on other sites
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 to post
Share on other sites
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 to post
Share on other sites
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 to post
Share on other sites
Am 4.4.2021 um 15:33 schrieb Adrian H:

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

 

vor 5 Minuten schrieb Adrian H:

Würden dann nicht mehrere Objekte gespawnt werden?

????

Link to post
Share on other sites

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

Wieso willst du eigentlich Panels per PhotonNetwork.Instantiate spawnen? Es hört sich nach UI Sachen an und finde komisch, dass man UI-Prefabs über das Netzwerk erstellen will und nicht beim Client selber.
 

Link to post
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...
×
×
  • Create New...