Jump to content
Unity Insider Forum

Meinung Spawn System


Kojote

Recommended Posts

Grüße!
 

Ich grübel gerade herum, wie ich mein Spawn System aufbaue. Derzeit arbeite ich an einem Jagdspiel, in dem man als Raubtier, unter anderem auf Nahrungssuche gehen muss.

Gespielt wird im Jungle, Wald oder Savanne. Die Gebiete sind in Täler bzw. Abschnitte unterteilt, sagen wir mal 10 - 20 qkm, Größe bin ich mir aber noch net sicher. So, ich brauche an einigen Stellen Spawner. Ich hab mir jetzt mal im Asset Store einige Ideen geholt und geschaut wie andere das machen. Das Instanzieren gehört ja noch mit zu den einfachen sachen, obwohl ich mir noch nicht ganz darüber im klaren bin wie Zufallsspawns erledigt werden, ohne das der Enemies in einem Felsen oder unter dem Terrain landet.

Nun mal zu meinen Ideen, was haltet ihr von?

1. Da ich ein Jagdspiel mache, finde ich die Idee nur begrenzt gut, Tiere despawnen zu lassen, wenn der Spieler mal etwas weiter weg ist. Wenn ich zurück komme, möchte ich doch als Spieler wieder die Tiere, die ich noch vor 3 min da gesehen haben wieder finden, oder? Ich müsste sie ja auch eigentlich nicht Despawnen lassen, da die Kamera sie ja eh irgendwann nicht mehr berechnet, oder?

2. Idee war, jedem Spawner seine Tiere zuzuordnen, damit er weis, es sind 10 Tiere in meinem Einflussbereich, ich darf nicht mehr produzieren. Möglichkeit wäre hier mit Update-Methode und OnTrigger-Methoden, die müssten aber ziemlich Performance-Lastig sein, oder? Zudem, wenn ich nun einen Collider mache in dem die Tiere sind, wie stelle ich fest, wie viele nun wirklich in dem Collider sind und halte sie auseinander?

3. Ich hatte die Idee auch Prozentuale Parameter zu machen, z.B. 50 % Chance das ein Tier gespawnt wird. 25 % dass min 4 Tiere gespant werden, etc. Wie macht man solche Prozentuale Chancenverteilungen in Unity bzw. C#?

4. Sollten mal mehr Tiere im Einflussbereich sein, wollte ich das Script nach dem Spieler suchen lassen, ob er gerade in Reichweite ist, wenn nicht, ein paar Tiere Despawnen. Man könnte in die Update oder Fixed Update eine Routine schreiben, die dann bestimmt, wie weit er entfernt ist. Wenn der Spieler aber noch in der Nähe, würde nun ständig abgefragt, ob er weg ist, bis jemand Despawnen kann. Würde das nicht auch wieder zu viel Performance fressen.

5. Ich bin für Tipps und Anregungen offen.^^

Grüße von Kojote

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur ein paar Anregungen:

  • Tiere kannst du mMn problemlos despawnen, wenn der Spieler z.B. weiter als x Meter entfernt ist und das vielleicht noch über eine Dauer von x Minuten
  • Für das spawnen von Tieren und prüfen, ob diese schon oder noch da sind bzw. leben, brauchst du keinen Collider. Du packst dir einfach Referenzen in eine Liste oder so und kannst jederzeit abfragen, ob dein Tier schon oder noch lebt. Hierfür bekommt jedes Tier eine Eigenschaft Health. Wenn diese 0 ist, ist das Tier tot.
  • Prozentualen Kram kannst du mit https://docs.unity3d.com/ScriptReference/Random.html machen
  • Das mit der Entfernung messen kann komplexer werden. Aber grundsätzlich kannst du das Distanz messen für Spawner auf verschiedenen Frames ausführen und/oder erst pro Areal (1km² z.B.) prüfen, ob der Spieler darin ist und dann nur darin alle Prüfungen pro Spawner machen oder oder oder, nicht ganz trivial.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Tiere kannst du mMn problemlos despawnen, wenn der Spieler z.B. weiter als x Meter entfernt ist und das vielleicht noch über eine Dauer von x Minuten

Hier müsste ich aber auch wieder abfragen, ob der Spieler außer Reichweite ist. Möglichkeit wäre dem Spawner nen Collider zu verpassen, wenn der Spieler den Collider verlässt, können die Tiere despawnt werden. Problem aber, was ist, wenn der Spieler ein Tier hetzt und beide den Collider-Bereich verlassen. Dann würde aber das Abendessen des Spielers plötzlich verschwinden.^^

Zitat

Für das spawnen von Tieren und prüfen, ob diese schon oder noch da sind bzw. leben, brauchst du keinen Collider. Du packst dir einfach Referenzen in eine Liste oder so und kannst jederzeit abfragen, ob dein Tier schon oder noch lebt. Hierfür bekommt jedes Tier eine Eigenschaft Health. Wenn diese 0 ist, ist das Tier tot.

OK, wäre ne Idee. Wenn ich aber das Spiel speichere, muss ich ja aber auch die Posi Daten der Enemies in der Nähe speichern, dass die nach dem Laden nicht plötzlich verschwunden sind. Die Tiere müssen dann also neu gespawnt werden und die Info muss dann wiederrum dem Spawner mitgeteilt werden, was das alles etwas aufwendig macht.

Zitat

Prozentualen Kram kannst du mit https://docs.unity3d.com/ScriptReference/Random.html machen

OK, gute Idee! :)

Zitat

