Jump to content
Unity Insider Forum

Wir bauen uns ein Space Shoot em Up [Teil 16 - Mehr Gegner]


Mark

Recommended Posts

Jetzt kommen wir zu sehr entspannten Aufgaben, wir basteln uns neue Gegner Typen. Bisher haben wir nur eine Gegnerart, nennen wir ihn einfach "Jäger". Dieser Jäger fliegt auf uns zu und feuert mit seinen Waffen, einfache Projektile, er zeigt dabei keinerlei besonderes Verhalten bis auf das Standard Flucht Verhalten.

 

Durch die modulare Aufbauart von Unity und den verschiedenen Komponenten die wir uns bisher geschaffen haben können wir aber viel mehr als das abbilden.

 

Wir fangen damit an dass wir uns 2 einfache Gegner basteln die noch simpler sind als der Jäger, nämlich Asteroiden.

 

Der erste Asteroid wird einfach nur durch die Gegend fliegen und sich minimal steuern, er wird sich steuern damit er sich nicht zu weit vom Spieler entfernt.

 

Erzeugt also ein neues GameObjekt (eine Kugel reicht zB aus) und weist ihm die typischen Komponenten zu (Rigidbody, Drive, AIController, Destructable) und zusätzlich eine Projektil Komponente (der Asteroid soll den Spieler beim Aufprall schwer beschädigen oder gar zerstören können).

 

Stellt folgendes ein:

 

GameObjekt:

Tag: Team B

Layer: Neuer Layer der nur mit TeamA und Projektile TeamA kollidiert.

 

Transform:

Scale: 2 2 2

 

Rigidbody:

Mass: 1

Drag: 1

Angular Drag: 10

Use Gravity: Nein

Freeze Position: Y

Freeze Rotation: X Z

 

Projectile:

Damage: 100

Lifetime: eine riesige Zahl (oder ändert das Projectile Script damit es bei dem Wert 0 sich nicht selbst zerstört)

 

Drive:

Rotation Acceleration: 100

Max Force: 400

 

Loot Table: Füllt sie nach belieben.

 

Erstellt daraus ein Prefab und verwendet diese für die erste Welle an Gegnern. Wenn ihr wollt könnt ihr euch ein Script schreiben was bei Zerstörung eines Asteroiden mehrere kleinere erzeugt.

 

Eines aber muss noch zusätzlich gemacht werden, da der Asteroid ein Projektil ist wird er bei nur einem Schuss von unserer Waffe zerstört werden, da das Projektil Script dies bei einer Kollision automatisch erledigt. Öffnet daher das Projectile Script und ändert die Zeile in OnCollisionEnter die so aussieht:

 

DestroyObject(gameObject);

 

in folgendes um:

 

destructable = gameObject.GetComponent<Destructable>();
if (destructable)
{
   destructable.ApplyDamage(SelfDamage, Owner);
}
else
{
   DestroyObject(gameObject);
}

 

Damit zerstört sich das Projektil nur dann selbst wenn es selbst kein Destructable ist, ansonsten wird es sich selbst ein wenig schädigen. Fügt daher noch folgende Variable hinzu:

 

public int SelfDamage = 10;

 

Da wir nun mehrere Gegner erzeugen ist es angebracht diese etwas besser zu sortieren. Wir haben bisher alle Objekte in das Hauptverzeichnis gelegt. Es ist durchaus Sinnvoll alles etwas geordneter zu haben. zB können alle Scripte in ein Scripts Verzeichnis, alle Gegner in ein Gegner Verzeichnis und so weiter gelegt werden.

 

Auch macht es Sinn Prefabs als Grundlage wieder zu verwenden damit ihr nicht immer wieder alle Komponenten von neuem erzeugen müsst. Denn schnell kann es passieren das mal vergessen wird etwas wichtiges zu setzen (zB Use Gravity bem Rigidbody zu deaktivieren).

 

Machen wir weiter mit einem 2ten Asteroiden, dieser Asteroid soll zeigen was mit leichten Änderungen alles erreicht werden kann. Klont dazu euer Asteroid Prefab und nennt es "Chaos Asteroid".

 

Dieser Asteroid hat eine Besonderheit, er soll sich um einen bestimmten Punkt drehen können um damit für den Spieler etwas unberechenbarer zu werden.

 

Löscht als erstes den Sphere Collider, Mesh Filter und den Mesh Renderer. Wir werden unseren Asteroiden mit einem anderen GameObjekt rendern. Erzeugt nun ein neues leeres GameObjekt mit dem Namen "Rotator" und schiebt es in das GameObjekt des Chaos Asteoriden, positioniert es genau wie den Chaos Asteroiden auf 0 0 0.

Dann erzeugt ein weiteres GameObject (Sphere mit Scale: 2 2 2) und schiebt dieses in das "Rotator" GameObject, anschließend schiebt ihr diese Sphere auf 0 0 3.

 

Wenn wir nun den Rotator drehen dann dreht sich die Sphere um dieses GameObject. Dieses Verhalten können wir per Script lösen. Erstellt daher folgendes Rotator C# Script:

 

using UnityEngine;
using System.Collections;

public class Rotator : MonoBehaviour {

   public float Speed = 360;

   void Update()
   {
       transform.eulerAngles += Time.deltaTime * Speed * Vector3.up;
   }
}

 

Das Script lässt ein GameObject einfach um die Y Achse drehen mit der angegebenen Geschwindigkeit in Grad pro Sekunde.

 

Legt anschließend das Rotator Script auf das Rotator GameObject und wandelt den Chaos Asteroiden in ein Prefab um.

 

