SortedList<Key, Value>:更改循环内的值时出错,循环遍历列表/Unity,C#

SortedList<Key, Value>: Error while changing the values inside a loop, while looping through the list / Unity, C#

我在为我在 Unity 中制作的游戏编写此功能时遇到问题。我使用 SortedList 来存储我的玩家输入触发器的可交互对象,以及它们与他的距离。我希望他只能与一个物体互动,那个物体离他最近。出于这个原因,我 运行 通过列表并用每帧的新距离更新键的浮点值,然后将对象的 canInteract bool 设置为 true,如果它在列表的索引 0 中,这意味着离玩家最近。

这行得通,但 Unity 向我抛出一个错误,指出我正在更改值,同时它仍在迭代键值对,如下面的屏幕截图所示。

我的代码如下:

public SortedList<GameObject, float> interactablesInRange = new SortedList<GameObject, float>();

public void CheckForInteractableDistance()
    {
        foreach (KeyValuePair<GameObject, float> interactable in interactablesInRange)
        {
            interactablesInRange[interactable.Key] = DistanceChecker(gameObject, interactable.Key);
            Debug.Log(interactable.Key + " distance from player: " + interactable.Value);

            if (interactablesInRange.IndexOfValue(interactable.Value) == 0)
            {
                interactable.Key.GetComponent<WeaponPickup>().canInteract = true;
            }
            else
            {
                interactable.Key.GetComponent<WeaponPickup>().canInteract = false;
            }
        }
    }


public float DistanceChecker(GameObject fromObj, GameObject toObj)
    {
        float distance = Vector3.Distance(fromObj.transform.position, toObj.transform.position);

        return distance;
    }

我正在尝试找到一种方法来避免该错误,同时仍在做同样的事情。有人建议我也许可以用 LINQ 做到这一点,但我不知道如何使用 LINQ 或者这是否可以解决问题,因为我仍然需要在遍历列表时更改值

在查看评论后,我意识到在这种情况下使用 SortedList 并不是必需的,而且我之前使用它的方式是不正确的。

在网上进行更多研究后,我在该线程 (https://answers.unity.com/questions/1408498/sorting-a-list-based-of-a-variable.html) 中发现了一条评论,它基本上回答了我的问题,并在一行代码中使用简单的 LINQ 表达式完成了我想做的事情!

案子告破!如果您想做类似的事情,我 post 下面的代码:


private void SortByDistance()
    {
        foreach (GameObject interactable in interactablesInRange)
        {
            interactable.GetComponent<WeaponPickup>().distanceFromPlayer = DistanceChecker(gameObject, interactable);
        }

        interactablesInRange = interactablesInRange.OrderBy(e => e.GetComponent<WeaponPickup>().distanceFromPlayer).ToList();

    }

之后,如果可交互项是列表索引 [0] 中的游戏对象,我将检查每个可交互项脚本,如果是,我将 canInteract bool 设置为 true。