Objektpooling im Gamekit

Das Game Kit verwendet für einige seiner Systeme ein erweiterbares Objektpooling-System. Die folgende Erklärung ist nur für diejenigen relevant, die das System für den eigenen Gebrauch erweitern möchten und ist keine Voraussetzung für die Arbeit mit dem Game Kit.

Um das Objektpool-System zu erweitern, müssen Sie zwei Klassen anlegen - eine, die von ObjectPool erbt und die andere von PoolObject. Die Klasse, die von ObjectPool erbt, ist der Pool selbst, während die Klasse, die von PoolObject erbt, ein Wrapper für jedes Prefab im Pool ist. Die beiden Klassen sind durch generische Typen miteinander verbunden. ObjectPool und PoolObject müssen die gleichen beiden generischen Typen haben: die Klasse, die von ObjectPool erbt und die Klasse, die von PoolObject erbt, in dieser Reihenfolge. Dies lässt sich am einfachsten an einem Beispiel veranschaulichen:

public class SpaceshipPool: ObjectPool

{

…

}

public class Spaceship: PoolObject

{

…

}

Auf diese Weise weiß der Pool, welche Art von Objekten er enthält und die Objekte wissen, zu welchem Pooltyp sie gehören. Diese Klassen können optional einen dritten generischen Typ haben. Dies ist nur erforderlich, wenn Sie einen Parameter für die WakeUp-Funktion des Poolobjekts haben möchten, der aufgerufen wird, wenn das Poolobjekt aus dem Pool entnommen wird. Wenn unsere Raumschiffe zum Beispiel geweckt werden, müssen sie vielleicht wissen, wie viel Treibstoff sie haben, und könnten daher einen zusätzlichen Float-Typ wie folgt haben:

public class SpaceshipPool: ObjectPool

{

…

}

public class Spaceship: PoolObject

{

…

}

Standardmäßig hat ein Poolobjekt die folgenden Felder:

  • inPool: Dieser Bool bestimmt, ob sich das Poolobjekt gerade im Pool befindet oder wach ist.
  • Instanz: Dieses Spielobjekt ist das instanziierte Prefab, das dieses Poolobjekt umgibt.
  • objectPool: Dies ist der Objektpool, zu dem dieses Poolobjekt gehört. Er hat den gleichen Typ wie der ObjectPool-Typ dieser Klasse.

Ein Poolobjekt hat auch die folgenden virtuellen Funktionen:

  • SetReferences: Dieser wird einmalig beim ersten Anlegen des Poolobjekts aufgerufen. Sein Zweck ist es, Referenzen zwischenzuspeichern, so dass sie nicht gesammelt werden müssen, wenn das Poolobjekt geweckt wird, obwohl es für jedes andere einmalige Setup verwendet werden kann.
  • Aufwachen (WakeUp): Dies wird aufgerufen, wenn das Poolobjekt geweckt und aus dem Pool gesammelt wird. Sein Zweck ist es, bei jeder Verwendung des Poolobjekts alle erforderlichen Einstellungen vorzunehmen. Wenn die Klassen einen dritten generischen Parameter erhalten, kann WakeUp mit einem Parameter dieses Typs aufgerufen werden.
  • Schlafen (Sleep): Dies wird immer dann aufgerufen, wenn das Poolobjekt an den Pool zurückgegeben wird. Sie dient dazu, alle Aufräumarbeiten durchzuführen, die nach der Verwendung des Poolobjekts erforderlich sind.
  • ReturnToPool: Standardmäßig gibt dies einfach das Poolobjekt an den Pool zurück, kann aber überschrieben werden, wenn zusätzliche Funktionalität benötigt wird.

Ein ObjectPool ist ein MonoBehaviour und kann daher zu Spielobjekten hinzugefügt werden. Standardmäßig hat es die folgenden Felder:

  • Prefab: Dies ist eine Referenz auf die Prefab, die mehrfach instanziiert wird, um den Pool zu erstellen.
  • InitialPoolCount: Die Anzahl der Poolobjekte, die in der Startmethode angelegt werden.
  • Pool: Eine Liste der Poolobjekte.

Ein ObjectPool hat auch die folgenden Funktionen:

  • Start: Hier findet die erste Poolbildung statt. Sie sollten beachten, dass, wenn Sie eine Startfunktion in Ihrem ObjectPool haben, diese die Basisklassenversion effektiv ausblendet.
  • CreateNewPoolObject: Dies wird aufgerufen, wenn Poolobjekte erstellt werden und ruft deren SetReferences und dann Sleep-Funktionen auf. Es ist nicht virtuell, also kann es nicht überschrieben werden, aber es ist geschützt und kann daher in Ihrer erbenden Klasse aufgerufen werden, wenn Sie möchten.
  • Pop: Dies wird aufgerufen, um ein Poolobjekt aus dem Pool zu erhalten. Standardmäßig wird nach dem ersten gesucht, bei dem das inPool-Flag auf true gesetzt ist, und dieser zurückgegeben. Wenn keine wahr sind, erstellt es eine neue und gibt diese zurück. Es ruft WakeUp auf, egal welches Poolobjekt zurückgegeben werden soll. Dies ist virtuell und kann überschrieben werden.
  • Push: Dies wird aufgerufen, um ein Poolobjekt wieder in den Pool zu stellen. Standardmäßig setzt es nur das inPool-Flag und ruft Sleep auf dem Poolobjekt auf, ist aber virtuell und kann überschrieben werden.

