使用 bool 阻止对象在更新中多次实例化



这是脚本。我希望每次 y 位置是 4 的倍数时,对象只实例化一次。但是,只要 y 位置停留在 4,该对象就会被实例化多次。我只想让它实例化一次。这是脚本。

public GameObject obj;
bool check = true;

private void Update()
{
    if (Mathf.Round(transform.position.y) % 4 == 0 && check)
    {
        check = false;
        Spawn();
    }
}
public void Spawn()
{
    Instantiate(obj, new Vector3(transform.position.x, transform.position.y), Quaternion.identity);
    check = true;
}

谢谢。

单个bool是不够的,因为您希望多次实例化一个对象。您要检查它是否已在此位置实例化。

  public GameObject obj;
  float lastInstPos = 0;

    private void Update()
    {
        var currPos = Mathf.Round(transform.position.y);
        if (currPos % 4 == 0 && currPos != lastInstPos)
        {
            lastInstPos = currPos;
            Spawn();
        }
    }
    public void Spawn()
    {
        Instantiate(obj, new Vector3(transform.position.x, transform.position.y), Quaternion.identity);
    }

如果要包含0,则使lastInstPos任意,例如 lastInstPos = float.MinValue

更新:此解决方案假定y增加或减少,但不会同时执行这两项操作。

只需使用 Instance 的返回值,并将每个实例放入一个以 y 位置为键的字典中 - 在初始化之前检查这个 y 位置是否已经是字典中的键:

public GameObject obj;
private Dictionary<int, GameObject> myInst = new Dicitionary<int, GameObject>();

private void Update()
{
    int pos = (int)Mathf.Round(transform.position.y);
    if (pos % 4 == 0 && !myInst.ContainsKey(pos)) // check if key exists
    {
        myInst[pos] = Spawn();  // add gameObject to dictionary 
    }
}
// return the gameObject you spawned
public GameObject Spawn()
{
    return Instantiate(obj, new Vector3(transform.position.x, transform.position.y), Quaternion.identity);
}

这样你就知道每个实例化对象的确切 y 坐标。

如果您也不需要实例游戏对象,则可以简单地使用您实例化的 y 位置Hashset<int>即可。字典和哈希集都有非常快的 O(1( 键查找,存储对你的实例化对象的引用占用的空间不大,在这里更容易检索,然后通过搜索(如果你需要它们的话(

最新更新