Das mit der Entfernung messen kann komplexer werden. Aber grundsätzlich kannst du das Distanz messen für Spawner auf verschiedenen Frames ausführen und/oder erst pro Areal (1km² z.B.) prüfen, ob der Spieler darin ist und dann nur darin alle Prüfungen pro Spawner machen oder oder oder, nicht ganz trivial.

Ja, dass ist nicht ganz trivial. Ständige Positions- und Entfernungsberechnungen kosten ne Menge Performance.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Kojote:

Hier müsste ich aber auch wieder abfragen, ob der Spieler außer Reichweite ist. Möglichkeit wäre dem Spawner nen Collider zu verpassen, wenn der Spieler den Collider verlässt, können die Tiere despawnt werden. Problem aber, was ist, wenn der Spieler ein Tier hetzt und beide den Collider-Bereich verlassen. Dann würde aber das Abendessen des Spielers plötzlich verschwinden.^^

Du kannst Areale für Tiere machen, aus denen diese nicht herausdürfen. Beim "hetzen" laufen sie an der Grenze dann eben wieder zurück oder schon vorher in eine andere Richtung. Und dann kannst du die Entfernung vom Spieler zum Areal-Spawner messen oder so.

vor einer Stunde schrieb Kojote:

OK, wäre ne Idee. Wenn ich aber das Spiel speichere, muss ich ja aber auch die Posi Daten der Enemies in der Nähe speichern, dass die nach dem Laden nicht plötzlich verschwunden sind. Die Tiere müssen dann also neu gespawnt werden und die Info muss dann wiederrum dem Spawner mitgeteilt werden, was das alles etwas aufwendig macht.

Wozu ist es denn zwingend nötig, die Tierpositionen zu speichern? Du kannst ja auch einfach sowas wie "Menge an getöteten Tieren" pro Spawner speichern. Ist es für das Gameplay nötig, jedes Tier im Detail persistent zu speichern?

vor einer Stunde schrieb Kojote:

Ja, dass ist nicht ganz trivial. Ständige Positions- und Entfernungsberechnungen kosten ne Menge Performance.

Genau. Und da gibt es viele Ansätze. Aber um eine Art level of detail für die Messung wirst du wahrscheinlich nicht herumkommen. Du kannst aber die Abfragen der Messung in eine Queue packen und diese werden dann jeden Frame abwechselnd abgefragt. Also Update Frame 1 = Tier 1 - Tier 10 misst, Update Frame 2 = Tier 11 - 20 misst. Oder so in der Art.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Du kannst Areale für Tiere machen, aus denen diese nicht herausdürfen. Beim "hetzen" laufen sie an der Grenze dann eben wieder zurück oder schon vorher in eine andere Richtung. Und dann kannst du die Entfernung vom Spieler zum Areal-Spawner messen oder so.

Ja das ist ne gute Idee. So könnte man as machen. :)

Zitat

Wozu ist es denn zwingend nötig, die Tierpositionen zu speichern? Du kannst ja auch einfach sowas wie "Menge an getöteten Tieren" pro Spawner speichern. Ist es für das Gameplay nötig, jedes Tier im Detail persistent zu speichern?

Menge an getöteten Tieren is egal, es geht darum, wenn ich speichere, habe ich eine Herde vor mir, wenn ich wieder das Spiel lade, wollte ich die Herde wieder vor meiner Nase haben. Ich hab mir gerade überlegt, dass, wenn man das Spiel verlässt der tierische Charakter einfach "schlafen" geht, Animation, legt sich hin und gut. In der Zeit kann sich ja das Umfeld verändern und die Tiere wo anders stehen. Wäre dann eine logische Erklärung die ganz passend erscheint.

Zitat

Genau. Und da gibt es viele Ansätze. Aber um eine Art level of detail für die Messung wirst du wahrscheinlich nicht herumkommen. Du kannst aber die Abfragen der Messung in eine Queue packen und diese werden dann jeden Frame abwechselnd abgefragt. Also Update Frame 1 = Tier 1 - Tier 10 misst, Update Frame 2 = Tier 11 - 20 misst. Oder so in der Art.

Ja, denk ich auch. Auf jeden Fall schon mal vielen Dank, dass waren paar gute Denkansätze für mich, wie ich esgestalten kann. Am einfachsten wäre natürlich, wenn der Spawner die Positionsdaten der Tiere hällt und nur der Spawner und der Charakter eine "Kommunikation" haben um Abstände zu berechnen. Das würde viele Abfragen sparen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb Kojote:

Menge an getöteten Tieren is egal, es geht darum, wenn ich speichere, habe ich eine Herde vor mir, wenn ich wieder das Spiel lade, wollte ich die Herde wieder vor meiner Nase haben. Ich hab mir gerade überlegt, dass, wenn man das Spiel verlässt der tierische Charakter einfach "schlafen" geht, Animation, legt sich hin und gut. In der Zeit kann sich ja das Umfeld verändern und die Tiere wo anders stehen. Wäre dann eine logische Erklärung die ganz passend erscheint.

Die Idee finde ich gut. Oder dein Charakter geht in eine Höhle, Schlafplatz oder was auch immer. So wie viele andere Spiele das auch machen. Damit verhinderst du auch ohne viel Denken, dass in deinem Charakter irgendwas dummes spawned. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eben und mit der Idee kann ich auch das Problem des speicherns von Wetterdaten und Uhrzeit umgehen, wenn er schlafen geht kann sich alles verändern. Uhrzeit und Wetter werden dann beim Spielstart per Zufall generiert. Die Idee is denke ich sehr passend und spart an vielen Punkten sehr viel Arbeit. 😀

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...