x


Instantiate Object with Specific Values

Hi Everyone,

I've been trying for a while now to figure this out but I'm stumped. I'm trying to instantiate a group of objects each with random values for certain properties (Ex. larger scale, faster move speed, etc). This script works for the most part but the values only get increased on the original object, not any of the instances. If I run this script as is, I get a NullReferenceExpection error. The issue is how to access the variables in instanced objects individually, rather than globally.

//Variables for Minimun and Maximum emit rates
static var emitRateMin : float = 1.0;
static var emitRateMax : float = 2.0;

var enemyCube : GameObject;

function Start () {

while (true){

The "moveForward" script is attached to every enemy object, this script controls the speed the object moves at. It will eventually be updated to include health, armor and scale. All of which should be randomly generated. The moveForward script contains a variable called moveSpeed.

    var script : moveForward;

    yield WaitForSeconds(Random.Range(emitRateMin,emitRateMax));

    var newEnemy = Instantiate (enemyCube, transform.TransformPoint(Vector3(Random.Range(-9, 9), 0, 0)), Quaternion.Euler(0, Random.Range(80, 100), 0));

This line is causing the problem I think. Instead of modifying the moveSpeed variable of each instance, it modifies the variable of the original object only. This value keeps going up and up with each new object instantiated. The instances are unchanged.

       script.moveSpeed += Random.Range(-0.5,2);

    }

}

Full script without comments:

    static var emitRateMin : float = 1.0;
    static var emitRateMax : float = 2.0;

    var enemyCube : GameObject;

    function Start () {

    while (true){

       var script : moveForward;

       yield WaitForSeconds(Random.Range(emitRateMin,emitRateMax));

       var newEnemy = Instantiate (enemyCube, transform.TransformPoint(Vector3(Random.Range(-9, 9), 0, 0)), Quaternion.Euler(0, Random.Range(80, 100), 0));

           script.moveSpeed += Random.Range(-0.5,2);

        }

    }
more ▼

asked Oct 18 '11 at 09:46 PM

OtsegoDoom gravatar image

OtsegoDoom
3 7 7 10

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

Something like this:

var newEnemy = Instantiate (enemyCube, transform.TransformPoint(Vector3(Random.Range(-9, 9), 0, 0)), Quaternion.Euler(0, Random.Range(80, 100), 0));
script = newEnemy.GetComponent(moveForward);
script.moveSpeed += Random.Range(-0.5,2);
more ▼

answered Oct 18 '11 at 11:49 PM

DaveA gravatar image

DaveA
26.4k 151 171 256

That worked perfectly, and the best part is I understand what's going on. Thank you!

Oct 19 '11 at 01:27 AM OtsegoDoom

This doesn't work. I get the error : 'GetComponent' is not a member of UnityEngine.Object

So how did this ever work - if 'Instantiate' returns a Object not a GameObject!?

Mar 30 '12 at 08:28 AM zv_odd
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x1668
x394

asked: Oct 18 '11 at 09:46 PM

Seen: 773 times

Last Updated: Mar 30 '12 at 08:28 AM