2015-12-26 5 views
0

Привет, У меня есть сценарий, прикрепленный к основной камере, и в этом скрипте я хочу выбрать число от 0 до 5. И в зависимости от того, какое число я получаю, я хочу, чтобы скрипт запускался. У меня есть сценарий, прикрепленный к основной камере. Я получаю эту ошибкуMy Unity Script Wont работает?

NullReferenceException: Ссылка на объект не указывает на экземпляр объекта RandomFunction.Start() (на активы/ресурсы/Scripts/RandomFunction.cs: 22)

using UnityEngine; 
    using System.Collections; 
    public class RandomFunction : MonoBehaviour { 
    int n; 
    void Awake() 
    { 
     GetComponent<RandomFunction>().enabled = true; 
    } 
    void Start() 
    { 
     n=Random.Range(0,5); 
     if(n==0) 
     { 
      GetComponent<BlueGoUp>().enabled = true; 
     } 
     else if(n==1) 
     { 
      GetComponent<RedGoUp>().enabled = true; 
     } 
     else if(n==2) 
     { 
      GetComponent<GreenGoUp>().enabled = true; 
     } 
     else if(n==3) 
     { 
      GetComponent<OrangeGoUp>().enabled = true; 
     } 
     else if(n==4) 
     { 
      GetComponent<YellowGoUp>().enabled = true; 
     } 
     else if(n==5) 
      { 
      GetComponent<PurpleGoUp>().enabled = true; 
     } 
    } 

} 
+0

Вы должны использовать инструкцию 'switch' вместо' if'-'sese'. Кроме того, по умолчанию эти скрипты имеют значение true? Потому что я уверен, что вам не нужно включать скрипт в объект. – AustinWBryan

+0

там все отключены при запуске() – user5717696

+0

Итак, когда вы отключите их в 'Start()' ничего не происходит? Нет исключения 'null'? – AustinWBryan

ответ

0
  1. Удалить Awake() метод, потому что это действительно необязательно для активного RandomFunction сценария отсюда. Активно это в инспекторе.
  2. Я не уверен, что использовать компонент как это было правильно. Я всегда использую gameObject.GetComponent
  3. if(n==5) никогда не будет правдой, так как Random.Range(0,5)0,1,2,3 or 4. из документа:

    Range (INT мин INT макс) Возвращает случайное целое число в диапазоне от мин [включительно] и макс [эксклюзив] (Read Only).

  4. Используйте switch case заявление вместо If else

Вашего конечного кода должна выглядеть следующим образом:

using UnityEngine; 
using System.Collections; 
public class RandomFunction : MonoBehaviour { 
int n; 

void Start() 
{ 
    n=Random.Range(0,6); 

    switch (n) 
    { 
     case 0: 
      gameobject.GetComponent<BlueGoUp>().enabled = true; 
      break; 
     case 1: 
      gameObject.GetComponent<RedGoUp>().enabled = true; 
      break; 
     case 2: 
      gameObject.GetComponent<GreenGoUp>().enabled = true; 
      break; 
     case 3: 
      gameObject.GetComponent<OrangeGoUp>().enabled = true; 
      break; 
     case 4: 
      gameObject.GetComponent<YellowGoUp>().enabled = true; 
      break; 
     case 5: 
      gameObject.GetComponent<PurpleGoUp>().enabled = true; 
      break; 
     default: 
      break; 
    } 
} 
} 
0

Так первый из все, что вам не нужно делать то, что вы делаете в Awake функции, потому что:

  1. объект MonoBehaviour используется является один прикрепленный к GameObject. Если вы не понимаете, что я имею в виду, предположим, что вы подключили RandomFunction к CameraObj. Теперь этот экземпляр RandomFunction (указатель в скрипте) равен или совпадает с CameraObj.GetComponent<RandomFunction>(), так как вы не можете добавить более одного компонента к GameObject.
  2. Метод Awake() не будет выполнен до объекта фактически включен. Таким образом, вам не нужно снова включать объект в сценарий, потому что если он выполняется, объект уже включен.

Избегайте метода Awake, и он также должен удалить NullReferenceException. Если он все еще не делает, чтобы убедиться, что тот же объект (который имеет RandomFunction компонент) также имеет компоненты BlueGoUp, RedGoUp, YellowGoUp, GreenGoUp, OrangeGoUp и PurpleGoUp.

О, и ваше состояние if (n==5) никогда не будет правдой, так как 5 никогда не будут возвращены Random.Range(). Параметр max всегда является исключительным для целых чисел в функции Random.Range(), поэтому возвращаемое значение всегда будет min <= value < max.

0

Скорее всего, и я надеюсь, что все сценарии GoUp не прикреплены к камере , Так что найдите скрипт по-другому. Попробуйте заменить ваш код этого

using UnityEngine; 
using System.Collections; 
public class RandomFunction : MonoBehaviour { 
    int n; 
    void Awake() 
    { 
     GetComponent<RandomFunction>().enabled = true; 
    } 
    void Start() 
    { 
     n=Random.Range(0,6); 
     switch(n){ 
     case 0: 
      FindObjectOfType<BlueGoUp>().enabled = true; 
      break; 
     case 1: 
      FindObjectOfType<RedGoUp>().enabled = true; 
      break; 
     case 2: 
      FindObjectOfType<GreenGoUp>().enabled = true; 
      break; 
     case 3: 
      FindObjectOfType<OrangeGoUp>().enabled = true; 
      break; 
     case 4: 
      FindObjectOfType<YellowGoUp>().enabled = true; 
      break; 
     case 5: 
      FindObjectOfType<PurpleGoUp>().enabled = true; 
      break; 
     } 
    } 

} 

Если этот код не будет работать, то нет никакого способа, кроме того, что ваши скрипты не сброшены на любых геймобжектах.