使用线渲染器销毁预制件不起作用

时间:2019-05-14 00:15:00

标签: c# unity3d

我创建了一个空的游戏对象,并附加了一个脚本以使用线性渲染器创建一条线。然后使其成为预制件。之后,我使用此代码实例化了该预制件

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

此后,我销毁了GameObject。我的问题是在销毁GameObject之后,该行仍显示在屏幕上。我的代码有什么问题。下面是附加到gameobject上的脚本,以创建一个线性渲染器。

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,然后生成一个gameobject。我的理论是,游戏对象是附着脚本并制成预制件的游戏对象吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

此脚本有很多问题,甚至不应该编译。

让我们从Awake方法开始。

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

在这里,您试图为本地作用域lr中的变量Awake设置访问修饰符,这是不可能的。您还尝试使用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<LineRenderer>();的确可以正常工作,并将LineRenderer添加到GameObject中。 LineRenderer lr

也是如此

Destroy(lines , 5);应该可以很好地销毁游戏对象,而这又会销毁应该消除线条本身的线性渲染器组件

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

继续看到这些行的原因是因为您正在一个更新循环中创建这些行,其中的计时器可能少于5秒,但是仅在5秒后销毁它们。这意味着在删除旧行之前,将在 之前连续实例化新行。

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

答案 1 :(得分:0)

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