- Home /
 
Instantiation from class
i keep getting NullReferenceException but i can't really understand where the problem is these are the scripts i'm using:
using UnityEngine; using System.Collections;
 [System.Serializable]
 public class SomeClass {
     public GameObject[] objects;
     public SomeClass() {}
     public GameObject GetRandomGameObject() {
         return objects[Random.Range(0, objects.Length)];
     }
 }
 [System.Serializable]
 public class SomeClassContainer{
     public SomeClass[] types;
     public SomeClassContainer() {}
     public GameObject PickRandomType(string x) {
         if (x == "top") {
             return types[6].GetRandomGameObject ();
         } 
         return null;
     }
 }
 [System.Serializable]
 public class ArrayManager : MonoBehaviour {
 
     public SomeClassContainer blue;
     public SomeClassContainer red;
     public SomeClassContainer yellow;
 
     public SomeClassContainer GetBlue() {return null;}
     public SomeClassContainer GetRed() {return null;}
     public SomeClassContainer GetYellow() {return null;}
 }
 
               and here i call the class method to instantiate the random object: using UnityEngine; using System.Collections;
 public class Spawn : MonoBehaviour {
     
     public GameObject currentObject;
     public Vector3 attachPosition;
     private string x = "top";
     GameObject randomObject;
 
     // Use this for initialization
     void Start () {
         Check ();
     }
     
     // Update is called once per frame
     void Update () {
     }
     void Check(){
         ArrayManager am = GameObject.FindGameObjectWithTag("PiecesManager").GetComponent<ArrayManager>();
         attachPosition = currentObject.transform.FindChild ("attach").transform.position;
         if (currentObject.GetComponent<check> ().top == true) {
             randomObject = am.GetBlue().PickRandomType(x); //here i get the error
             Instantiate(randomObject, attachPosition, randomObject.transform.rotation);
         }
     }
 }
 
               i hope you can help me
Answer by Graham-Dunnett · Jul 15, 2015 at 08:54 PM
You say that line 20 in the second script has the problem. So, it's possible that am is null, meaning the FindGameObjectWithTag() fails to find a GO. (You don't check this in your code.) Alternatively, you call a GetBlue() function. Which is programmed to return null. You then call a PickRandomType() function on this null value. So this line is pretty much designed to cause a problem. 
FindGameObjectWithTag() should work, otherwise it would give me error in line 20 that it doesn't find the getblue function. Without return null the function doesn't work, i have to return something
It definitely is the second suspicion Graham mentioned. You are calling method PickRandomType on a null, therefore null reference exception. You only can call methods on an class instance. Why don't you fix those getters to return the actual color properties ? Also, make sure they are instantiated from code, or assigned from editor (otherwise there would be the same error again):
  public SomeClassContainer GetBlue() {return blue;}
  public SomeClassContainer GetRed() {return red;}
  public SomeClassContainer GetYellow() {return yellow;}
                 thinking of it now, i can't understand how i didn't noticed it.. thank you, it works good now :)
Your answer
 
             Follow this Question
Related Questions
Random array issue C# 2 Answers
Random instantiation endlessly? 1 Answer
Spawn at random? 1 Answer
instantiating at a random time 1 Answer
How to create multiple Characters? 2 Answers