Problem setting the parent.

Hi,

I have a problem setting the parent of an instiated prefab.
I am working on a random weapon generator, like the one from Borderlands. When I create a weapon, it creates an empty game object prefab, with the following script attached to it, and a rigidbody. The problem is that I get an NullReference when I try to parent the weapon-part prefabs. These are just models with a collider. Any ideas or hints how I can do this? Thanks in advance! PS. I am not a great programmer, just a beginner.

using UnityEngine;
using System.Collections;

public class Creator : MonoBehaviour {

	public Transform weaponBodyPref1;
	public Transform weaponBodyPref2;
	public GameObject weaponBody;

	public Transform weaponGripPref1;
	public Transform weaponGripPref2;
	public GameObject weaponGrip;
	
	public Transform weaponBarrelPref1;
	public Transform weaponBarrelPref2;
	public GameObject weaponBarrel;
	
	public Transform weaponStockPref1;
	public Transform weaponStockPref2;
	public GameObject weaponStock;
	
	public Transform weaponMagPref1;
	public Transform weaponMagPref2;
	public GameObject weaponMag;
	
	public Transform weaponSightPref1;
	public Transform weaponSightPref2;
	public GameObject weaponSight;
	
	
	// Use this for initialization
	void Start () 
	{
		createModel();
	}
	
	
	// Update is called once per frame
	void Update () 
	{
		
	}
	
	void createModel()
	{
		//Location
		Vector3 WeapLoc = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z);
		
		//Weapon Barrel
		int weaponBarrelRarity = Random.Range(0, 100);
		
		if(weaponBarrelRarity >= 0 && weaponBarrelRarity <= 29)
		{
			weaponBarrel = Instantiate(weaponBarrelPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Barrel 1");
		}
		else if(weaponBarrelRarity >= 30 && weaponBarrelRarity <= 100)
		{
			weaponBarrel = Instantiate(weaponBarrelPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Barrel 2");
		}
		
		//Weapon Body
		int weaponBodyRarity = Random.Range(0, 100);
		
		if(weaponBodyRarity >= 0 && weaponBodyRarity <= 29)
		{
			weaponBody = Instantiate(weaponBodyPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Body 1");
		}
		else if(weaponBodyRarity >= 30 && weaponBodyRarity <= 100)
		{
			weaponBody = Instantiate(weaponBodyPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Body 2");
		}
		
		//Weapon Grip
		int weaponGripRarity = Random.Range(0, 100);
		
		if(weaponGripRarity >= 0 && weaponGripRarity <= 29)
		{
			weaponGrip = Instantiate(weaponGripPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Grip 1");
		}
		else if(weaponGripRarity >= 30 && weaponGripRarity <= 100)
		{
			weaponGrip = Instantiate(weaponGripPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Grip	2");
		}
		
		//Weapon Stock
		int weaponStockRarity = Random.Range(0, 100);
		
		if(weaponStockRarity >= 0 && weaponStockRarity <= 29)
		{
			weaponStock = Instantiate(weaponStockPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Stock 1");
		}
		else if(weaponStockRarity >= 30 && weaponStockRarity <= 100)
		{
			weaponStock = Instantiate(weaponStockPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Stock	 2");
		}
		
		//Weapon Mag
		int weaponMagRarity = Random.Range(0, 100);
		
		if(weaponMagRarity >= 0 && weaponMagRarity <= 29)
		{
			weaponMag = Instantiate(weaponMagPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Mag 1");
		}
		else if(weaponMagRarity >= 30 && weaponMagRarity <= 100)
		{
			weaponMag = Instantiate(weaponMagPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Mag 2");
		}
		
		//Weapon Sight
		int weaponSightRarity = Random.Range(0, 100);
		
		if(weaponSightRarity >= 0 && weaponSightRarity <= 29)
		{
			weaponSight = Instantiate(weaponSightPref1, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Sight 1");
		}
		else if(weaponSightRarity >= 30 && weaponSightRarity <= 100)
		{
			weaponSight = Instantiate(weaponSightPref2, WeapLoc, Quaternion.identity) as GameObject;
			Debug.Log("Sight 2");
		}
		
		GameObject mainWeap = GameObject.Find("newSMG(clone)");
		weaponBody.gameObject.transform.parent = mainWeap.gameObject.transform;
		weaponGrip.gameObject.transform.parent = mainWeap.gameObject.transform;
		weaponMag.gameObject.transform.parent = mainWeap.gameObject.transform;
		weaponBarrel.gameObject.transform.parent = mainWeap.gameObject.transform;
		weaponStock.gameObject.transform.parent = mainWeap.gameObject.transform;
		weaponSight.gameObject.transform.parent = mainWeap.gameObject.transform;
		
	
	}
}

I have updated the script to the most recent version (added all the weapon parts and tried various methods for the parenting), but I still can’t figure out the answer. Please help me out!

Do you get the debugs "Body X" and "Grip X" ? I suspect you never actually enter those and weaponBody/weaponGrip are null

I indeed do not get the debugs. However, the actual prefabs do get created, with colliders and everything. But yet it gives me the Null Reference,

1 Answer

1

Maby try gameObject.transform?

I have tried it, but still no good. I have also tried this.gameObject.transform and this.transform, but those work neither.