这是脚本。我希望每次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;
}
谢谢。
答案 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对象,占用的空间不多,在这里更容易检索然后通过搜索(如果你根本不需要它们)