Jump to content
Unity Insider Forum

Methode wenn die Distanz zum Gegner zu niedrig ist alle paar Sekunden ausführen


Timon

Recommended Posts

Ich würde gerne den Spieler alle x Sekunden Schaden nehmen lassen wenn die Distanz zu einem Gegner weniger als 12 beträgt. Die Distanz kann ich schon ausgeben und dem Spieler Schaden machen funktioniert auch. 

Aber wie programmiere ich jetzt das der Code da unten funktionieren würde?

 

If (distance <= 12)
{
	TakeDamage(20)
    //dann x Sekunden warten lassen
    
    //dann wiederholen.
    

}

Danke fürs lesen. Frohe Ostern

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Timon changed the title to Methode wenn die Distanz zum Gegner zu niedrig ist alle paar Sekunden ausführen
vor 18 Minuten schrieb Timon:

@gombolo Ich kriege dann nur den Error  Der Name "timeover" ist im aktuellen Kontext nicht vorhanden.    

oookkkkk....dann hast du ganz andere Probleme und das Stichwort Coroutine wird dir auch nicht weiter helfen.

timeover ist eine Variable die von dir definiert werden muss !! Das Beispiel ist nicht lauffähig. Soll nur eine kleine Hilfe sein. 

Versuche die Logik zu verstehen, dann versuche den Code zu formen. Damit es zur Logik passt. 

 

Edit: Coroutinen sind ganz cool...verwende ich auch oft um Sachen machen zu lassen die in bestimmten Zeitabständen passieren sollen. 

Es ist praktisch ein weitere Thread in dem dein Code, dass was macht und du es auch mal warten lassen kannst ohne den Ablauf zu verlangsamen. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man kann sowas auch mit einer Coroutine machen, in der einfach 2 Sekunden gewartet wird, aber man müsste dann die Coroutine stoppen, sobald man aus dem Radius raus ist weil sonst kommt auch ein Schaden wenn man schon wieder raus ist, und das finde ich blöd.

Deswegen finde ich eine Addition von deltaTime in der update besser.

Die frage ist jetzt aber, ob der erste Schaden sofort eintritt, sobald man in dem Radius ist oder erst nach 2 Sekunden im Radius. Der Folgeschaden ist dann natürlich immer alle 2 Sekunden.
Sobald man aus dem Radius raus ist, muss der Timer natürlich zurück gestellt werden.

Ich würde es so machen:

public bool instantDamage =false; // sofortiger schaden oder nicht?
public float damageTime=2;
public float damageRadius=12;
float insideRadiusTime=0;
void Start(){
  if(instantDamage){ // soll der Schaden beim Eintritt sofort stattfinden?
    insideRadiusTime=damageTime; // wenn 
  }
}
void Update(){
  if(distanceToEnemy<=damageRadius){ // ich bin in der schadensZone
    if(insideRadiusTime<damageTime){ //nur erhöhen, wenn nicht schon erreicht
      insideRadiusTime+=Time.deltaTime;
    }
    else{
      //verursache schaden
      player.Damage(10); // dem playerscript den schaden mitteilen.
      // die Zeit im Radius zurücksetzen
      insideRadiusTime-=damageTime; // die damageTime abziehen, um Ungenauigkeiten wegen der Frames auszugleichen
    }
  }
  else{ // ich bin nicht mehr in der Schadenszone, also alles auf Grundwerte zurück stellen
    if(instantDamage){ // soll der Schaden beim Eintritt sofort stattfinden?
      insideRadiusTime=damageTime;
    }
    else{
      insideRadiusTime=0;
    }
  }
}

Das habe ich jetzt nur so runter geschrieben, können also Fehler drin sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier bei Unity Dokumentation ist sogar ein warte nach Zeit beispiel.

https://docs.unity3d.com/ScriptReference/Time-time.html

Und hier wird Coroutinen angekratzt

https://forum.unity-community.de/topic/16306-while-schleife-unendlich-machen/?tab=comments#comment-111709

da wäre das

 yield return new WaitForSeconds(2f);

