Jump to content
Unity Insider Forum
Hermetes

Trigger und Damage

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

  • Like 1

Share this post


Link to post
Share on other sites

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;
}


}

Share this post


Link to post
Share on other sites

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 ??

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

ähm...umbenannt?

Heisst dein Script wirklich auch PlayersHealth? Also nicht du die Klasse im Script, sondern auch das Script selbst.

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×