我有這個功能
public void RemoveInvalidEntries()
{
characters = characters.Where(c => c).ToArray();
}
public void NextOption()
{
characters = characters.Where(c => c).ToArray();
characters[selectedCharacter].SetActive(false);
selectedCharacter = (selectedCharacter 1) % characters.Length;
characters[selectedCharacter].SetActive(true);
}
這有助于從串列中洗掉元素并跳到下一個字符。
但我不想洗掉我想跳到下一個可用的元素。因為我需要知道所選元素的 id,例如:元素 0、元素 1 或元素 2
我設法獲得了選定的字符 ID,但是由于此時從串列中洗掉了元素,因此選定的字符 ID 始終為 0;

我需要像這張圖片一樣維護串列中的元素,以便我可以獲取選擇了哪個字符的資訊。

如何跳到下一個可用元素?
如果我做錯了一切,請在我學習時告訴我。
上次 derHugo 幫我洗掉了元素。
uj5u.com熱心網友回復:
那么你想洗掉它們還是只跳過它們?如果洗掉它們為什么要關心索引?當然,在洗掉第一個元素后,最后一個剩余元素我從索引 2 移動到索引 0
否則你可以使用例如跳過它們
do
{
selectedCharacter = (selectedCharacter 1) % characters.Length;
}
while(!characters[selectedCharacter])
請記住,這是非常危險的,因為如果根本沒有剩余的有效專案,那么這會凍結您的整個應用程式!
因此,您首先要通過以下方式檢查是否至少有一個有效元素
public void NextOption()
{
if(!characters.Any(c => c))
{
Debug.LogError("No valid objects available!");
return;
}
characters[selectedCharacter].SetActive(false);
do
{
// go one index forward with wrap around
selectedCharacter = (selectedCharacter 1) % characters.Length;
}
// if reached an invalid object repeat the "do" block
while(!characters[selectedCharacter]);
characters[selectedCharacter].SetActive(true);
}
public void BackOption()
{
if(!characters.Any(c => c))
{
Debug.LogError("No valid objects available!");
return;
}
characters[selectedCharacter].SetActive(false);
do
{
// go one index backward with wrap around
selectedCharacter--;
if(selectedCharacter < 0)
{
selectedCharacter = characters.Length;
}
}
// if reached an invalid object repeat the "do" block
while(!characters[selectedCharacter]);
characters[selectedCharacter].SetActive(true);
}
其中characters.Any(c => c)基本上是速記/等于做類似的事情
private bool Any()
{
foreach(var c in characters)
{
if(c) return true;
}
return false;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/369712.html
上一篇:我怎樣才能讓每個NPC在延遲3秒后開始沿著航點移動?
下一篇:向前移動到面部方向
