如果我的游戏中的GameObject具有特殊能力它会触发它,但是我希望这个GameObject所影响的所有特殊游戏对象也触发它们的能力,例如如果炸弹击中某些物体,如果这些物体也是炸弹,也触发它们。我通过调用递归处理所有特殊能力的方法会很容易,但是在编程中,没有多少东西像你在开始时想的那么容易。基本上发生的事情是bullcrap的连锁反应导致Unity显示OurOfMemory错误。同时让我的PC完全冻结,同时礼貌地关闭所有屏幕。
问题是,我怎样才能使它触发所有受影响的多维数据集'特殊能力,没有一切疯狂吗?
代码:
//Triggers the cube's special ability, if it has any
private void TriggerSpecialCubeAbility(GameObject specialCube) {
switch (specialCube.tag) {
//Destroy all cubes in a radius from the special cube
case "Bomb":
TriggerBombAbility(specialCube);
break;
//Destroy all cubes of the same color as the special cube
case "Lighting":
TriggerLightingAbility(specialCube);
break;
default:
break;
}
}
private void TriggerBombAbility(GameObject specialCube) {
var nearbyColliders = Physics2D.OverlapCircleAll(specialCube.transform.position, explosionRadius);
Instantiate(particles[0], specialCube.transform.position, specialCube.transform.rotation);
Instantiate(particles[1], specialCube.transform.position, specialCube.transform.rotation);
foreach (var collider in nearbyColliders) {
if (collider.tag == "Indestructible")
return;
var affectedCube = collider.gameObject;
TriggerSpecialCubeAbility(affectedCube);
Destroy(affectedCube);
}
destroySelectedCubes = true;
// Physics2D.gravity *= -1;
// Physics.gravity *= -1;
}
答案 0 :(得分:1)
无限循环会发生什么。 假设炸弹A靠近炸弹B。
您可以通过记住某个对象是否已被触发,然后阻止任何进一步的触发来解决此问题。
bool thisObjectHasBeenTriggered = false;
//Triggers the cube's special ability, if it has any, AND HAS NOT BEEN TRIGGERED YET
private void TriggerSpecialCubeAbility(GameObject specialCube)
{
if (thisObjectHasBeenTriggered)
return;
thisObjectHasBeenTriggered = true;
switch (specialCube.tag)
{
// ...
}
}