【问题标题】:Remove the last child from a gameobject从游戏对象中删除最后一个孩子
【发布时间】:2015-07-13 17:12:22
【问题描述】:

我正在为按下按钮时输出图像的触摸屏应用程序创建自定义键盘。然后这些图像填​​充网格布局以保持线性组织。我需要一个退格键。我真的很挣扎退格。我无法找到附加代码的问题。当我点击 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

【问题讨论】:

    标签: c# list unity3d destroy


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Fabjan - 摆脱了超出范围的错误,但它揭示了另一个问题。单击 DeleteKey 仍然不会从 messagePanel 中删除最后一个 symbolCharacter。我哪里错了?
    • 你能检查一下 msgSymbols[msgSymbols.Count-1] 处是否有对象吗?似乎 msgSymbols 总是为空或为空
    • 我不明白你对问题的解释,但你应该也应该RemoveAt(length-1) messageSymbols 的最后一个对象。 Destroy 将销毁对象,但该元素仍在 List 中。
    【解决方案2】:

    如果 count 为 0,您将得到一个超出索引范围的 -1 索引。

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

    【讨论】:

    • LastOrDefault 似乎是多余的,因为我们已经知道该元素存在,所以我们可以使用 Last()。
    • 没有性能影响,无论在什么情况下,您都应该养成使用 ...OrDefault 的习惯。
    • 我的代码中的 Last 或 LastOrDefault 方法没有完成,我需要访问这些特定的命名空间吗?
    • 这太疯狂了,我无法让它工作!我在这里做错了什么?我在 msgPanel 中实例化的对象是否与进入列表的对象相同?这里没有相交的东西。我已将上面的代码更新为最新的迭代。我如何调试它以查看 Destroy 试图“破坏”什么?
    • 这意味着您没有填充msgSymbolsDebugmsgSymbols的长度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2021-11-22
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多