Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用bool停止对象在更新中多次实例化_C#_Unity3d_Unity5 - Fatal编程技术网

C# 使用bool停止对象在更新中多次实例化

C# 使用bool停止对象在更新中多次实例化,c#,unity3d,unity5,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();

这是剧本。我希望每次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
增加或减少,但不同时增加或减少。

只需使用Instantiate的返回值,并将每个实例放入一个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);
}
公共游戏对象obj;
私有字典myInst=新的Dictionary();
私有void更新()
{
int pos=(int)Mathf.Round(transform.position.y);
if(位置%4==0&&!myInst.ContainsKey(位置))//检查键是否存在
{
myInst[pos]=Spawn();//将游戏对象添加到字典
}
}
//返回您生成的游戏对象
公共游戏对象生成()
{
返回实例化(obj,新向量3(transform.position.x,transform.position.y),四元数.identity);
}
这样,您就可以知道每个实例化对象的确切y坐标


如果您不需要实例GameObject,只需实例化y位置的
哈希集即可。Dictionary和Hashset都有非常快速的O(1)键查找,存储对实例化对象的引用不会占用太多空间,而且通过搜索(如果您需要的话)更容易在此处检索。

谢谢您,但我有另一个解决方案。当位置不是4的倍数时,简单地输入check=true!那很好!如果游戏启用“上下”功能,您将在同一y坐标上实例化多个对象