Hermetes Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Hallo Leute! Womöglich runzelt ihr alle die Stirn ! Etwas wirklich einfaches, aber ich verbringe Stunden damit. Aufgabe: Bei Trigger Enter soll dem Player ein Damage zugefügt werden. Problem: NullReferenceException: Object reference not set to an instance of an object TriggerDamage.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Skripts/Kampf/TriggerDamage.cs:23) Also Zeile: playersHealth.TakeDamage (100); Ich habe doch in der Start Methode angegeben wo sich TakeDamage befindet. Weshalb gehts dann nicht? using UnityEngine; using System.Collections; public class TriggerDamage : MonoBehaviour { private GameObject player; PlayersHealth playersHealth; public int attackDamaged; public void Start() { player = GameObject.FindGameObjectWithTag ("Player"); playersHealth = player.GetComponent<PlayersHealth> (); //Script im Objekt Player } //Trigger public void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")){ Debug.Log("player gefunden"); playersHealth.TakeDamage (100); //player.GetComponent<PlayersHealth>().TakeDamage(100); //player.SendMessage("TakeDamage",100); } // if (playersHealth.currentHealth >= 0) { // playersHealth.TakeDamage (attackDamaged); // Debug.Log("Player Schaden"); } } //Ende Trigger Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Da du den Fehler erst in der Zeile bekommst, wo du in die void TakeDamage rein springen willst, muss es also ein GameObject geben, welches den Tag Player hat. Außerdem muss es auch das Script PlayersHealth geben, denn sonst hättest du schon eine Fehlermeldung in der Start(). Also schätze ich mal, dass deine void mit Namen TakeDamage nicht public ist und deswegen nicht drauf zugegriffen werden kann. Ich weiß es aber nicht, weil du leider nur dieses eine Script zeigst, obwohl ja die andere Seite genauso wichtig ist. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
skee Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Da muss ich dem hochgeschätzten Herrn malzbie leider widersprechen Ein "GetComponent" liefert NULL zurück, wenn die Komponente nicht vorhanden ist. Es wird, soweit ich es im Kopf habe, kein Fehler geworfen. Ich vermute daher, dass die Komponente "PlayersHealth" nicht auf dem Player-Objekt liegt. Dadurch ist "playersHealth" NULL und dann würde es auch passen, wenn "playersHealth.TakeDamage (100);" eine NullReferenceException ausgibt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 26. Oktober 2016 Autor Melden Share Geschrieben 26. Oktober 2016 Danke vorab für eure Post´s ! Ich schätze Malzbie auch, aber die TakeDamage Methode ist public. Auch liegt PlayersHealth im Player-Objekt. Ich zeig euch das Script PlayersHealth. Die Methode selbst funktioniert. Testete es so aus: Update(){ TakeDamage(5);} using UnityEngine; using UnityEngine.UI; using System.Collections; public class PlayersHealth : MonoBehaviour { [Header("Gesundheit")] public float startingHealth = 200f; public float currentHealth; public Image healthImage; [Header("Audio")] public AudioClip deathClip; public AudioClip hurtClip; //Referenzen Animator anim; AudioSource playerAudio; PlayerDoing playerdoing; //Referenzen für Death Methode SelectWithMouse select; Pathfinding pathfinding; //Variablen bool isDead; bool damaged; void Awake(){ //Referencen anim = GetComponent<Animator>(); playerAudio = GetComponent<AudioSource>(); playerdoing = GetComponent<PlayerDoing> (); select = GetComponent<SelectWithMouse> (); pathfinding = GetComponent<Pathfinding> (); //Gesundheit bei Start currentHealth = startingHealth; UpdateHealthbar(); } public void TakeDamage(int amount){ currentHealth -=amount; UpdateHealthbar(); if (currentHealth <= 0 && !isDead){ Death(); } } //Ende TakeDamage public void Death (){ isDead = true; anim.SetBool ("Death",true); playerAudio.clip = hurtClip; playerAudio.Play(); Invoke ("DeathSound", 1); currentHealth = 0; UpdateHealthbar(); select.enabled = false; pathfinding.enabled = false; playerdoing.enabled = false; } //Ende Death void Update(){ } void DeathSound(){ playerAudio.clip = deathClip; playerAudio.Play (); } public void UpdateHealthbar(){ healthImage.fillAmount = currentHealth / startingHealth; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
GelegenheitsProgrammierer Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Wie wärs den wenn du über other die abfrage machst ob das der Spieler ist und ihm dann direkt über getComponent den Schaden reindrückst ? Und noch ne frage. Was genau soll das obere Script tun, also wenn das für ne Kugel ist die auf den Spieler trifft würde es nicht Sinn machen die OnTrigger funktion beim Spieler reinzubasteln ?? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 26. Oktober 2016 Autor Melden Share Geschrieben 26. Oktober 2016 In meinem Versuch läuft der Player in einen Qube rein, der den Player Schaden zufügen sollte. Du meinst dann diese Zeile oder? player.GetComponent<PlayersHealth>().TakeDamage(100); Da gibts den selben Fehler nur mit Zeile 24.brafage Wie meinst du genau Abfrage machst ob das der Spieler ist? Dafür ist doch : if (other.gameObject.CompareTag("Player")){ Oder wie meintest du das ? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
GelegenheitsProgrammierer Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Ich weiß es gerde nicht komplet auswendig public void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")){ other.gameObject.GetComponent("PlayerHealth").TakeDamage(100); } Irgend wie so war das, wenn ich mich nicht irre Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 26. Oktober 2016 Autor Melden Share Geschrieben 26. Oktober 2016 Hey GelegenheitsProgrammierer..........also deine Lösung hat funktioniert! Es fügt den Schaden von 100 zu. Das seltsame allerdings ist das die Fehlermeldung bestehen bleibt. Gibt mir jetzt Rätsel auf. Trotzdem , das ist erstmal ein Grund zum feiern! Danke! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
GelegenheitsProgrammierer Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Drücke mal in der Konsole clear, könnte sein das der noch die alten Fehlermeldungen drinnen hat. Oder schmeiß den alten kram aus dem Script raus wenn der noch nicht raus ist. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 26. Oktober 2016 Melden Share Geschrieben 26. Oktober 2016 Soso, ich bin "hochgeschätzt" ! ^^ Nett! @ Skee: Deine Aussage stimmt natürlich. Dass es einfach nur null ergibt, hab ich in meiner Theorie garnicht bedacht. Aber wenn es null ergibt, dann bedeutet es ja in dem Zusammenhang mit den anderen Bedingungen, dass der Player zur Start() Abfrage von dem Triggerscript noch gar nicht in der Szene ist! Kann das sein, Hermetes? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MarcoMeter Geschrieben 27. Oktober 2016 Melden Share Geschrieben 27. Oktober 2016 Sieht für mich nach einem logischen Fehler aus. Das Script TriggerDamage gehört scheinbar nicht zum selben GameObject wie PlayersHealth. Da liegt die Vermutung nahe, dass TriggerDamage auf dem Cube liegt und PlayersHealth eben auf dem anderen GameObject (Player) des Kollisionspartners. Daher kann TriggerDamage auch keine PlayersHealth Komponente finden, da es schlichtweg auf einem anderen GameObject liegt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 28. Oktober 2016 Autor Melden Share Geschrieben 28. Oktober 2016 Also mallzbie , du bist hier der Altmeister! Betonung lag jetzt nicht auf Alt! Player sowie der TriggerQube sind von Anfang an, in der Szene. Ich weiss nicht ob das eine wichtige Information ist. Mein Script heisst ja momentan PlayersHealth (mit s). Davor hiess es allerdings PlayerHealth. (ohne s). Einige Scripte, unter anderem das TriggerDamage Script hatten vorher die Referenzverweise auf das erste Script (PlayerHealth). Dieses Script hatte ich gelöscht und alle Verweise auf PlayersHealth (mit s) geändert. Könnte das der Grund sein? Seltsam, ist das es trotzdem funktioniert! Ein Combat Floating Text habe ich gestern noch erstellt - läuft super! Trotzdem Fehlermeldung. Im Inspector lässt sich das Script auch nicht deaktvieren. Gelegenheitsprogrammierer: Alles überflüssige gelöscht.Keine Wirkung. MarcoMeter: Die Scripte befinden sich auch auf zwei unterschiedlichen Objekten. Der Ort des Scriptes wurde ja auch im Awake des TriggerDamge Scriptes initialisiert. Ich hoffe das habe ich so auch richtig gemacht, für mich ist das ganz neu. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 29. Oktober 2016 Melden Share Geschrieben 29. Oktober 2016 ähm...umbenannt? Heisst dein Script wirklich auch PlayersHealth? Also nicht du die Klasse im Script, sondern auch das Script selbst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 29. Oktober 2016 Autor Melden Share Geschrieben 29. Oktober 2016 Ein neues Script geschrieben, die Referenzen unbenannt und das alte Script gelöscht. Die Script heisst als Datei sowie die Klasse PlayersHealth. Wisst ihr was, ich werde dieses Wochenende es an einem Enemy ausprobieren (Kampf Simulation) Die TriggerBox war ja nur mein Test Objekt. Beschäftigen wir uns lieber mit was anderem Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 29. Oktober 2016 Melden Share Geschrieben 29. Oktober 2016 Ja, wenn du willst.... aber dein Fehler ist doch noch nicht weg, oder doch? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.