Jump to content
Unity Insider Forum
Kojote

Spawning Trigger

Recommended Posts

Grüße!

So mein Spawner-Script nimmt langsam gestalt an, derzeit plane ich nun die Überarbeitung des Spawnens an sich und habe bisher zwei Überlegungen:

1. Update Methode:

Die gesamte Zeit über kontrolliert eine Update Methode die Anzahl der Tiere, sollte die Anzahl sinken, wird eine Coroutine gestartet und ein Tier nachgespant. Es wird ein eine Zeit lang gewartet und das nächste gespawnt. So lange, bis wieder die maximale Anzahl erreicht ist, danach wird die Coroutine deaktiviert und gewartet. Ist denke ich am einfachsten, jedoch bin ich kein Freund von dauerhaft aktiven Update-Methoden, vor allem wenn es mehrere Spawn-Controller-Script sind, sagen wir 8, haben wir auch 8 Update-Methoden die dauerhaft arbeiten.

2. Trigger-Methode:

Die Idee hier ist On-Trigger-Enter und On-Trigger-Exit. Sobald der Spieler einen großen Trigger-Bereich betritt, wird auch hier getestet, ob genug Tiere da sind und dann das selbe wie in der ersten Version gemacht. Es wird eine Coroutine gestartet und gespawnt. Nachteil wäre hier, wenn die maximale Anzahl gespawnt wurde, würde auch hier die Coroutine beendet. Nun würde so lange nichts spawnen, bis der Spieler erneut den Collider betritt.

Was meint ihr, was wäre die bessere Möglichkeit oder hab ich noch ne Möglichkeit übersehen?

Grüße von Kojote

Share this post


Link to post
Share on other sites

Wenn du ein Event hast, das eine Reaktion auslöst, dann solltest du immer an dieses Event anknüpfen, anstatt immer wieder (z.B. in Update) zu überprüfen, ob es stattgefunden hat. Statt also jeden Frame zu schauen, ob etwas im Trigger ist, benutzt du ja OnTriggerEnter. Das gleiche geht halt auch bei Veränderungen in der Anzahl der Tiere. Wenn ein Tier despawned, dann lässt du es in irgendeiner Weise Meldung machen, und die Spawner reagieren darauf, indem sie Ersatz erstellen.

Um diese Eventstruktur zu bauen, gibt's mehrere Wege. Du kannst bei den Tieren eine Referenz auf die Spawner hinterlegen, damit sie da direkt Bescheid sagen können. Ansonsten gibt's das Pseudo-Singleton, wie ich es nenne, oder etwas eleganteres... freche Werbung!

Share this post


Link to post
Share on other sites

Also ich weiß nicht an welcher Art von Spiel du genau arbeitest.
Aber sollen immer welche nachspawnen oder soll es auch "Lebendig" sein?

Ich habe z.B. in meinem Projekt alles mit in die KI der Tiere eingebaut.
Wenn Mänchen und weibchen aufeinander treffen und die maximale Tieranzahl noch nicht erreicht, wird das weibchen trächtig und nach einiger Zeit spawnt in ihrer Nahe ein kleines Tier welches wieder für eine gewisse Zeit bei der Mutter bleibt (Je nach Tierart).
das wird dann auch irgentwann Groß und so weiter.

Bei mir ist es also möglich eine ganze Art auszurotten. Man muss bei mir aufpassen wieviel Tiere und welche man jagt.

Aber ich kenne dein Spielkonzept nicht.

Share this post


Link to post
Share on other sites

Die Idee mit dem Ausrotten finde ich gut, für mein Konzept eher nicht.

Ich habs jetzt auf Basis der Update-Methode gemacht, dass aller ein paar Zeiteinheiten gespawnt wird.

Denke fast das es realitischer ist, wenn man doch mit Triggern arbeitet, wenn der Spieler den Bereich verlässt, wird neu gespawnt. Was meint ihr? Und dann alle auf einmal wieder Spawnen oder nach und nach?

Share this post


Link to post
Share on other sites

Kommt halt drauf an, worum es in deinem Spiel geht. Bei Zelda-Spielen respawnen auch alle Gegner, wenn du die Map wechselst. Bei MMORPGs eher nicht, weil Gegner töten XP gibt und nicht einfach nur für's Durchkommen wichtig ist. Wenn die Rumlaufenden Tiere eher nur zur Deko sind oder höchstens als kleines Hindernis, während der Spieler etwas ganz anderes tun soll, dann wird's auch niemanden jucken, wenn das Spawnen simpel gehalten ist und sich nicht an der Uhr orientiert.

Share this post


Link to post
Share on other sites

Bei mir sind die Tiere für die Nahrungsversorgung zuständig.

Du bist ein Raubtier in meinem Spiel. Du bekommst Aufgaben die die lösen musst - klar irgendwie.^^ Bei vielen Spielen ist das ja genau so, hier findet man dann eben in der Gegend Munition und Lebenspunkte Kits. Wenn du bei mir überleben willst, musst du mit deinem Tier auf die Jagd gehen, um dein Überleben zu sichern. Also ist nachspawnen der Tiere eine Grundvorraussetzung, also alles ausrotten wäre bei mir im Spiel das Game Over, geht also nicht.

