首先感謝您的時間,我對我的英語和我的低技能感到抱歉。基本上我在做這個無盡的跑步者,玩家向前移動并跳過東西。為了讓它永無止境,我制作了一個腳本,在我附加到腳本的那些之間隨機選擇一個預制件,并在之前生成的另一個平臺的位置(使用空物件)的末尾生成它。要在輸掉比賽后重置游戲,我需要洗掉所有生成并保存在串列中的平臺,但我的問題是腳本每隔一段時間會跳過其中一個,導致它在重置和重新啟動后保留。這是我的代碼:
public void Reset()
{
deathMenu.gameObject.SetActive(false);
for (int i = 0; i < generatore.getPooled().Count; i )
{
if (generatore.getPooled()[i] == null)
{
i ;
}
else
{
generatore.getPooled()[i].gameObject.SetActive(false);
if (!generatore.getPooled()[i].gameObject.activeInHierarchy)
{
Destroy(generatore.getPooled()[i].gameObject);
}
if (i > 0)
{
if (generatore.getPooled()[i - 1] == null && generatore.getPooled()[i 1] == null)
{
Destroy(generatore.getPooled()[i].gameObject);
}
}
}
}
player.transform.position = playerStartPoint;
generatore.SetEndPosition(endPosition);
player.gameObject.SetActive(true);
scoreManager.scoreCounter = 0;
scoreManager.scoreIncrease = true;
}
它基本上獲取串列的平臺(generatore.getPooled()),將它們設定為非活動狀態,然后將它們一一洗掉。我不得不在洗掉它們之前將它們設定為非活動狀態,因為出于某些原因,如果我只洗掉它們,它會跳過更多平臺,我什至試圖通過添加以下內容來洗掉腳本跳過的平臺:
if (generatore.getPooled()[i - 1] == null && generatore.getPooled()[i 1] == null)
{
Destroy(generatore.getPooled()[i].gameObject);
}
但它仍然跳過它們。 這就是我的意思
uj5u.com熱心網友回復:
首先,你為什么在回圈內做
i第一個if案例?因為
i在每次迭代后都完成了,所以它不會跳過當前專案,而是跳過下一個專案!你寧愿使用continue。然后你反復打電話
generator.getPooled()它總是回傳一個新串列(我猜)。這不僅是糟糕的性能,而且當您從池中洗掉條目時(我想在您銷毀它們時會發生某處)所有其他專案很可能會向上移動一步,從而更改它們的索引。因此,由于您不斷增加索引,
i因此可能會發生一個元素被移動到您已經通過的索引,因此這再次導致跳過其中的一些。然后你打電話的條件
Destroy就很多余了。緊隨其后someGameObject.SetActive(false);檢查
if(!someGameObject.activeInHierarchy)將永遠是真的(除非在腳本中發生了一些黑暗魔法,在該腳本中
OnDisable您將自己再次激活 - 這聽起來很不可思議 ^^)。而且由于您無論如何都要銷毀它(參見 3.),實際上根本不需要先將其設定為非活動狀態。
而且由于您將始終銷毀物件(請參閱 3.),因此通過索引進行的下一次檢查沒有任何意義,因為您已經銷毀了該物件。
所以總而言之,你的代碼會縮小到
foreach (var pooled in generatore.getPooled())
{
if (!pooled) continue;
Destroy(pooled.gameObject);
}
// TODO: clear the pool so there are no null elements remaining forever
uj5u.com熱心網友回復:
你可以為你的平臺分配一個特定的標簽
然后嘗試使用 foreach 回圈來銷毀它們,如下所示:
foreach (GameObject platform4delete in
GameObject.FindGameObjectsWithTag("somePlatfromTag"))
{
Destroy(platform4delete);
}
它可能會洗掉所有平臺而不會丟失任何平臺
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351169.html
上一篇:子彈留在原地,但我希望它移動
下一篇:在Unity中,為什么我可以通過按下按鈕將相機切換到WorldView,但不能在使用FaceManager的同時在開始或更新回圈中執行此操作?