Nun erzeugen wir uns ein Geschütz welches sich stumpf im Kreis dreht und sich ansonsten nicht bewegt. Ab und zu feuert es einen einzelnen Schuss. Erzeugt dazu wieder ein GameObject mit den typischen Einstellungen (Klont den Jäger). Zusätzlich benötigt dieses "Geschütz MK1" ein Weapon Controller und Projectile Weapon Komponente, wenn dies noch nicht vorhanden sein sollte (der Jäger besitzt beides). Das Drive Script kann entfernt werden, da sich das Geschütz nicht selbstständig bewegen soll. Da es sich aber leicht drehen soll, geben wir dem Geschütz noch das Rotator Script.

 

Ändert nun folgendes:

 

Rotator:

Speed: 10

 

Projectile Weapon:

Reload Time: 5

Ammo Per Magazin: 4

Delay Per Fire: 0.5

Shoots Per Fire: 4

 

AIController:

Fire Threshold: 180

 

Anschließend könnt ihr das Geschütz in ein Prefab umwandeln.

 

Eine Abart dieses simplen Geschützes wäre ein Geschütz welches direkt auf uns zielt. Um dies zu erreichen genügt es wenn wir unser Geschütz klonen die Rotator Komponente wieder entfernen und statt dessen eine Drive Komponente hinzufügen.

 

Ändert dann am "Geschütz MK2":

 

Drive:

Acceleration: 0

Deacceleration: 0

Rotation Acceleration: 100

Strafe Force: 0

Max Force: 0

Min Force: 0

 

Und wandelt auch dieses Objekt wieder in ein Prefab um.

 

Wir erzeugen uns noch einen weiteres Geschütz "Geschütz MK3" diesmal geklont aus dem "Geschütz MK3". Dieses Geschütz soll Zielsuchende Geschosse verfeuern, daher ändert als erstes die Projectile Weapon Komponente an diesem Geschütz etwas ab:

 

Ammo Per Magazin: 1

Shoots Per Fire: 1

 

Klont anschließend das Gegner Projektil und nennt es "Zielsuchendes Geschoss". Gebt ihm anschließend die Drive und AIController Komponenten. Ändert dann folgende Werte:

 

Rigidbody:

Mass: 1

Drag: 1

Angular Drag: 10

Use Gravity: Nein

Freeze Position: Y

Freeze Rotation: X Z

 

Projectile:

Lifetime: 10

Damage: 50

 

AIController:

Flee Time: 0

 

Drive:

Rotation Acceleration: 3

Max Force: 1000

Min Force: 1000

 

Weist dann das Zielsuchende Geschoss als Projektil für das Geschütz MK3 zu.

 

Arbeitet dann die neuen Gegner Arten in den WaveManager ein.

 

Beim testen wird euch eventuell auffallen dass die Strahlenwaffen keinen Schaden an den Asteroiden hervorrufen, dies liegt daran dass die Pulse Komponente nur am getroffenen GameObjekt prüft ob dies ein Destructable hat. Daher korrigieren wir dieses Verhalten um indem wir aus folgender Zeile:

 

var destructable = hit.collider.gameObject.GetComponent<Destructable>();

 

dies hier machen:

 

Destructable destructable = null;
var current = hit.collider.transform;
do
{
   destructable = current.gameObject.GetComponent<Destructable>();
   current = current.parent;
}
while (!destructable && current);

 

Wir suchen ausgehend vom getroffenen Objekt bis zum Parent ohne weiteren Parent nach einem Destructable.

 

Ihr seht es ist relativ einfach neue Gegner und Objekttypen zu erzeugen, wenn man mal von einigen Aufbesserungen der bestehenden Scripte absieht. Versucht zB selbst ein paar Gegnerarten zu erzeugen.

 

Unitypackage:

https://dl.dropboxusercontent.com/u/2446365/ShootEmUpTutorial/Part16.unitypackage

 

Webplayer:

https://dl.dropboxusercontent.com/u/2446365/ShootEmUpTutorial/Part16/Part16.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 months later...

Eins der besten Tutorials, die ich bisher im Unity-Bereich gesehen habe. Vielen Dank dafür.

 

Vor allem gefällt mir der objektorientierte Ansatz, also das Auslagern von Verantwortlichkeiten in eigene Klassen (Scripts). Ich nehme ein beliebiges Objekt, weise dem die Klasse Destructable zu und schon ist es zerstörbar. Es bekommt einen Drive, eine ProjectileWeapon und ich habe einen Gegner. Ich möchte ein Mutterschiff, das Jäger losschickt? Einfach eine Waffe erstellen, die als "Projektil" einen Jäger ausstößt und eine maximale "Munitionsgrenze" hat.

 

Wenn man sich bis hierher durchgekämpft hat, kann man die Früchte der vorhergehenden Arbeit geniessen und manche Dinge werden klar, die vorher ein wenig umständlich oder langwierig ausgesehen haben. Das unterscheidet diesen Text hier auch von den meisten anderen, die einfach einen Aspekt von Unity erklären, ohne über den Tellerrand zu blicken.

 

Ich würde mir noch folgende Themen wünschen:

- Erweiterung um Mehrspielermodus

- Animation von Raumschiffen (unterschiedliche Teile eines Raumschiffs getrennt steuern, also etwa eine Radarschüssel oder Waffen, die sich bewegen usw.)

- Gamestate mit Hauptmenü, Rangliste usw.

 

 

Auch wenn du was anderes vorhast, ich werde die weiteren Teile mit Spannung verfolgen.

 

Alex

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...