【问题标题】:Destroy not destroying GameObject销毁不销毁游戏对象
【发布时间】:2017-07-08 19:45:38
【问题描述】:

我在 Unity3D 中有以下代码,用于为 3D 绘图添加和删除线段:

public class LinearPiecewiseTrajectory : MonoBehaviuor
{
    private List<LineSegment> lineSegmentRep;

    //other stuff here

    public void addSegment()
    {
        GameObject lineSegmentObject = new GameObject();
        lineSegmentObject.name = "LineSegment";

        LineSegment lineSegment = lineSegmentObject.AddComponent<LineSegment>();

        lineSegmentObject.transform.parent = this.transform;
        lineSegmentRep.Add(lineSegment);
    }
}

public void deleteSegment(int i)
{
    Destroy(lineSegmentRep[i]);
}

LineSegment 是我定义的 MonoBehavior。

然而,这个销毁调用实际上并没有销毁 LineSegment 对象。我能找到的唯一可辨别的行为是将旧 LineSegment 的几何变换设置回身份。

我错过了什么?

【问题讨论】:

    标签: c# unity3d destroy


    【解决方案1】:

    但是,这个销毁调用实际上并没有销毁 LineSegment 对象

    当您调用Destroy(componentName); 时,传入的组件将被销毁,但该组件所附加的 GameObject 将不会被销毁。

    如果您希望 GameObject 连同附加的所有脚本一起销毁,则应使用 Destroy(componentName.gameObject);

    所以将Destroy(lineSegmentRep[i]); 替换为Destroy(lineSegmentRep[i].gameObject);

    此外,在销毁每个 LineSegment 之前,还必须将它们从 List 中删除,这样lineSegmentRep List 中就不会有空/null LineSegment。

    public void deleteSegment(int i)
    {
        //Remove from the List
        lineSegmentRep.Remove(lineSegmentRep[i]);
        //Now, destroy its object+script
        Destroy(lineSegmentRep[i].gameObject);
    }
    

    【讨论】:

    • 非常感谢您指出这一点!那原本应该是游戏对象的列表,而不是 MonoBehavior 的列表,我现在不知道为什么要这样做。谢谢!
    【解决方案2】:

    它正在破坏 LineSegment 类型的组件。

    你需要告诉销毁游戏对象。

    Destroy(lineSegmentRep[i].gameObject);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2018-04-17
      • 2012-12-06
      • 2015-08-30
      相关资源
      最近更新 更多