Удаление последнего созданного игрового объекта из списка и сцены

Так что я упускаю что-то, что, вероятно, довольно просто для некоторых, но у меня проблемы с этим. Я создал список (msgSymbols), который заполняется новым GameObject при каждом нажатии кнопки (это в основном пользовательская клавиатура), которая затем создается в Grid Layout.

Но как тогда удалить только последний GameObject в этом списке и обновить макет сетки, чтобы отразить это изменение? (как нажатие кнопки возврата на клавиатуре)? Код ключа удаления, который у меня сейчас есть, выдает ошибку: ArgumentOutOfRangeException: Аргумент находится вне диапазона. Имя параметра: индекс

Как мне решить это?

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 ответа

Код здесь не вызывает Destroy() для объекта. Удаление его из списка не исключает его, поскольку Unity отслеживает все объекты gameObjects независимо от того, что вы делаете. Destroy() а также Instantiate() способы удалить или добавить gameObjects из игры.

Похоже, ваша проблема в том, что у вас есть GameObject это не уходит, когда вы хотите избавиться от этого. Я не знаю, как работает код, который вы здесь не видите, но кажется возможным, что вы удаляете объект из списка, что никак не влияет на вашу сцену, потому что GameObject все еще существует как часть сцены. Простое удаление из списка не повлияет на него по умолчанию. Попробуйте позвонить Destroy на объект после удаления его из списка.

Debug.Log (lastChar);

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

Debug.Log(msgSymbols.Count);
Другие вопросы по тегам