【问题标题】:Multiple instance of Game Object while setting Game object Active将游戏对象设置为活动时的多个游戏对象实例
【发布时间】:2020-07-02 20:51:34
【问题描述】:

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

使用的组件脚本

    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


【解决方案1】:

改变这个:

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

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

您将指定它的位置和旋转,只需将vector3position 替换为您选择的vector3 并将quaternionrotation 替换为您选择的四元数旋转。如果您不想要任何旋转,您可以使用 Quaternion.Identity。如果您愿意,也可以添加父母。

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

只需将 transformparent 替换为您想成为子弹父级的游戏对象,如果此覆盖对您有用。

更多阅读 Object.Instantiate

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多