Jump to content
Unity Insider Forum

Wir bauen uns ein Space Shoot em Up [Teil 10 - Waffenslots]


Mark

Recommended Posts

Bevor wir uns den einsammelbaren Items zuwenden müssen wir noch ein weiteres Detail anpassen um leichter Waffen austauschen zu können und mehr als nur einen Platz für Waffen zu haben.

 

Wir basteln uns heute ein Scrip welches uns hilft mehrere Waffen auf einmal zu kontrollieren. Wir fangen damit an indem wir uns ein C# Script mit dem Namen WeaponController erzeugen. Dieses Script verwenden wir später dazu um mehrere Waffen abzufeuern.

 

Wie das Weapon Scrip selbst benötigen wir die Start und StopFiring Methoden:

 

public void StartFiring()
{

}

public void StopFiring()
{

}

 

Und wir benötigen alle verfügbaren Waffen, wir speichern diese indem wir eine Array Variable erzeugen:

 

private Weapon[] weapons;

 

Die beiden eckigen Klammern geben an dass es sich hier um ein Array handeln soll, eine Ansamlung von vielen Elementen gleichen Typs (Weapon).

 

Wir werden dieses Array mit allen Weapons füllen welche wir in unserem GameObjekt und unter GameObjecten finden können:

 

public void NotifyWeaponChange()
{
weapons = GetComponentsInChildren<Weapon>();
}

 

Wir verwenden diese Methode um beim einsammeln einer neuen Waffe das Array neu zu füllen. Eine Anfangsbefüllung nehmen wir vor indem wir in der Start() Methode die NotifyWeaponChange Methode aufrufen:

 

void Awake()
{
NotifyWeaponChange();
}

 

Wir verwenden also einfach die Methode wieder.

 

Nun wird es Zeit die Start und StopFiring Methoden zu befüllen. Wir fangen mit der StartFiring Methode an und ihr übernehmt den Code angepasst für StopFiring:

 

public void StartFiring()
{
foreach (var weapon in weapons)
{
	weapon.StartFiring();
}
}

 

foreach ist ein keyword welches besagt dass jedes Element in unserem Array der Reihe nach durchgegangen wird. Für jedes Element wird der foreach Scope mit dem aktuellen Element aufgerufen. Wir Starten also bei jeder unserer gefunden Weapon Scripte das Feuern der Waffe.

 

Wir fassen nun sowohl den AIController als auch den PlayerController an und ändern jede Verwendung von Weapon zu WeaponController.

 

Die WeaponController Komponente sollten wir dann auch auf alle GameObjekte legen welche ein Weapon Script haben.

 

So nun fragt ihr euch sicher was das ganze sollte, wir haben dadurch kaum einen Mehrwert gewonnen, bis auf dass wir theoretisch mehr als nur eine Waffe abfeuern können. Der Trick nun ist folgender: Wir können uns nun Unterobjekte erzeugen, zB ein Unter GameObject pro Waffe unseres Raumschiffes, wir können dann dieses Unterobjekt so verschieben dass wir genau spezifizieren können wo die Mündung der Waffe ist. Auch können wir jede Waffe nun ein eigenes Aussehen geben und vieles mehr. Versucht es einmal mit dem Spielerschiff und gebt jedem Unterobjekt die Laser Waffe. Achtet darauf dem Haupt GameObjekt nur das WeaponController Script zu geben und alle Layer der Unterobjekte so zu setzen dass es der gleiche Layer ist wie das Hauptobjekt.

 

Unitypackage:

https://dl.dropboxus...10.unitypackage

 

Webplayer:

https://dl.dropboxus...t10/Part10.html

 

Teil 11:

http://forum.unity-c...-teil-11-items/

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Hey, ich bräuchte mal ein bisschen Hilfe..

Hab mein Script mit den Features erweitert die du hier ansprichst und mal das gemacht mit den leeren GameObjects die ich als Waffen benutze und funktioniert auch super.

Das Problem ist jetz nur, dass jetzt jede Waffe seinen eigenen Munitionsvorrat hat und z.B. 2 Waffensystem jetzt vollkommen autonom sind.

Das möchte ich aber nicht, weil wenn ich später Kugeln einkaufen will, möchte ich nur sagen müssen, dass ich 2000 Kugeln will und dann sollen die 2000 Kugeln in einen globalen Munitionskanister gelegt werden den alle Projektilwaffen benutzen können.

Bei 2 Waffen wäre das ja noch einfach, dass ich dann einfach sage, dass jede Waffe 1000 bekommen soll aber wie sieht's aus wenn ich 3 habe?

 

Ich habe dazu eine Variable "projectileQuantity" die besagt wie viel Kugeln überhaupt an Board sind und von denen alle zehren können. Wenn ich sie jetzt static machen würde, wäre es wie ein allgemeiner Vorrat und jeder würde davon abzweigen aber ich komm hald dann nich mehr an die Variable ran und könnte sie befüllen oder?

 

Hättest du da eine Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

 

du könntest dir ein Script schreiben für den Munitions Container, deine Waffen müssten dann dieses Script finden (GetComponent<Ammo>()).

 

Wenn die Waffen das getan haben dann kann beim nachladen einfach darauf zugegriffen werden und die Waffen können an der Komponente prüfen ob sie Munition bekommen und des dementsprechend abziehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Stimmt, gute Idee danke ^^

 

@edit: hat auf Anhieb super geklappt, is doch auch mal schön ^^

 

Falls sich das jemand durchliest und sich fragt wie man das am besten/einfachsten(?) finden kann (wovon ich mal bei einem Anfänger Tutorial ausgehe):

Wie oben beschrieben machts wohl am meisten Sinn seine Waffenscripte auf leere GameObjects zu legen(ideal. 1 Waffe pro Object) und sie als ChildObjects so auf das Schiff zulegen, dass die Position passt. Dann kann man einfach die "Ammo" Klasse auf das Schiff selbst legen und in der Waffe ein GameObject wie folgt initialisieren (C#):

 

public Ammo ammo;

void Start(){
ammo = transform.parent.GetComponent<Ammo>();
}

 

Das transform.parent. sorgt dafür, dass in der Parentklasse des Obejcts (in diesem Fall das Schiff) nach der Componente gesucht wird.

Anders herum kann man übrigens auch mit GetComponentInChildren<>() die Kindklassen eines Objekt nach einer Komponente durchsuchen ;)

Danach kann man wie gewohnt die Methoden und Variablen des "Ammo-Scripts" via ammo.Methode() und ammo.variable aufrufen

 

Verbessert mich wenn ich was falsches geschrieben habe ^^

 

 

achja: @Marrrk:

muss man nicht das gleiche mit StopFiring machen? Dass jede Waffe gestopped wird? Ich musste es jedenfalls machen (hab aber auch ein etwas anderes Script)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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