设置游戏对象活动时,游戏对象的多个实例。

问题描述 投票:0回答:1

我是Unity 3D的新手。我已经创建了一个游戏对象(导弹),位置为 x:-1 y:-3 z:0 添加了一个组件脚本,使球向上移动。将其保存为预制件。然后从场景中删除游戏对象。

使用的组件脚本

    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);
    }

}

调用了一个脚本,它将预制件作为输入参数,并在随机位置生成游戏对象&按照脚本中的导弹组件向上移动。我需要导弹在随机位置触发,但导弹在位置和位置上都被触发了。x:-1 y:-3 z:0游戏对象位置)&一些随机的位置。如何避免游戏对象的位置,而产生

用于调用预制件的脚本

    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);
        }
    }

}
c# unity3d unityscript
1个回答
0
投票

改变这个。

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

改成

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

并指定它的位置和旋转,只需将 vector3position 替换为你选择的 vector3,将 quaternionrotation 替换为你选择的 quaternion rotation。如果你不想要任何旋转,你可以使用Quaternion.Identity。如果你也可以选择添加一个父函数。

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

只要用你想成为子弹父体的gameobject替换transformparent即可,如果这个覆盖能证明对你有用的话。

更多关于Object.Instantiate的阅读

https:/docs.unity3d.comScriptReferenceObject.Instantiate.html。

© www.soinside.com 2019 - 2024. All rights reserved.