从列表和场景中删除最后一个实例化的GameObject

时间:2015-07-14 16:39:28

标签: c# list unity3d instantiation

所以我错过了一些对某些人来说可能非常简单的事情,但我遇到了麻烦。我创建了一个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

2 个答案:

答案 0 :(得分:1)

似乎你的问题是当你想要摆脱它时,你有一个GameObject并不会消失。我不知道你在这里显示的代码是如何工作的,但你似乎有可能从列表中删除对象,这对你的场景没有任何影响,因为{{ 1}}仍然作为场景的一部分存在。只是从列表中删除它默认情况下对它没有任何影响。从列表中删除后,尝试在对象上调用GameObject

Destroy

答案 1 :(得分:1)

此处的代码不会在对象上调用Destroy()。从列表中删除它并不会使它消失,因为Unity会跟踪所有游戏对象,而不管你做了什么。 Destroy()Instantiate()是从游戏中删除或添加游戏对象的方法。