我的Unity脚本无法工作?

时间:2015-12-26 02:49:21

标签: c# random unity3d

嗨我有一个附加到主摄像头的脚本,在这个脚本中我想选择0到5之间的数字。根据我得到的数字,我想要一个脚本运行。她的脚本是附在主摄像头上的。我一直收到这个错误

NullReferenceException:对象引用未设置为对象的实例RandomFunction.Start()(在Assets / Resources / 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;
         }
     }

 }

3 个答案:

答案 0 :(得分:0)

首先,你不需要做你在Awake功能中所做的事情,因为:

  1. 正在使用的MonoBehaviour对象附加到GameObject的对象。如果你不理解我的意思,那么你应该将RandomFunction附加到CameraObj。现在,RandomFunction(脚本中的this指针)的实例与CameraObj.GetComponent<RandomFunction>()相同或相同,因为您无法将相同的组件添加到一个游戏对象。
  2. Awake()方法不会被执行直到对象实际启用。因此您不需要重新启用脚本中的对象,因为如果它正在执行,则该对象已经启用。
  3. 删除Awake方法,它也应删除NullReferenceException。如果仍然没有,请确保相同的对象(具有RandomFunction组件)也包含组件BlueGoUpRedGoUp,{ {1}},YellowGoUpGreenGoUpOrangeGoUp

    哦,你的PurpleGoUp条件永远不会成立,因为if (n==5)永远不会返回5。 Random.Range()参数始终对max函数中的整数是唯一的,因此返回的值始终为Random.Range()

答案 1 :(得分:0)

  1. 删除Awake()方法,因为从此处激活RandomFunction脚本实际上是不必要的。在检查员中激活。
  2. 我不确定使用这样的组件是否正确。我总是使用gameObject.GetComponent
  3. if(n==5)永远不会成为现实,因为Random.Range(0,5)会返回0,1,2,3 or 4。 来自文件:
      

    范围( int min, int max),返回min [包含]和max [exclusive]之间的随机整数(只读)。

  4. 使用switch case语句代替If else
  5. 您的最终代码应如下所示:

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

答案 2 :(得分: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;
        }
    }

}

如果这段代码不起作用,那么除了你的脚本不会放在任何游戏对象上之外别无他法。