我创建了一个空的游戏对象,并附加了一个脚本以使用线性渲染器创建一条线。然后使其成为预制件。之后,我使用此代码实例化了该预制件
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。我的理论是,游戏对象是附着脚本并制成预制件的游戏对象吗?
答案 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();调用了线性渲染器组件。销毁该预制件时,不会保留任何游戏对象。