Ein vollständiges Beispiel für die Verwendung des Objektpool-Systems finden Sie in der BulletPool-Dokumentation und den Skripten.

BulletPool

Der BulletPool MonoBehaviour ist ein Pool von BulletObjects, von denen jedes eine Instanz eines Bullet Prefab umhüllt. Der BulletPool wird sowohl für Ellen als auch für Feinde verwendet, wird aber für jeden etwas anders verwendet. Für Ellen gibt es ein BulletPool MonoBehaviour, das an das übergeordnete Spielobjekt mit dem Bullet Prefab als Prefab-Feld angehängt ist. Die andere Verwendung von BulletPool ist in der Klasse EnemyBehaviour. Es verwendet die statische Funktion GetObjectPool, um BulletPools zu verwenden, ohne sie aktiv erstellen zu müssen.

Die Klasse BulletPool hat die folgenden Felder:

  • Prefab: Dies ist die Bullet Prefab, die Sie verwenden möchten.
  • Initial Pool Count: So viele Bullets werden zunächst im Pool erstellt. Es sollte so viele sein, wie Sie erwarten, dass sie auf einmal verwendet werden. Wenn mehr benötigt wird, werden sie zur Laufzeit erstellt.
  • Pool: Dies sind die BulletObjekte im Pool. Dies wird im Inspektor nicht angezeigt.

Die Klasse BulletPool hat folgende Funktionen:

  • Pop: Verwenden Sie dies, um eines der BulletObjekte aus dem Pool zu erhalten.
  • Push: Benutzen Sie dies, um ein BulletObjekt wieder in den Pool zu stellen.
  • GetObjectPool: Dies ist eine statische Funktion, die einen geeigneten BulletPool für eine bestimmte Vorfertigung findet.

Wenn man ein Bullet aus dem Pool bekommt, kommt sie in Form eines BulletObjekts. Die Klasse BulletObject hat die folgenden Felder:

  • InPool: Ob sich dieses bestimmte Bullet im Pool befindet oder verwendet wird oder nicht.
  • Instanz: Das instanziierte Prefab.
  • ObjectPool: Eine Referenz auf den BulletPool, zu dem dieses BulletObjekt gehört.
  • Transform: Eine Referenz auf die Transform-Komponente der Instanz.
  • Rigidbody2D: Eine Referenz auf die Rigidbody2D-Komponente der Instanz.
  • SpriteRenderer: Eine Referenz auf die SpriteRenderer-Komponente der Instanz.
  • Bullet: Eine Referenz auf das Bullet-Skript der Instanz.

Das BulletObjekt hat die folgenden Funktionen:

  • Aufwachen (WakeUp): Dieser wird vom BulletPool aufgerufen, wenn seine Pop-Funktion aufgerufen wird.
  • Schlafen (Sleep): Dieser wird vom BulletPool beim Aufruf seiner Push-Funktion aufgerufen.
  • ReturnToPool: Dies sollte aufgerufen werden, wenn Sie mit einem bestimmten Bullet fertig sind. Er ruft die Push-Funktion seines BulletPools und damit seine Sleep-Funktion auf.

Spielplatz

Erste Schritte
  1. Einführung in das Game Kit
  2. Erstellen einer neuen Szene
  3. Levelerstellung
  4. Testen eines Levels
  5. Hinzufügen einer beweglichen Plattform
  6. Öffnen einer Tür durch ein Ereignis
  7. Feinde
  8. Beschädigung durch Objekte
  9. Dekorieren
  10. Teleportieren des Spielers
  11. Spaß haben
Erste Schritte mit dem 2D-Spielkit
  1. Überblick und Ziele
  2. Ellen und das Setzen von Gefahren
  3. Hinzufügen von beweglichen Plattformen
  4. Türen und zerstörbare Objekte
  5. Feinde hinzufügen und ausmerzen
  6. Steuerung von Plattformen mit Schaltern
  7. Verwendung des Inventarsystems
  8. Teleporting und Dialogfelder
Referenzhandbuch für das Spiel-Kit
  1. Wie man dieses Dokument verwendet
  2. Ellen
  3. Feindliches Verhalten
  4. Gesundheitsförderung
  5. Drucksensor
  6. Schadenssystem
  7. Bewegliche Plattform
  8. Interaktionssystem
  9. Inventarsystem
  10. HubDoor
  11. Feindauftauchen
Erweiterte Game Kit Themen
  1. Fortgeschrittene Themen
  2. Zufalls-Audio-Player
  3. VFXController
  4. Datenbestandsdauer
  5. SceneLinkedSMB
  6. Objektpooling im Gamekit
  7. Verhaltensbaum