C# 从游戏对象中移除最后一个子对象

C# 从游戏对象中移除最后一个子对象,c#,list,unity3d,destroy,C#,List,Unity3d,Destroy,我正在为一个触摸屏应用程序创建一个自定义键盘,当按下按钮时,它会输出一个图像。然后,这些图像填充网格布局,以保持事物的线性组织。我需要一个退格按钮。我真的在为退格而挣扎。我很难找到所附代码的问题。当我点击deleteKey按钮时,什么都没有发生,我不确定我哪里出错了,但我希望它删除messagePanel游戏对象中的最后一个子项 List<GameObject> msgSymbols = new List<GameObject>(); public string pref

我正在为一个触摸屏应用程序创建一个自定义键盘,当按下按钮时,它会输出一个图像。然后,这些图像填充网格布局,以保持事物的线性组织。我需要一个退格按钮。我真的在为退格而挣扎。我很难找到所附代码的问题。当我点击deleteKey按钮时,什么都没有发生,我不确定我哪里出错了,但我希望它删除messagePanel游戏对象中的最后一个子项

List<GameObject> msgSymbols = new List<GameObject>();
public string prefabPath;
int msgLength;

Vector3 symbolPos;
GameObject symbolChar;
GameObject msgPanel;
Vector3 symbolScale = new Vector3(1.0f, 1.0f, 1.0f);

GameObject[] symbolKeys;
GameObject deleteKey;

void Awake()
{
    msgPanel = GameObject.FindGameObjectWithTag("MessagePanel");
    symbolKeys = GameObject.FindGameObjectsWithTag("SymbolKey");
    deleteKey = GameObject.FindGameObjectWithTag("DeleteKey");
}

#region IPointerClickHandler implementation

public void OnPointerClick (PointerEventData eventData)
{
    if (transform.CompareTag("SymbolKey"))
    {

        symbolChar = Instantiate(Resources.Load (prefabPath)) as GameObject;    // Instantiate an symbol
        symbolChar.transform.SetParent(msgPanel.transform);                     // Parent it to grid
        symbolChar.transform.localScale = symbolScale;                          // Set scale of all objects added
        symbolPos = symbolChar.transform.position;                              // Find position of objects in grid
        msgLength = msgPanel.transform.childCount;

        foreach(Transform t in msgPanel.transform)                              // Create running list of symbol objects added to messagePanel
        {
            msgSymbols.Add(t.gameObject); 
        }

        Debug.Log (msgLength);
    }

    else if (transform.CompareTag("DeleteKey"))
    {
        if(msgSymbols.Count == 0) return;
        Destroy(msgSymbols.LastOrDefault());

        // Old attempts

        // msgSymbols.RemoveAt(msgLength - 1);
        // Destroy(msgSymbols[msgSymbols.Count-1]);
    }

}
#endregion
List msgSymbols=new List();
公共字符串路径;
内特姆斯格伦特;
矢量3符号;
游戏对象符号字符;
游戏对象msgPanel;
Vector3符号刻度=新Vector3(1.0f、1.0f、1.0f);
GameObject[]符号键;
游戏对象删除键;
无效唤醒()
{
msgPanel=GameObject.FindGameObjectWithTag(“MessagePanel”);
SymbolKey=GameObject.FindGameObjectsWithTag(“SymbolKey”);
deleteKey=GameObject.FindGameObjectWithTag(“deleteKey”);
}
#区域IPoClickHandler实现
公共void OnPointerClick(PointerEventData事件数据)
{
if(transform.CompareTag(“SymbolKey”))
{
symbolChar=实例化(Resources.Load(prefablePath))为GameObject;//实例化一个符号
symbolChar.transform.SetParent(msgPanel.transform);//将其设置为网格的父对象
symbolChar.transform.localScale=symbolScale;//设置添加的所有对象的比例
symbolPos=symbolChar.transform.position;//查找网格中对象的位置
msgLength=msgPanel.transform.childCount;
foreach(msgPanel.Transform中的Transform t)//创建添加到messagePanel的符号对象的运行列表
{
msgSymbols.Add(t.gameObject);
}
Debug.Log(msgLength);
}
else if(transform.CompareTag(“DeleteKey”))
{
if(msgSymbols.Count==0)返回;
销毁(msgSymbols.LastOrDefault());
//旧的尝试
//msgSymbols.RemoveAt(msgLength-1);
//销毁(msgSymbols[msgSymbols.Count-1]);
}
}
#端区

如果计数为0,则索引将为-1,超出索引范围

if(messageSymbols.Count > 0) Destroy(messageSymbols.LastOrDefault());

在删除前检查数组是否至少有1个值:

else if (transform.CompareTag("DeleteKey"))
{
    if(messageSymbols.Count == 0) return;
    Destroy(messageSymbols[messageSymbols.Count-1]);
}

谢谢Fabjan-这消除了超出范围的错误,但它揭示了另一个问题。单击DeleteKey仍然不会从messagePanel中删除最后一个符号字符。我哪里出错了?你能检查一下msgSymbols[msgSymbols.Count-1]上是否有对象吗?msgSymbols似乎总是空的或空的。我不理解您对问题的解释,但您可能还应该使用
messageSymbols
中的最后一个对象
Destroy
将销毁对象,但元素仍在
列表中。LastOrDefault似乎是多余的,因为我们已经知道元素存在,所以可以使用Last()。没有性能影响,无论上下文如何,您都应该养成使用
…OrDefault
的习惯。我的代码中没有完整的最后一个或最后一个OrDefault方法,是否需要访问特定的命名空间?这太疯狂了,我无法让它工作!我做错了什么?我在msgPanel中实例化的对象是否与列表中的对象相同?有些东西在这里没有交叉。我已经将上面的代码更新为最新的迭代。我如何调试它以查看Destroy试图“Destroy”什么?这意味着您没有填充
msgSymbols
<代码>调试
msgSymbols的长度