这是脚本。我希望每次 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( 键查找,存储对你的实例化对象的引用占用的空间不大,在这里更容易检索,然后通过搜索(如果你需要它们的话(