如何跳过unity中的元素

How to skip the element in unity


问题

我有这个函数

    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,比如说。

我设法得到了被选中的字符ID,但由于元素在此刻被从列表中删除,被选中的字符ID总是0;

enter image description here

我需要保持列表中的元素,如图所示,我可以得到哪个字符被选中的信息。

enter image description here

我怎样才能跳到下一个可用的元素?

如果我做错了什么,请告诉我,我正在学习。

derHugo上次帮我删除了元素。

答案1

那么你是想删除它们还是只跳过它们?如果你删除它们,为什么要关心索引呢?当然,在删除前几个元素后,你剩下的最后一个元素会从索引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;
}
我非常感谢你的帮助。我关心索引,因为我用它来决定当角色被选中时,哪些项目应该出现在下一个场景中。 你的脚本在有2-3个可用元素(角色)和没有元素的情况下工作得很好。但是如果我只有一个角色(元素),代码就会卡在这里。 characters[selectedCharacter].SetActive(false); 因为它试图访问不存在的元素。因为我仍然需要按下一个按钮来使字符出现在屏幕上。
它不应该被卡住,而应该简单地保持相同的字符被启用......在 characters[0].SetActive(false); 之后,你会在循环中做一个精确的迭代,再次得到 selectedCharacter = 0; ,所以你会做 characters[0].SetActive(true);
相同问题还可以参考: How to skip the element in unity