Bhargav Marpu
Bhargav Marpu

Reputation: 296

Multiple instance of Game Object while setting Game object Active

I am newbie to Unity 3D. I have created a game object(A missile) at position x:-1 y:-3 z:0 Added a component script which moves the ball in upward direction. Saved it as a prefab. Then deleted the Game object from the scene.

Component Script used

    using UnityEngine;

    public class Missile : MonoBehaviour
    {
        [SerializeField] protected Rigidbody2D rb;
        public float speed = 4;


    void Start()
    {
        Invoke("Object", 2.0f);
    }

    void Object()
    {

        float x = Random.Range(-2.0f, 2.0f);
        float y = -5.0f;

        rb.MovePosition(new Vector3(x, y, 0));
        Debug.Log("Position of Rigid Body: " + rb.position);
        rb.velocity = Vector2.up * speed;
    }

    virtual protected void Die()
    {
        Destroy(gameObject);
    }

}

Invoked a script which takes prefab as input parameter and spawns the Game object at random position & moves up as per the script component of missile. I need the missile to trigger at random location, but the missile is getting triggered both at position x:-1 y:-3 z:0(Game object position) & some random location. How can I avoid the Game object position while spawning

Script used to invoke the prefabs

    using UnityEngine;
    using System.Collections;
    using TMPro;

    public class MissileSpawnner : MonoBehaviour
    {
        [SerializeField] GameObject[] missilePrefabs;
        [SerializeField] int missileCount;
        [SerializeField] float spawnDelay;
        GameObject[] missiles;




    #region Singleton class: MissileSpawnner 

    public static MissileSpawnner Instance;

    void Awake()
    {
        Instance = this;
    }

    #endregion

    void Start()
    {
        PrepareMissiles();
        StartCoroutine(SpawnMissiles());
    }

    IEnumerator SpawnMissiles()
    {
        for (int i = 0; i < missileCount;i++)
        {
            Debug.Log("Object set as active");
            missiles[i].SetActive(true);
            yield return new WaitForSeconds(spawnDelay);
        }
    }

    void PrepareMissiles()
    {
        missiles = new GameObject[missileCount];
        int prefabsCount = missilePrefabs.Length;
        for (int i = 0; i < missileCount; i++)
        {
            missiles[i] = Instantiate(missilePrefabs[Random.Range(0, prefabsCount )]);
            missiles[i].SetActive(false);
        }
    }

}

Upvotes: 1

Views: 57

Answers (1)

vasmos
vasmos

Reputation: 2586

Change this:

        missiles[i] = Instantiate(missilePrefabs[Random.Range(0, prefabsCount )]);

to

        missiles[i] = Instantiate(missilePrefabs[Random.Range(0, prefabsCount )], <vector3position>, <quaternionrotation>);

and you will specify its position and rotation, just replace vector3position with a vector3 of your choosing and quaternionrotation with a quaternion rotation of your choosing. You can use Quaternion.Identity if you don't want any rotation. You can also add a parent if you choose as well.

        missiles[i] = Instantiate(missilePrefabs[Random.Range(0, prefabsCount )], <vector3position>, <quaternionrotation>, <transformparent>);

Just replace transformparent with the gameobject you want to be the parent of the bullet, if this override can prove useful to you.

More reading on Object.Instantiate

https://docs.unity3d.com/ScriptReference/Object.Instantiate.html

Upvotes: 1

Related Questions