使用bool

时间:2018-01-27 14:06:08

标签: c# unity3d unity5

这是脚本。我希望每次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;

}

谢谢。

2 个答案:

答案 0 :(得分:1)

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增加或减少,但不同时执行这两项操作。

答案 1 :(得分:0)

只需使用Instantiate的返回值,并将每个Instance放入一个y位置为键的Dictionary中 - 在实例化之前检查这个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坐标。

如果你不需要Instance-GameObject,你可以简单地使用你实例化的Hashset<int>个y位置。字典和Hashsets都有非常快速的O(1)Key Lookups,将一个ref存储到你的Instanciated对象,占用的空间不多,在这里更容易检索然后通过搜索(如果你根本不需要它们)