为空时跳过数组
skipping an array when it is null
我的 2d 游戏中有数组列表中的对象。这些对象实例化游戏中的其他对象。实例化哪些是基于随机的。但是,这些可能会在游戏过程中被破坏。代码仍然试图寻找被破坏的 Transform,所以我告诉它只在数组不为 null 时从数组实例化,修复错误消息。尽管如此,这种行为仍然存在。由于其中一个数组每隔设定的秒数生成一个游戏对象,它仍然可以决定从一个空数组生成。当它随机选择一个为 null 的数组时,有一个时间段让游戏不得不坐等事情发生,这当然是不能接受的。我如何告诉游戏当一个数组为空时,跳过它并转到下一个数组,以摆脱游戏中的等待时间?我也知道 void 没有 return 任何东西。它只是脚本末尾的占位符,因为我不能输入 break 或 continue,因为它不是 for 循环。我之前发布了这个,一旦错误消息消失,我认为它就结束了。很抱歉第二次发帖。提前致谢。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
public class podControl : MonoBehaviour {
public Transform [] spawns;
public float spawnTime = 6f;
public float secondSpawnTime = 3f;
public GameObject podPrefab;
void Start ()
{
InvokeRepeating ("landingPod", spawnTime, secondSpawnTime);
}
void landingPod ()
{
int spawnIndex = Random.Range (0, spawns.Length);
if (spawns[spawnIndex] != null) {
Instantiate (podPrefab, spawns [spawnIndex].position, spawns [spawnIndex].rotation);
}
else {
if (spawns [spawnIndex] = null)
return;
}
}
}
您可以在 Instantiate
之前继续寻找有效的产卵:
void landingPod()
{
int spawnIndex = Random.Range(0, spawns.Length);
while(spawns[spawnIndex] == null)
{
spawnIndex = Random.Range(0, spawns.Length);
}
Instantiate(podPrefab, spawns[spawnIndex].position, spawns[spawnIndex].rotation);
}
你在做 return 的地方有这个:
if (spawns[spawnIndex] = null)
通过仅使用 =
而不是 ==
你不是在验证它是否为 null 而是给这个 spawns[spawnIndex]
空值。
不要将数组位置设置为空,而是用最后一项填充它们并跟踪数组中的项目计数。
public Transform [] spawns;
private int spawnsCount;
// Index must be in the range [0 ... spawnsCount - 1] and spawnsCount > 0.
public DeleteSpawnAt(int index)
{
spawnsCount--;
spawns[index] = spawns[spawnsCount];
spawns[spawnsCount] = null;
}
在 0 到 spawnsCount - 1 的范围内,您将始终拥有非空转换。所有 null
条目都将位于数组的末尾。
然后用
创建一个索引
int spawnIndex = Random.Range (0, spawnsCount);
删除"D":
+-----------------------+
| |
V |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | E | F | G | H | I | J | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|<--|
spawnCount--
之后:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | J | E | F | G | H | I | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
我的 2d 游戏中有数组列表中的对象。这些对象实例化游戏中的其他对象。实例化哪些是基于随机的。但是,这些可能会在游戏过程中被破坏。代码仍然试图寻找被破坏的 Transform,所以我告诉它只在数组不为 null 时从数组实例化,修复错误消息。尽管如此,这种行为仍然存在。由于其中一个数组每隔设定的秒数生成一个游戏对象,它仍然可以决定从一个空数组生成。当它随机选择一个为 null 的数组时,有一个时间段让游戏不得不坐等事情发生,这当然是不能接受的。我如何告诉游戏当一个数组为空时,跳过它并转到下一个数组,以摆脱游戏中的等待时间?我也知道 void 没有 return 任何东西。它只是脚本末尾的占位符,因为我不能输入 break 或 continue,因为它不是 for 循环。我之前发布了这个,一旦错误消息消失,我认为它就结束了。很抱歉第二次发帖。提前致谢。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
public class podControl : MonoBehaviour {
public Transform [] spawns;
public float spawnTime = 6f;
public float secondSpawnTime = 3f;
public GameObject podPrefab;
void Start ()
{
InvokeRepeating ("landingPod", spawnTime, secondSpawnTime);
}
void landingPod ()
{
int spawnIndex = Random.Range (0, spawns.Length);
if (spawns[spawnIndex] != null) {
Instantiate (podPrefab, spawns [spawnIndex].position, spawns [spawnIndex].rotation);
}
else {
if (spawns [spawnIndex] = null)
return;
}
}
}
您可以在 Instantiate
之前继续寻找有效的产卵:
void landingPod()
{
int spawnIndex = Random.Range(0, spawns.Length);
while(spawns[spawnIndex] == null)
{
spawnIndex = Random.Range(0, spawns.Length);
}
Instantiate(podPrefab, spawns[spawnIndex].position, spawns[spawnIndex].rotation);
}
你在做 return 的地方有这个:
if (spawns[spawnIndex] = null)
通过仅使用 =
而不是 ==
你不是在验证它是否为 null 而是给这个 spawns[spawnIndex]
空值。
不要将数组位置设置为空,而是用最后一项填充它们并跟踪数组中的项目计数。
public Transform [] spawns;
private int spawnsCount;
// Index must be in the range [0 ... spawnsCount - 1] and spawnsCount > 0.
public DeleteSpawnAt(int index)
{
spawnsCount--;
spawns[index] = spawns[spawnsCount];
spawns[spawnsCount] = null;
}
在 0 到 spawnsCount - 1 的范围内,您将始终拥有非空转换。所有 null
条目都将位于数组的末尾。
然后用
创建一个索引int spawnIndex = Random.Range (0, spawnsCount);
删除"D":
+-----------------------+
| |
V |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | E | F | G | H | I | J | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|<--|
spawnCount--
之后:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | J | E | F | G | H | I | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+