Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
protected void Update() { if (life <= 0) return; if (_shootingTimer <= 0) { _shootingTimer = firerate; Shoot(); } if (_shootingTimer > 0) _shootingTimer -= Time.deltaTime; } public abstract void Shoot(); |
C#-Quelltext |
|
1 2 3 4 |
public override void Shoot() { // SHOOT!! :D } |
C#-Quelltext |
|
1 2 3 |
new void Update () { base.Update(); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Bigabig« (11.03.2016, 18:21)
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public Interface IShoot { void Shoot(); // jede Klasse, kann diese Fähigkeit dann für sich selbst spezifisch definieren, } public Interface IMove { Vector2D/3D Move(); // jede Klasse, kann diese Fähigkeit dann für sich selbst spezifisch definieren, } class Gegner : IShoot, IMove { public void Shoot() {...} public Vector2D/3D Move() { //Bewege Gegner und gebe die neue Position zurück return new Vector2D/3D(...); } } |
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Move : Monobehaviour { void Update() { transform.position = Move(); // oder irgendwie, das du das ganze auch am Objekt sehen kannst, war lange nicht mehr in Unity3D unterwegs^^ } void Start() { // initialisierung.... } Vector3D Move() { //...z,B transform.position.X += 120; transform.position.Y += 90; transform.position.Z += 10; } //Vector3D als Beispiel } Und dann hängst du dieses Skript, an deinem Gegner-Gameobject (was du im unityeditor hast), einfach an. |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »JungleProgger« (11.03.2016, 20:21)
P.s Ich würde dir lieber sowas empfehlen:
C#-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Move : Monobehaviour { void Update() { transform.position = Move(); // oder irgendwie, das du das ganze auch am Objekt sehen kannst, war lange nicht mehr in Unity3D unterwegs^^ } void Start() { // initialisierung.... } Vector3D Move() { //...z,B transform.position.X += 120; transform.position.Y += 90; transform.position.Z += 10; } //Vector3D als Beispiel } Und dann hängst du dieses Skript, an deinem Gegner-Gameobject (was du im unityeditor hast), einfach an.
Aber bei sagen wir mal 30 verschiedenen Bewegungsabläufen von Gegnern, kann ich doch nicht jedes mal das immer gleich bleibende Update und Start kopieren. Das kann doch kein gutes Design sein.
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
protected void Update() { if (life <= 0) return; if (_shootingTimer <= 0) { _shootingTimer = firerate; Shoot(); } if (_shootingTimer > 0) _shootingTimer -= Time.deltaTime; } |
Das blöde an der Sache ist, dass nun die Update Methode in der erweiternden Klasse, die der Elternklasse überschreibt, daher ist folgender Code notwendig:
C#-Quelltext
1 2 3 new void Update () { base.Update(); }
Und genau das stört mich. Wie kann ich einem zukünftigen Benutzer meiner Elternklasse sagen, dass er die Eltern-Update-Methode aufrufen muss? Oder ist es in dem Fall vielleicht gar nicht so schlau mit abstrakten Klassen zu arbeiten? Lässt sich das mit Interfaces vllt. besser lösen?
Mein Ziel ist es halt, eine Art "Template-Gegner" zu erstellen, welchen ich dann verschiedene Angriffs- und Bewegungsmuster geben kann. (Momentan bin ich halt bei den Angriffsmuster)
Achso ich benutze übrigens Unity & C# für die Programmierung.
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Das Problem mit der Update Methode könnte folgendes sein: Jedes Skript beinhaltet standardmäßig bereits eine Start- und Update-Methode mit Standard-Sichtbarkeit. Entfernt man diese nicht, überlagern sie die entsprechenden Methoden der Basisklassen.
Man müsste diese leeren Methoden also nur entfernen, damit es wie erwartet funktioniert.
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Werbeanzeige