- Home /
Adding Force to an instantiated object when it spawns?
Hi, having trouble wrapping my head around achieving this:
I'm making a game where there are 4 spawn points on the right side of the screen.
I have an array of objects(1 in it at the moment) I also have an array of spawnpoints (4)
My aim is to have the object move to the left side of the screen slowly until it reaches a trigger.
My current script is below.
My objects instantiate fine, and spawn in the right spots (grabs a random object from the "Junk" Gameobject[] array, spawns it in one of the 4 spawnpoints from the SpawnPoints[] Transform array.
How do I manipulate the spawned object to move in said motion?
I figure I need to make it a rigidbody, and use rigidbody.addforce, but i'm missing something!
The error message is:
SpawnItems.SpawnJunk() (Line 41): NullReferenceException: Object Reference not set to an instance of an object.
What am I forgetting to pass?
"JunkInstance.AddForce (SpawnPoints[spawnindex].forward * 800);"
Junkinstance is our instanced rigidbody. AddForce demands a vector3, Spawnpoints is our transform array, and spawnindex is a stored transform. .forward returns a vector3, so surely I'm not missing anything? 0_O. This isn't making sense to me :|
using UnityEngine;
using System.Collections;
public class SpawnItems : MonoBehaviour {
// indexes Junk into an array
// indexes SpawnPoints into an array
// Spawns random Junk obj from a random SpawnPoint.
// Assign object to move down the lane it spawned in.
public Transform[] SpawnPoints; // array of spawnpoints, linked with transform in editor. this is also beginning of our "lanes".
public float SpawnTime = 1.5f; // time between spawn "waves"
public GameObject[] Junk; // Array of Junk Objects
// Use this for initialization
void Start () {
InvokeRepeating ("SpawnJunk", SpawnTime, SpawnTime);
// invokes SpawnJunk method after $SpawnTime seconds, then again every $SpawnTime seconds.
}
// Update is called once per frame
void Update () {
}
void SpawnJunk()
{
int spawnindex = Random.Range (0, SpawnPoints.Length);
// set index number of the array randomly
int objectIndex = Random.Range (0, Junk.Length);
// object Index = random number in range of between 0 & GameObject[] Junk.Length
Rigidbody JunkInstance;
JunkInstance = Instantiate (Junk[objectIndex], SpawnPoints [spawnindex].position, SpawnPoints [spawnindex].rotation) as Rigidbody;
// Instantiates a random Junk obj to a random spawnpoint, following the spawnpoint's rotation.
JunkInstance.AddForce (SpawnPoints[spawnindex].forward * 800);
// BROKEN!
}
}
Answer by Cherno · May 18, 2015 at 11:36 AM
JunkInstance.AddForce (SpawnPoints[spawnindex].forward * 800);
needs to be
JunkInstance.GetComponent<RigidBody>().AddForce (SpawnPoints[spawnindex].forward * 800);
As you try to use the AddForce function with a GameObject, but you have to use it with a rigidbody that is on a gameobject.
kind of thought the engine would check for an attached rigidbody on said gameobject, but hey , now I know :)
Answer by HTwist · May 18, 2015 at 12:12 PM
The result of the Instantiate method is a GameObject because the object given to it is a GameObject. Casting it with a "as" will be null.
So JunkInstance will always be null.
Either use a array of rigid body or cast to GameObject then get the rigid body component.
^HTwist is right, I didn't even notice that. Instantiate as a gameobject and then use the corrected line from my answer and all will be fine :)
JunkInstance = Instantiate (Junk[objectIndex], SpawnPoints [spawnindex].position, SpawnPoints [spawnindex].rotation) as GameObject;
Your answer
Follow this Question
Related Questions
Instantiate rigidbody C# 1 Answer
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
OnCollisionEnter not being called, between a Rigidbody and a Box Collider 1 Answer