das Stichwort.

Viel Glück

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Timon:

Ich kriege dann nur den Error  Der Name "timeover" ist im aktuellen Kontext nicht vorhanden.    

Kontext heißt sowas wie, es fehlt der Zusammenhang.

Also Unity kennt timeover nicht.

timeover ist eine selbst erstellt Variable. Du musst aber Unity sagen, was das Wort bedeutet.

Ist wie beim Handy mit T9(wenn man heute noch so sagt), wenn dein Handy sagt, er kennt ein Wort nicht, kannst du das Wort in den Internen Duden Laden.

Dann weiß dein Handy, ah das Wort kenne ich, also kein Fehler.

So ist das bei Unity auch, nur etwas Komplizierter.

Unity weiß damit nix anzufangen, weil er nicht weiß was das Wort bedeutet. repräsentiert es einen Integer, einen Float, einen String oder doch etwas ganz anderes...

Deine Variable distance hast doch doch auch deklariert.

Das gleiche musst du mit timeover auch machen.

Kannst auch ganz andere Variablen Namen verwenden. Hier paar beispiele.

iMeckiMagDich

fHansWurst

strSolo

Zum guten ton beim Programmieren ist es, wenn man eine Variable mit mehren Worten hat, Würd dac nächste Wort zu Anfang Groß geschrieben.

So sieht man, wann ein neues Wort anfängt.

Und ansonsten hat jeder so sein eigenes Muster.

Ich hab bei einer Anderen Programmierumgebung gelernt, das man Variablennamen am Anfang schreibt, was es ist.

Wenn du 25K Deklarationen und 6M Zeilen an Code hast, und du siehst iMeckiMagDich, dann weißt du, ohne nach der Deklaration zu suchen, das ist 

ein Integer mit der Bezeichnung: Mecki Mag Dich.

Das macht auch Programmierern die mal auf den Code schauen, wesentlich leichter zu verstehen, was bedeutet das unbekannte Wort.

Das macht es auch uns leichter, wenn du eine Frage hast.

Ist distance ein integer? ein Float? ich sehe das nicht und kann nicht in dein Kopf gucken.

Das gleiche gilt für TakeDamage.

Und du hältst nicht mal eigene regeln ein.

distance klein ist ok.

TakeDamage ist zu Anfang aber Groß??? 

Da könnte man ja denken, vor Take gibt es noch Wörter, die du aber nicht mit aufschreibst, also uns weniger Information zu Verfügung stellst.

Je besser deine Vorarbeit bei einer Frage ist, umso besser kann man dir helfen.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerade eben schrieb Sir_Mathew:

Jetzt musst du nur noch sagen, wo genau in seinen Code diese Zeile hingehört.

Dann brauch er auch nicht mehr überlegen:rolleyes:

jaaaa....ich weiss eigentlich hat er viel größere Probleme. Er muss erst einmal die Grundlagen verstehen, dann mal ein kleines Spiel wie z.B. Snake programmieren. Dann mal sich an einem Tetris_Klon die Zähne ausbeisen und so nach ca. 10 Quatrillionenjahren kann er ein "echtes" eigenes Spiel entwickeln. :D 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Öhm Snake und Tetris könnte ich selbst nicht mal, also nicht leicht.

Leichtes sind z.b. ein Einfacher Taschenrechner, ein Spiel die eine Zufallszahl generiert und sagt, Rate 0-100.

Dann Ratet man, dann heißt es z.b., deine gewählte zahlt ist kleiner wie die Zufalls Zahl. Man ratet so Lange, bis man richtig geraten hat.

Die Versuche werden gezählt, und so kann man mit Mehreren Spieler das spielen, und wer weniger Versuche hat, gewinnt.

Dann kommt 3. Versuch in Richtung UI. Dort lernt man das gelernte einzusetzen.

In 3D Gamestudio hab ich 4 Menü Vorlagen Programmiert.

Hier hab ich auch ein Paar Projekte fürs Menü erstellt. Werde aber wohl ganz zum Schluss noch eines Machen, das dann zum Spiel Passt.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...