【问题标题】:Destroying prefab with line renderer doesn't work用线渲染器破坏预制件不起作用
【发布时间】:2019-09-30 22:44:16
【问题描述】:

我创建了一个空的游戏对象并附加了一个脚本以使用 linerenderer 创建一条线。然后把它做成预制件。之后,我使用此代码实例化了该预制件

GameObject lines = (GameObject)Instantiate(screenlines,new Vector3 ( 
    spawnerObjPos.transform.localPosition.x, listoflines[testt], 
    spawnerObjPos.transform.localPosition.z), transform.rotation);
Destroy(lines , 5);

在那之后我销毁了那个 GameObject 。我的问题是在销毁 GameObject 后,该行仍然出现在屏幕上。我的代码有什么问题。以下是附加到游戏对象以创建 linerenderer 的脚本。

public class CreateLine : MonoBehaviour
{
    GameObject myLine;
    LineRenderer lr;



    public void Start()
    {
        lr = new LineRenderer();
        ShapeCreator();
    }

    public void ShapeCreator()
    {
        lr = myLine.AddComponent<LineRenderer>();
        lr.material = new Material(Shader.Find("Sprites/Default"));
        lr.positionCount = 3;
        lr.startWidth = .1f;
        lr.endWidth = .1f;
        lr.SetPosition(0, new Vector3(shapePositionValues.posA, 
        shapePositionValues.posD, -1));
        lr.SetPosition(1, new Vector3(shapePositionValues.posB, 
        shapePositionValues.posE, -1));

        lr.useWorldSpace = false;
        Gradient gradient = new Gradient();
        gradient.SetKeys(
        new GradientColorKey[]
            {
                new GradientColorKey(Color.Red, 100f)
            },
            new GradientAlphaKey[] {
                new GradientAlphaKey(1f, 0.0f)
            }
        );
        lr.colorGradient = gradient;
    }
}

更新 预制件被破坏,但它留下了一个游戏对象。在下图中,lineprefab 是预制件。每次我实例化它时都会产生一个 lineprefab 然后是一个游戏对象。我的理论是,这是附加脚本并制作成预制件的游戏对象?

【问题讨论】:

  • 好吧,你的代码甚至不应该工作。 1) public LineRenderer lr = new LineRenderer(); 你不能在组件上调用new。 2) GameObject myLine; myLine.AddComponent&lt;LineRenderer&gt;(); 你的 myLine 变量不能是空值。所以要么你没有向我们展示你的实际代码,要么它不可能按照你说的去做。你也没有破坏myLine
  • @Draco18s 谢谢先生的指点。我已将我的代码更新为实际代码。请再次检查。我应该破坏预制然后 myLine 变量?据我了解,当您销毁预制件时,附加到它的脚本也会被销毁?
  • 现在它甚至不应该编译,因为您没有在使用它的同一范围内声明 myLine
  • @Draco18s 我已经修复了编码,先生,对此感到抱歉。为什么即使我破坏了它的预制线仍然存在?谢谢
  • GameObject lines... Destroy()... 这是在哪里运行的?在开始,更新,其他一些方法?

标签: c# unity3d


【解决方案1】:

这个脚本有很多问题,甚至应该无法编译。

让我们从 Awake 方法开始。

private void Awake()
{
    public LineRenderer lr = new LineRenderer();
    GameObject myLine;
}

在这里,您尝试在本地范围 Awake 内为变量 lr 设置访问修饰符,这是不可能的。您还尝试使用 new LineRenderer 添加 lineRenderer。这不是在 Unity 中添加组件的方式。

您在此处创建的 GameObject myLine 和 LineRenderer lr 只能在 Awake 范围内使用。看到它是在作用域的末尾创建的,意味着它从未被使用过。您将无法通过 ShapeColor 方法访问这些变量。

相反,您应该删除整个 Awake 函数,因为它现在没有做任何事情,并通过在类级别范围内声明变量来替换它

public class CreateLine : MonoBehaviour
{
   GameObject myLine; //This is now not limited to the Awake scope, but useable through the entire script
   LineRenderer lr;

    public void Start()
    {
        ShapeCreator();
    }
    //Rest of code...

然后在您的 ShapeCreator 方法中,我们有以下内容:

public void ShapeCreator()
{
    lr = myLine.AddComponent<LineRenderer>();

    //Rest of code....
}

您正在尝试将 LineRenderer 组件添加到 myLine,但如前所述,由于 myLine 仅存在于 Awake 的本地范围内,因此该组件不存在。如上所述,在您取消myLine 的范围后,myLine.AddComponent&lt;LineRenderer&gt;(); 确实可以工作,并将 LineRenderer 添加到 GameObject。 LineRenderer 也是如此lr

Destroy(lines , 5); 应该可以很好地销毁游戏对象,这反过来会破坏应该摆脱线本身的 linerenderer 组件

我还建议您阅读有关“范围”及其工作原理的一些信息,以及查看控制台中的错误,因为其中的错误可以帮助您调试此类问题。

您一直看到线条的原因是因为您在更新循环中创建线条,计时器可能短于 5 秒,但仅在 5 秒后销毁它们。这意味着新行将在您删除旧行之前不断实例化。

如果您将其从更新中移出并移至仅调用一次的方法(启动、唤醒等),您将看到它仅实例化一行,并在 5 秒后删除这一行,或者将 timer 增加到超过 5 秒。

【讨论】:

  • 另外,myLine.AddComponent&lt;LineRenderer&gt;(); 已经返回了创建的组件,这将第二行标记为过时。所以也可以改成lr = myLine.AddComponent&lt;LineRenderer&gt;();
  • 感谢您指出我的代码中的错误。现在我已经解决了。我的问题是为什么即使我破坏了它的预制线仍然存在?谢谢
  • @remy_rm 没有错误。在我销毁预制件之前,在我销毁预制件之后,这条线正在移动,这条线只是停留在屏幕上。我忘了告诉你附加到预制件的脚本继承自其他脚本。我已经更新了我的帖子
  • @Newboy11 您正在销毁对象,只是等待 5 秒,在此期间您继续创建更多行(每帧一个)。
  • @Draco18s 我试图只实例化一个预制件。它生成一个预制件,然后在 5 秒后生成一个游戏对象,该预制件被销毁,但它的游戏对象仍然存在。创建一个空的游戏对象并附加一个脚本然后使其成为预制件会导致这种情况吗?
【解决方案2】:

我终于找到了解决方案。我所做的是我创建了一个空的游戏对象并手动添加不在脚本中的 linerender 组件,然后创建一个预制件。然后在脚本中,我使用 lr = GetComponent(); 调用了 linerenderer 组件。销毁该预制件时,不会留下任何游戏对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多