【问题标题】:ArgumentOutOfRangeException when trying to remove/destroy GameObject from List and Scene尝试从列表和场景中删除/销毁游戏对象时出现 ArgumentOutOfRangeException
【发布时间】:2015-07-19 06:04:59
【问题描述】:

这是对与我之前发布的主题不同的问题的跟进。

我正在尝试从列表中删除 GameObject 并随后将其从现场销毁,但我在这样做时遇到了麻烦。当我点击屏幕上的删除按钮时,出现错误:

ArgumentOutOfRangeException:参数超出范围。参数名称:索引

System.Collections.Generic.List'1[UnityEngine.GameObject].get_Item(Int32 索引)(位于 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System. Collections.Generic/List.cs:633)

InstantiateSymbol.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)(在 Assets/_Scripts/InstantiateSymbol.cs:58)

UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler 处理程序,UnityEngine.EventSystems.BaseEventData eventData)(在 /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)

UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject 目标,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.EventFunction'1 函子)(在 /Users/builduser/buildslave/unity/build/Extensions/ guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269)

UnityEngine.EventSystems.EventSystem:Update()

我该如何解决这个问题?

public string prefabPath;

List<GameObject> msgSymbols = new List<GameObject>();
Vector3 symbolPos = new Vector3(0, 0, 0);
GameObject currentChar;
GameObject msgPanel;
Vector3 symbolScale = new Vector3(1.0f, 1.0f, 1.0f);

GameObject[] charKeys;
GameObject deleteKey;

void Start()
{
    msgPanel = GameObject.FindGameObjectWithTag("MessagePanel");
    charKeys = GameObject.FindGameObjectsWithTag("SymbolKey");
    deleteKey = GameObject.FindGameObjectWithTag("DeleteKey");
}

#region IPointerClickHandler implementation

public void OnPointerClick (PointerEventData eventData)
{
    if (transform.CompareTag("SymbolKey"))
    {
        // Load a GameObject into the msgSymbols List
        // and store the last character added in a variable (lastChar)

        msgSymbols.Add((GameObject)Resources.Load(prefabPath));         
        currentChar = msgSymbols.Last<GameObject>();    

        // Instantiate the last character (lastChar) added to msgSymbols List

        GameObject symbol = Instantiate(currentChar, symbolPos, Quaternion.identity) as GameObject;

        // Define transforms for symbol

        symbol.transform.SetParent(msgPanel.transform);
        symbol.transform.localScale = symbolScale;

        Debug.Log(msgSymbols.Count);
    }

    if (transform.CompareTag("DeleteKey"))
    {
        int totalChar = msgPanel.transform.childCount;
        Debug.Log (totalChar);

        GameObject charToDestroy = msgSymbols[msgSymbols.Count - 1];
        msgSymbols.RemoveAt(msgSymbols.Count - 1);

        Destroy(charToDestroy);

        Debug.Log(msgSymbols.Count);
    }
}
#endregion

【问题讨论】:

  • msgSymbols 是空的吗?
  • 你试过逐行调试吗?
  • 嗨 Andrew - 上一篇文章中的一位评论者建议打开另一个问题,其中包含确切的堆栈跟踪以及我为获得此异常而采取的步骤。
  • @greyBow GameObject charToDestroy = msgSymbols[msgSymbols.Count - 1]; 行发生错误。当您访问 List&lt;T&gt; 中的项目时,您传递了 index 值。 msdn.microsoft.com/en-us/library/0ebtbkkc(v=vs.110).aspx
  • 在此之前放置一个断点并在调试中运行?那一刻你就能看到一切的价值

标签: c# list indexing unity3d range


【解决方案1】:

问题是您试图从列表中访问元素 -1,这显然是错误的。当 msgSymbols.Count 为 0 时会发生这种情况,那么您实际上是在执行 msgSymbolx[0-1],这会引发 ArgumentOutOfRange 异常。

根据您的描述和方法名称,当您已从列表中删除所有游戏对象时,您正在单击“删除”按钮。

.NET 编译器(在统一的情况下是单声道编译器)为 [] 运算符生成名为 get_Item(Int32 index) 的方法,所以这个

msgSymbols[msgSymbols.Count - 1];

内部翻译为

msgSymbols.get_Item(msgSymbols.Count - 1);

这就是该方法的名称出现在堆栈跟踪中的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2022-10-30
    • 2019-12-02
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多