堆栈中的每个对象都为空

Posted

技术标签:

【中文标题】堆栈中的每个对象都为空【英文标题】:Every Object in Stack gets null 【发布时间】:2020-10-25 13:50:08 【问题描述】:

我不想在点击到堆栈时从 Gameobject 读取每个孩子。 之后我想销毁所有这些对象,所以它们不会显示出来。

在我的计划中,这些对象在堆栈中应该仍然可用。 但是如果我想再次从堆栈中添加对象,它们都是空的。

我是 Unity 新手,不知道为什么这不起作用。

很抱歉,如果之前有人问过这个问题,但我还没有看到任何类似的问题。

else if(!stacked)
        
            for (int i = 0; i < parent.transform.childCount; i++)
            
                aufgenommeneKarten.Push(parent.transform.GetChild(i).gameObject);
                Destroy(parent.transform.GetChild(i).gameObject);
            
            stacked = !stacked;
        
        else
        
            if (aufgenommeneKarten.Count != 0)
            
                go = new GameObject();
                go = aufgenommeneKarten.Pop();
                go.transform.SetParent(parent.transform, false); 
            
            else
            
                stacked = !stacked;
            
        

这是我的代码。

【问题讨论】:

你为什么要破坏?不会被垃圾回收吗? 你能展示Destroy方法吗? Destroy 方法是 Unity 的常规方法,我没有更改任何内容。 public static void Destroy(Object obj) float t = 0.0f; Object.Destroy(obj, t);对象在 for 循环完成后被销毁,然后堆栈被空值填充 那么,你试过不破坏它吗? 我试过了,就像这样,堆栈仍然满了,谢谢。但像这样,对象显然没有被破坏。那么是否有可能克隆 Gameobject 并将其推送到数组中? 【参考方案1】:

我不认为您正在使用对象的实际深层副本。

所以这里:

aufgenommeneKarten.Push(parent.transform.GetChild(i).gameObject);
Destroy(parent.transform.GetChild(i).gameObject); // this will act on the pushed object

推送的parent.transform.GetChild(i).gameObject 正在被Destroy 编辑。我不知道你的 Destroy 方法是如何实现的,但我侦察如果你 Dispose/destroy 等它,你实际上会引用同一块内存。所以,摧毁一个,也会摧毁被推动的。


最重要的是: 你什么都不做验证:parent.transform.GetChild(i).gameObject 当你推动它时。你确定那里不是null


另外,stacked = !stacked;:您的逻辑暗示这可以明确设置。喜欢stacked = true。在你的情况下:我会建议它防止潜在的错误。


这部分:

go = new GameObject();
go = aufgenommeneKarten.Pop();

似乎使用了一个字段go:在几种情况下可能会有点棘手。我认为最好跳过第一行:

//go = new GameObject();  not needed
go = aufgenommeneKarten.Pop();

【讨论】:

好的,谢谢。如果我在销毁之前进行调试,则这些项目随后会被销毁,堆栈上有值。 go 是一个 GameObject,我不确定我是否需要第一行。是否有可能将其复制到新的内存中,以免被破坏? “如果我在销毁之前调试,堆栈上有值”...我的意思是你的销毁方法将作用于推送对象 - 这可能会导致意外行为。这就是为什么我要问:你能展示破坏功能吗? ``` public static void Destroy(Object obj) float t = 0.0f; Object.Destroy(obj, t); ``` 这是 Unity 的方法

以上是关于堆栈中的每个对象都为空的主要内容,如果未能解决你的问题,请参考以下文章

当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?

删除领域数据库对象,但即使所有对象都为空,领域文件大小也保持不变。并且在时间上变得太大了

为什么Xcode调试模式下, lldb调试器打印任何对象都为空, 鼠标指向对变量时显示为nil?

Vue/JS - 检查两个对象的所有值是不是为空

Java中的堆栈方法区

Java中栈的使用