Unity Schaden bekommen durch Kontakt?
Ich habe in meinem Spiel mit Unity nun Gegner mit einer Hitbox die zu mir laufen, außerdem habe ich bereits Varaiablen für Hp etc...
Wie kann ich ne If Abfrage erstellen das jedes mal wenn mich ein Gegner berührt ich Schaden bekommen? Und wie kann ich machen das sobald meine HP unter 0 ist ich sterbe?
2 Antworten
Die Kollisionsabfrage würdest du nicht mit if lösen. Wenn du eine Hitbox / einen Collider um deinen Charakter hast, realisiert dieser doch die auf ihn einprasselnden Events selbst und stellt eine entsprechende Methode zu Verfügung, die als Handler für so ein Event reagiert.
https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html
Innerhalb dieses Colliders kannst du nochmals abfragen (dann mit if), ob das Objekt, dass mit dem Spieler-Collider kollidiert ist, der Gegner war. Wenn ja, ziehst du einen gewissen Satz an Lebensenergie ab.
Das würde bedeuten, dass du anfangen würdest, bereits bestehende Funktionalitäten neu zu entwickeln, was m.E. keinen Sinn macht.
Mit welchem Befehl lasse ich das Spiel beenden also das man stirbt?
In dem Fall würde ich doch eher die Szene neu laden (LoadScene). Um das noch etwas aufzuhübschen, kann man vorher noch einen Text (GUI.Label) einblenden und / oder irgendeinen kurzen Sound einspielen (PlayAudioClip). Damit dies noch für den Spieler auffassbar ist, sollte eine Verzögerung eingebaut werden (WaitForSeconds), bevor die Szene lädt.
Collider auf die Gegner und auf dich
Gegner brauchen nen Tag
Dann so irgendwie:
if(enemy.tag == "Enemy"){ //Im Collision Event
player.DealDmg(10);
}
class Player{
private int hp
void DealDmg(int dmg){
hp -= dmg;
if(hp <= 0) //Verloren
}
}
Kannst du mir sagen mit welchem Befehl ich das Spiel beende also man stirbt sozusagen?
Du willst doch bestimmt nicht das spi beenden... Geh vlt ins Hauptmenü oder nen endscreen. Also lad am besten ne neue szene
Naja ich habe och weder Endscreen oder Hauptmenü :( Deswegen will ich temporär einfach das Spiel beenen
Ja stimmt tut mir Leid für deine Mühe, trotzdem danke!
Du ich weiß nicht ob ich grundlegend was falsch mache.. Ich habe nun void Update()
{
if (Input.GetKeyDown(KeyCode.T))
{
TakeDamage(10);
}
if (currenthealth <= 0)
{
Application.Quit();
}
}
Musst schon dazu schreiben was das Problem ist...
Und in der update Funktion is es auch falsch, oder is es nur zum test?
Also sobald meine Hp <= 0 passiert nichts... Was meinst du genau mit in der update Funktion ist das falsch? Ich dachte da muss das rein?
Das muss ins collision event rein...
Ich will ja nix sagen aber hast du überhaupt Bein bisschen ne Idee davon was du machst?
Hier würde dir jedes mal wenn du t drückst 10hp abgezogen.
Setz dir breakpoints und schau warum es nicht funktioniert
Ich hab echt nicht viel Ahnung, die meisten meiner Scripte fürs Spiel sind abgeschrieben dann modefiziert oder mit anderen Scripts vermischt...
Merkt man. So wird das aber nichts. Haben deine Gegner und der Spieler denn überhaupt collider?
Weißt du was breakpoints sind und wie man sie verwendet? Wenn nein ist das erstmal dein nächster schritt
Ich habe nun es so gemacht das jedesmal wenn ich T drücke ich Schaden kassiere, also mache ich dann das dort rein oder nicht? (Ist ja sozusagen die "Collision" oder nicht?
Ja ich weiß was breakpoints sind, soweit bin ich schon xD. Ich versteh auch wie das Script funktioniert. Meine Gegner haben auch Collider, wie gesagt funktioniert alles außer jetzt noch die Collision und das sterben
Wenn du t drückst bekommst du Schäden. Das ist ja aber an sich nicht richtig. Es muss Immer noch ins collision event und wenn du meine Fragen nicht beantwortest kommen wir hier auch nicht weiter
Na also, dann mach nen breakpoint bei if(hp kleiner 0) hin
1. Ändert sich der Wert von current health nachdem du t drückst?
2. Kommst du dann irgendwann zu application. Quit?
Naja er labert das es an einem Thread geendet hat
Ups sorry ich meinte mit Code 0, habs falsch gelesen
Wenn ich Debugge oder wenn ich im Spiel T drücke?
Ja es verändert seinen Wert wenn man T drückt aber sobald es unter 0 wird passiert nichts
0 Fehlerhaft und 0 übersprungen, wurde mit dem Code beendet
Bei mir ist das aber kein gelber Pfeil zu sehen, muss man den sehen?
Also kommt der garnicht dahin oder was? Aber kann es sein das es daran liegt das es für Unity ist, außerdem besteht ja mein Spiel aus vielen Scripts
Ich versteh ehrlich gesagt dein Problem nicht. Es kann doch nicht so schwer sein nen breakpoint bei dem if(currenthealth <= 0) zu setzten. Mit f10 gehst du dann 2 Schritt weiter und schaust ob er zu application. Quit kommt oder net. Evtl mach nen conditional breakpoint draus
Also ich erstelle ein Breakpoint, drücke dann auf Debuggen und es passier nichts außer das er sagt: Build: 1 erfolgreich oder aktuell, 0 fehlerhaft, 0 übersprungen und Das Programm "Unity" wurde mit Code 0 (0x0) beendet.
Application.Quit() kann nicht im Editor ausgeführt werden. Das geht nur im Build.
Steht aber auch hier : https://docs.unity3d.com/ScriptReference/Application.Quit.html
Du meinst in deiner Antwort das ich es mit einer If-Abfrage nicht lösen würde. Also heißt das es geht schlecht/schwer damit oder geht das überhaupt nicht