【问题标题】:Deleting the last Instantiated GameObject from a List and Scene从列表和场景中删除最后一个实例化的游戏对象
【发布时间】:2015-07-14 16:39:28
【问题描述】:

所以我错过了一些对某些人来说可能非常简单的东西,但我遇到了麻烦。我创建了一个列表(msgSymbols),每次按下按钮时都会填充一个新的游戏对象(它基本上是一个自定义键盘),然后实例化为网格布局。

但是我如何只删除该列表中的最后一个游戏对象并更新网格布局以反映该更改? (比如按下键盘上的退格键)?我目前拥有的删除键代码抛出错误:ArgumentOutOfRangeException: Argument is out of range。参数名称:索引

我该如何解决这个问题?

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

【问题讨论】:

    标签: c# list unity3d instantiation


    【解决方案1】:

    您的问题似乎是您有一个GameObject,当您想摆脱它时它不会消失。我不知道您未在此处显示的代码是如何工作的,但您似乎有可能从列表中删除该对象,这对您的场景没有任何影响,因为 GameObject 仍然作为一部分存在现场。默认情况下,将其从列表中删除不会对其产生任何影响。将对象从列表中移除后,尝试在对象上调用Destroy

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

    【讨论】:

    • 感谢您的信息!我已经更新了上面的代码以反映您的更改。现在当我按下删除键时出现错误:ArgumentOutOfRangeException: Argument is out of range。参数名称:index 和 Debug.Log(msgSymbols.Count) 只是返回一个 'null' 我该如何解决这些问题?
    • 当您在列表中没有任何内容时您是否按删除?您必须为此进行一些特殊处理。否则,我不确定。尝试调试您的程序。如果您无法从那里解决问题,我建议您使用确切的堆栈跟踪以及您为获得此异常而采取的步骤打开另一个问题。
    【解决方案2】:

    这里的代码没有在对象上调用 Destroy()。从列表中删除它并不会让它消失,因为 Unity 会跟踪所有游戏对象,而与您所做的任何事情无关。 Destroy()Instantiate() 是从游戏中移除或添加游戏对象的方法。

    【讨论】:

    • 对,错过了。我已经更新了要添加销毁的代码,但我仍然收到错误:ArgumentOutOfRangeException: Argument is out of range。参数名称:索引。我该如何解决这个问题?
    • 是来自msgSymbols.RemoveAt(msgSymbols.Count - 1)吗?您可能只想在lateUpdate() 步骤中重建您的列表,删除任何已变为空的游戏对象引用
    • 好的,所以我应该把 msgSymbols.RemoveAt(msgSymbols.Count - 1) 放在 LateUpdate 中?我应该在里面放什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多