所以我错过了一些对某些人来说可能非常简单的事情,但我遇到了麻烦。我创建了一个List(msgSymbols),每当按下一个按钮(它基本上是一个自定义键盘)时,它会被一个新的GameObject填充,然后被实例化为Grid Layout。
但是,如何删除该列表中的最后一个GameObject并更新网格布局以反映该更改? (比如按键盘上的退格按钮)?我当前拥有的删除键代码是抛出错误:ArgumentOutOfRangeException:参数超出范围。参数名称:index
如何解决此问题?
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;
private int index = 0;
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;
}
if (transform.CompareTag("DeleteKey"))
{
Debug.Log (currentChar);
GameObject toDestroy = msgSymbols[msgSymbols.Count - 1];
msgSymbols.RemoveAt(msgSymbols.Count - 1);
Destroy(toDestroy);
Debug.Log(msgSymbols.Count);
}
}
#endregion
答案 0 :(得分:1)
似乎你的问题是当你想要摆脱它时,你有一个GameObject
并不会消失。我不知道你在这里显示的代码是如何工作的,但你似乎有可能从列表中删除对象,这对你的场景没有任何影响,因为{{ 1}}仍然作为场景的一部分存在。只是从列表中删除它默认情况下对它没有任何影响。从列表中删除后,尝试在对象上调用GameObject
。
Destroy
答案 1 :(得分:1)
此处的代码不会在对象上调用Destroy()。从列表中删除它并不会使它消失,因为Unity会跟踪所有游戏对象,而不管你做了什么。 Destroy()
和Instantiate()
是从游戏中删除或添加游戏对象的方法。