Adrian H Geschrieben 4. April 2021 Melden Share Geschrieben 4. April 2021 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 More sharing options...
chrische5 Geschrieben 4. April 2021 Melden Share Geschrieben 4. April 2021 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 More sharing options...
Sascha Geschrieben 4. April 2021 Melden Share Geschrieben 4. April 2021 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 More sharing options...
Adrian H Geschrieben 5. April 2021 Autor Melden Share Geschrieben 5. April 2021 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 More sharing options...
chrische5 Geschrieben 5. April 2021 Melden Share Geschrieben 5. April 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 5. April 2021 Melden Share Geschrieben 5. April 2021 Moin, lösch mal in der if Abfrage das "int" vor randomNumbr. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 Hallo Sorry, habe ich total übersehen. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 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 More sharing options...
Adrian H Geschrieben 6. April 2021 Autor Melden Share Geschrieben 6. April 2021 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 More sharing options...
Sascha Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 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 More sharing options...
Adrian H Geschrieben 6. April 2021 Autor Melden Share Geschrieben 6. April 2021 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 More sharing options...
MaZy Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 Hallo Mach es einfach so: var list = new List<int>{10,20,30,40,50,60}; christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 6. April 2021 Melden Share Geschrieben 6. April 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Adrian H Geschrieben 6. April 2021 Autor Melden Share Geschrieben 6. April 2021 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 More sharing options...
Sascha Geschrieben 7. April 2021 Melden Share Geschrieben 7. April 2021 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 More sharing options...
Adrian H Geschrieben 7. April 2021 Autor Melden Share Geschrieben 7. April 2021 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 More sharing options...
Sascha Geschrieben 7. April 2021 Melden Share Geschrieben 7. April 2021 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 More sharing options...
Adrian H Geschrieben 7. April 2021 Autor Melden Share Geschrieben 7. April 2021 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 More sharing options...
Sascha Geschrieben 7. April 2021 Melden Share Geschrieben 7. April 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 7. April 2021 Melden Share Geschrieben 7. April 2021 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 More sharing options...
MaZy Geschrieben 7. April 2021 Melden Share Geschrieben 7. April 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.