Nun überlege ich halt wie ich spawne, der Spieler soll schon merken, wenn ich mal richig gewildert habe, ist halt auch erst mal das Gebiet "gesäubert". Frage ist halt nun, soll das Gebiet nun erst einmal eine weile frei sein oder soll immer mal wieder was erscheinen.

Share this post


Link to post
Share on other sites

Ohne auf das Technische einzugehen:
Kannst du nicht einfach ersteinmal ein paar kleine Tiere erstellen? Wenn ein Gebiet komplett leer ist muss der Spieler ja irgendwo hin ausweichen. Damit dieser Weg nicht zu langweilig wird, würde ich ihm schon ab uns zu eine Kleinigkeit "zum Fraß vorwerfen".

Share this post


Link to post
Share on other sites

Ja wäre ne Idee, wäre aber scripttechnisch wieder sehr aufwendig, da ich ja schon Wahrscheinlichkeiten eingestellt habe, was wie oft spawnen soll. Sie werden einmal geladen und landen im Pool, dort müsste ich nun wieder wühlen, um Kleinzeug zu finden, würde alles recht aufwendig machen.

Ich grübel da schon das gesamte WE drüber, wollte heute Scripten und bin kein Schritt weiter. Im Gebiet habe ich ja nicht nur ein Spwangebiet, sondern mehrere Verteilt. Ist also ein Gebiet "leer", kann der Spieler ja wo anders hingehen.

Trotzdem bleibt die Frage, wann trigger ich, dass wieder neu gespawnt wird. Nach einer gewissen Zeit oder mit TrigerEnter bzw. TriggerExit. Tiere spawnen zu lassen, während der Spieler gerade in der Nähe ist, ist auch wieder unpraktisch, aller: "Wo kommen die auf einmal her, gerade waren sie doch noch nicht da?!"

EDIT:

Mir ging jetzt folgendes durch den Kopf. Trigger hin, Update her! Im Grunde ist es Jacke wie Hose, ob ich nun die Update-Version nehme oder die Trigger Version, mir gehts einzig um die Performance. Aber wahrscheinlich mach ich mir damit wieder mal mehr Kopfschmerzen als nötig.

Ich hatte nun folgende Ideen:

1. Version: Ein Trigger-Exit ruft nun eine Coroutine auf, diese macht nun das selbe, was die Update-Methode gemacht hat:

            if (!isSpawning && pool.Count > 0) {
                isSpawning = true;
                if (!useSpawnArea) {
                    StartCoroutine("SpawnObjectAtSpawnpointCoroutine");
                } else {
                    StartCoroutine("SpawnObjectAtSpawnAreaCoroutine");
                }
            }

Das ganze müsste man in eine Schleife packen. Die Spawn-Coroutinen werden aufgerufen und hier könnte man auch noch mal einen Timer setzen, aller wie viel Sekunden was neu gespawnt wird. Bin aber kein Schleifenfreund, kommt was unvorhergesehenes, was Spieler gern machen, friert das Spiel ein.

2. Version: Meiner Meinung nach die bessere Version. Timer mit in die Update-Methode, dazu noch bei den Spawnern ein Abstandssensor zum Spieler. Wenn er weit genug weg ist, wird gespawnt. Dann könnte ich mir das Trigger-Exit sparen.

        private void Update() {
            if (!spawnTimeSet) {
                spawningTimer = Time.time + Random.Range(spawnTimeBeginMin, spawnTimeBeginMax);
                spawnTimeSet = true;
            }

            if (!isSpawning && pool.Count > 0 && (Time.time >= spawningTimer)) {
                Debug.Log(Time.time + " " + spawningTimer);
                isSpawning = true;
                if (!useSpawnArea) {
                    StartCoroutine("SpawnObjectAtSpawnpointCoroutine");
                } else {
                    StartCoroutine("SpawnObjectAtSpawnAreaCoroutine");
                }
            }
        }

 

Share this post


Link to post
Share on other sites

Ich würde pro Gebiet ein GameObject (Spawner) erstellen und alle Npcs unterordnen (als childs). Dann immer bei Mitternacht (falls du Tag/Nacht Zyklus hast) der Spawnvorgang starten. Du kannst einfach im Spawner mit transform.childCount die aktuell vorhandenen Tiere zählen.

 

//alle 300 sekunden spawnen
float spawnTimer = 300;

void Update()
{
	if(spawnTimer > 0)
	{
		spawnTimer -= Time.deltaTime;
		if(spawnTimer <= 0)
        {
        	Spawn();
            spawnTimer = 300;
        }
	}
}
 
int desiredAnimalCount = 20;

void Spawn()
{
  	int left = desiredAnimalCount-transform.childCount;
  	for(int i=0;i<left;i++)
    {
      	//Instantiate
    }
}

Du könntest auch anstatt tote Tiere zu Destroy'en, sie nur deaktivieren. Und wenn der Spawnvorgang läuft, suchst du für die deaktivierten Tiere ein neuer Spawnpoint und belebst sie wieder.

  • Thanks 1

Share this post


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...