C# 当数组为空时跳过该数组
我的2d游戏中有一个数组列表中的对象。这些对象实例化游戏中的其他对象。实例化哪些是基于随机的。然而,这些可能会在游戏中被破坏。代码仍然试图查找已破坏的转换,因此我告诉它仅在数组不为null时从数组实例化,从而修复错误消息。不过,这种行为仍然存在。当其中一个数组每隔设定的秒数生成一个游戏对象时,它仍然可以决定从空数组生成。当它随机选择一个空数组时,游戏会有一段时间必须坐下来等待发生什么,这当然是不可接受的。我如何告诉游戏,当一个数组为空时,跳过它并转到下一个数组,以摆脱游戏中的等待期?我也知道void不会返回任何东西。它只是脚本末尾的一个占位符,因为我不能键入break或continue,因为它不是for循环。我之前发布过这篇文章,当错误信息离开后,我认为这就结束了。很抱歉再次发布。提前谢谢C# 当数组为空时跳过该数组,c#,arrays,null,skip,unity2d,C#,Arrays,Null,Skip,Unity2d,我的2d游戏中有一个数组列表中的对象。这些对象实例化游戏中的其他对象。实例化哪些是基于随机的。然而,这些可能会在游戏中被破坏。代码仍然试图查找已破坏的转换,因此我告诉它仅在数组不为null时从数组实例化,从而修复错误消息。不过,这种行为仍然存在。当其中一个数组每隔设定的秒数生成一个游戏对象时,它仍然可以决定从空数组生成。当它随机选择一个空数组时,游戏会有一段时间必须坐下来等待发生什么,这当然是不可接受的。我如何告诉游戏,当一个数组为空时,跳过它并转到下一个数组,以摆脱游戏中的等待期?我也知道vo
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;
}
}
}您只需在实例化它之前继续查找有效的繁殖:
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);
}
你在这里报税:
if (spawns[spawnIndex] = null)
通过只使用
=
而不是=
,您并不是在验证它是否为null,而是给这个生成[spawndex]
空值。而不是将数组位置设置为null,用最后一个项目填充它们,并跟踪数组中的项目计数
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到SpawnScont-1的范围内,您将始终具有非空转换。所有null
条目都将位于数组的末尾
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;
}
然后用
int spawnIndex = Random.Range (0, spawnsCount);
删除“D”:
好了,现在可以了。我不知道您可以将==应用于null,所以我从未想到过。非常感谢。不客气,是的,就像您通过执行
验证它是否为空一样=
您可以使用==
执行相反的操作@JoeClark@JoeClark如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这么做。当然我很乐意这么做。谢谢你给我看绳子,哈哈
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | J | E | F | G | H | I | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+