【发布时间】: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<T>中的项目时,您传递了index值。 msdn.microsoft.com/en-us/library/0ebtbkkc(v=vs.110).aspx -
在此之前放置一个断点并在调试中运行?那一刻你就能看到一切的价值
标签: c# list indexing unity3d range