Jump to content
Unity Insider Forum

Trigger und Damage


Hermetes

Recommended Posts

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

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

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

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

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

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

Soso, ich bin "hochgeschätzt" ! ^^ :D

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

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

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! :D 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

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

Archiviert

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

×
×
  • Neu erstellen...