如何在同一位置上一个接一个地实例化2个对象

时间:2018-11-18 12:49:32

标签: c# unity3d

我想实例化一个预制件,然后在由Unity中的随机数生成器随机选择的同一位置的另一个预制件之前实例化,但是当我启动它时,它将在不同位置创建第一个预制件。我想我应该更改spawnIndex的范围,但是它不允许我将其放在所有内容之上。这是我的代码:

window

1 个答案:

答案 0 :(得分:4)

您发布的代码有几个错误:

  1. 首先,您对int a的声明必须在Startawake上,但不能在类构造函数中,否则您将得到一个错误,也不会需要2个变量来完成所需的操作,因此我删除了int a,并为所有内容使用了相同的索引“ spawnIndex”。
  2. 第二,如果要避免将来可能出现的错误,建议您将随机范围的值设为静态值或至少一个变量,不要使用“硬编码”,如果使用大于4个生成点? ->错误
  3. 正如您所说,您使用的是不同的随机数,但是您想使用SAME随机数,因此每个效果和硬币都会在一起。然后使用相同的变量(您是对的,这是一个范围问题)。

因此,如果我们应用我提到的所有更改,则结果代码将为:

using UnityEngine;

public class Test : MonoBehaviour {

    public Transform[] SpawnPoints;
    public Transform[] EffectPoints;


    public float spawnTime = 1.5f;
    public float effectSpawnTime = 1f;

    public GameObject Coins;
    public GameObject Effect;

    int spawnIndex = 0;
    int maximumRandomRange = 0;
    // Use this for initialization
    void Start()
    {
        //Initialize the variable
        spawnIndex = Random.Range(0, maximumRandomRange);
        maximumRandomRange = SpawnPoints.Length; //or EffectPoints.Length, as they got the same

        InvokeRepeating("SpawnParticle", effectSpawnTime, effectSpawnTime);
        InvokeRepeating("SpawnCoins", spawnTime, spawnTime);
    }

    void SpawnCoins()
    {
        Instantiate(Coins, SpawnPoints[spawnIndex].position, SpawnPoints[spawnIndex].rotation);
    }
    void SpawnParticle()
    {
        spawnIndex = Random.Range(0, maximumRandomRange); //You only need to call it here again, as it is the function which is called faster
        Instantiate(Effect, EffectPoints[spawnIndex].position, EffectPoints[spawnIndex].rotation);
    }

}