2016-06-18 10 views
0

Ich möchte eine andere Skript-Methode (Sterne) aufrufen, wenn Objekt zerstört wird, Unten ist mein Code so weit ich getan habe, bekomme ich Fehler (Null-Referenz) bei Zeile "tim.stars" , Irgendwelche Vorschläge was ich falsch gemacht habe? Hier ist mein Code.Call-Methode von einem anderen Skript C# Unity3d

using UnityEngine; 
using System.Collections; 
public class clear : MonoBehaviour { 
// Use this for initialization 
void Start() { 
    GetComponent<ParticleSystem>().emissionRate = 0; 
} 
// Update is called once per frame 
void Update() { 
    if (Input.GetMouseButtonDown (1)) { 
     GetComponent<ParticleSystem>().Emit (10); 
    } 
} 
void OnParticleCollision(GameObject obj) 
{ 
    if (obj.gameObject.tag == "fire1") { 
     Destroy (obj, 5.0f); 
     TimingForIndust2 tim = GetComponent<TimingForIndust2>(); 
     tim.stars(); 
    } 
     StartCoroutine (TestCoroutine()); 
    } 
IEnumerator TestCoroutine(){ 
    yield return new WaitForSeconds(8); 
    Application.LoadLevel (25); 
} 
} 

hier ist mein zweites Skript TimingForIndust2

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using MadLevelManager; 
public class TimingForIndust2 : MonoBehaviour { 
public Transform TimingBar; 
public Transform TextIndicator; 
public Transform TextRemaining; 
[SerializeField] private float currentAmount; 
[SerializeField] private float speed; 

// method to reduce the time continously 
void Update() { 

    if (currentAmount > 0) { 
     currentAmount -= speed*Time.deltaTime; 
     TextIndicator.GetComponent<Text>().text=((int)currentAmount).ToString()+"s"; 
     TextRemaining.gameObject.SetActive(true); 

    } else { 
     TextRemaining.gameObject.SetActive(false); 
     TextIndicator.GetComponent<Text>().text="TimeUP"; 
     Application.LoadLevel (62); 

    } 
    TimingBar.GetComponent<Image>().fillAmount = currentAmount/60; 
} 
public void stars() 
{ 
    if (currentAmount > 45.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_2", true); 
     MadLevelProfile.SetCompleted (MadLevel.currentLevelName, true); 
    } else if (currentAmount > 20.0f && currentAmount < 29.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_2", true); 
     MadLevelProfile.SetCompleted (MadLevel.currentLevelName, true); 

    } else if (currentAmount > 2.0f && currentAmount < 19.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
    } 
} 
} 
+0

Ist 'TimingForIndust2'-Skript an das gleiche Spielobjekt angehängt, an das das obige Skript (' clear') angehängt ist? Oder ist 'TimingForIndust2' an das Spielobjekt mit dem 'fire1'-Tag angehängt, an dem Sie die Kollision erkennen werden? – Programmer

+0

clear Skript ist mit meinem (Feuerlöscher Prefeb die aus dem Inventar laden) angefügt, und TimingForIndust2 Skript ist an Timer angeschlossen (Timer ist eigentlich Leinwand, wo die Zeit läuft). clear script und TimingForIndust2 script sind an verschiedenen Objekten angehängt. @Programmer –

Antwort

1

Durch Ihren Kommentar zu lesen, müssen Sie finden die Timer mit GameObject.Find dann daraus die Komponente erhalten. Sie können dies nicht jedes Mal tun, wenn eine Kollision auftritt. Sie müssen es in der Funktion Start() einmal zwischenspeichern und dann erneut verwenden.

Ich auch ParticleSystem in den neuen Code zwischengespeichert. Anstatt das Tag direkt mit obj.gameObject.tag == "fire1" zu vergleichen, verwenden Sie auch die Funktion CompareTag, um Tags zu vergleichen.

Dies sollte Ihr Problem beheben. Jetzt ist es Ihre Aufgabe, die Komponente , die an das TextIndicator-Skript angehängt ist, das Sie in der Aktualisierungsfunktion aufrufen, im Skript TimingForIndust2 zwischenzuspeichern.

using UnityEngine; 
using System.Collections; 
public class clear : MonoBehaviour { 
TimingForIndust2 timingForIndust2; 

ParticleSystem particles; 

// Use this for initialization 
void Start() { 
    particles = GetComponent<ParticleSystem>(); 
    particles.emissionRate = 0; 

    GameObject tempObj = GameObject.Find("Timer"); 
    timingForIndust2 = tempObj.GetComponent<TimingForIndust2>(); 
} 
// Update is called once per frame 
void Update() { 
    if (Input.GetMouseButtonDown (1)) { 
     particles.Emit (10); 
    } 
} 
void OnParticleCollision(GameObject obj) 
{ 
    if (obj.CompareTag("fire1")) { 
     Destroy (obj, 5.0f); 
     timingForIndust2.stars(); 
    } 
     StartCoroutine (TestCoroutine()); 
    } 
IEnumerator TestCoroutine(){ 
    yield return new WaitForSeconds(8); 
    Application.LoadLevel (25); 
} 
} 
+0

Danke für die Antwort, aber jetzt bekomme ich diesen Fehler, indem Sie Ihre Antwort ArgumentException: GetLocalizedString kann nur aus dem Haupt-Thread aufgerufen werden. Konstruktoren und Feldinitialisierer werden beim Laden einer Szene vom Lade-Thread ausgeführt. Verwenden Sie diese Funktion nicht im Konstruktor- oder Feldinitialisierer, sondern verschieben Sie den Initialisierungscode in die Erwachungs- oder Startfunktion. TreeEditor.TreeGroupLeaf..cctor() Rethrow als TypeInitializationException: Eine Ausnahme wurde vom Typinitialisierer für TreeEditor.TreeGroupLeaf ausgelöst –

+0

@FarhanAli Die Antwort, die ich zur Verfügung gestellt habe, sollte tun, was Sie suchen, die eine andere Funktion in einem anderen Skript aufrufen soll. Es sollte auch dein 'Null'-Problem lösen. Diese Frage wurde beantwortet. Der neue Fehler, den Sie bekommen, ist etwas völlig anderes. Sie können diese Frage schließen und eine neue Frage stellen. Geben Sie auch die Codezeile an, die das Problem verursacht, und stellen Sie alle Ihre Skripts bereit, da ohne diese Replikation der Fehler fast unmöglich wäre. Sie können die neue Frage hier verlinken, wenn Sie möchten. – Programmer

+0

genau, Vielen Dank, ich habe herausgefunden :-) –

Verwandte Themen