2015-08-16 5 views
-2

Мой сценарий ...Почему я продолжаю получать эту ошибку NullReferenceException?

using UnityEngine; 
using System.Collections; 

public class CountDownTimer : MonoBehaviour { 

    public int score; 
    float timeRemaining = 15; 

    // Use this for initialization 
    void Start() { 
    } 

    // Update is called once per frame 
    void Update() { 
     timeRemaining -= Time.deltaTime; 
     score = GetComponent<TriggerZone>().score; 
    } 

    void OnGUI(){ 
     if (timeRemaining > 0) { 
      GUI.Label(new Rect(100, 100, 200, 100), "Time Remaining: "+(int)timeRemaining); 
     } 
     else{ 
      GUI.Label(new Rect(100, 100, 200, 100), "Times up your score was: " + score + ". Press the r button to restart, or ESC to quit."); 
      if (Input.GetKeyDown("r")) 
       Application.LoadLevel("Testing Grounds"); 
      if (Input.GetKey("escape")) 
       Application.Quit(); 
     } 
    } 
} 

Ошибка:

NullReferenceException: Object reference not set to an instance of an object CountDownTimer.Update() (at Assets/Scripts/CountDownTimer.cs:16)

Я не могу думать о том, что может быть причиной этой ошибки. Насколько я понимаю, он пытается сказать мне, что чего-то не существует, но я не могу придумать, что это может быть. "score = GetComponent(). score;" обращается к другому скрипту, который содержит значение оценки, так что, когда таймер заканчивается, он сообщает игроку свой балл и дает им возможность либо выйти, либо перезапустить игру.

Кроме того, если это помогает здесь другой сценарий ...

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

класс TriggerZone общественности: MonoBehaviour {

public Text MyText; 
public int score; 

// Use this for initialization 
void Start() { 

    MyText.text = ""; 

} 


// Update is called once per frame 
void Update() { 

    MyText.text = "$" + score; 

} 

void OnTriggerEnter(Collider coll) { 

    if (coll.gameObject.HasTag ("ValueLevel1")) 
     score = score + 5; 

    if (coll.gameObject.HasTag ("ValueLevel2")) 
     score = score + 25; 

    if (coll.gameObject.HasTag ("ValueLevel3")) 
     score = score + 50; 

    if (coll.gameObject.HasTag ("ValueLevel4")) 
     score = score + 100; 

    if (coll.CompareTag ("Pickable")) { 
     coll.gameObject.SetActive(false); 
    } 

} 

}

+0

Звучит так: 'GetComponent ()' возвращает 'null', но мы не можем быть уверены, потому что вы не разместили достаточно кода, чтобы мы могли воспроизвести вашу проблему. – Enigmativity

+0

Что еще вам нужно? Другой скрипт? – Sie

ответ

0

Ну, я чувствую себя глупо, но благодаря Reddit я, наконец, нашел проблему. Оказывается, у меня был сценарий, прикрепленный к моему контроллеру FPS, который вызывал нулевую проблему.

0
GetComponent<TriggerZone>() 

кажется, возвращается null и вы пытаетесь получить доступ к .score от null. Ваши решения - либо проверить возврат на null и предпринять соответствующие действия, либо убедиться, что вызов никогда не возвращается null.

+0

Вот где я потерялся. Я использую «score = GetComponent () .score;» чтобы получить значение оценки от TriggerZone. Без этого это не сработает. Поэтому он не может возвращать null. Я относительно новичок в C#, так что извините, если я не понимаю смысла. – Sie

+0

Проверьте, прикреплены ли оба сценария (т. Е. TriggerZone & CountDownTimer) к одному и тому же GameObject. Согласно вашему сценарию, они должны быть. Если вам нужно, чтобы они были на отдельных игровых объектах, измените строку GetComponent, чтобы прочитать что-то вроде score = REFERENCE_TO_OTHER_GO.GetComponent () .score; –

+0

Они оба прикреплены к тому же GameObject (как вы сказали, они должны быть). Я понятия не имею, почему это не работает, поскольку игра, кажется, работает нормально. Я как бы соблазн просто перейти к разработке, но я предпочел бы сквоить эту ошибку в первую очередь. – Sie

0

По каким-то причинам, вы, возможно, пропустили TriggerZone скрипт/компонент для экземпляра CountDownTimer, попробуйте ниже атрибуты:

атрибут
[RequireComponent (typeof (TriggerZone))] //Try add this 
public class CountDownTimer : MonoBehaviour { 
... 
} 

Это RequireComponent позволяет автоматически добавлять необходимый компонент в качестве зависимости. Ниже от Unity3D официального дока:

When you add a script which uses RequireComponent, the required component will automatically be added to the game object. This is useful to avoid setup errors. For example a script might require that a rigid body is always added to the same game object. Using RequireComponent this will be done automatically, thus you can never get the setup wrong.

КСТАТИ: приведенные ниже вызовы не должны вызываться в Update(), предпочтительно в Start() или Awake():

score = GetComponent<TriggerZone>().score; 
+0

То же самое, что и в случае с требованием RequireComponent. Ошибка просто переместилась в Line 12 (в Start()). "NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта CountDownTimer.Start() (в Assets/Scripts/CountDownTimer.cs: 12) « – Sie

+0

, какая строка 12? Можете ли вы добавить комментарий, чтобы показать строку 12 в своем посте? – David

+0

Вот новый код: https://ideone.com/qQAipj. – Sie

Смежные вопросы