Уничтожение сборного с помощью линейного рендерера не работает - PullRequest
0 голосов
/ 14 мая 2019

Я создал пустой игровой объект и прикрепил скрипт для создания строки с помощью 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, линия все еще появляется на экране.Что не так с моим кодом.Ниже приведен скрипт, прикрепленный к игровому объекту для создания линейного рендера.

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 это префаб.Каждый раз, когда я его создаю, создается линейный префаб, а затем игровой объект.Моя теория заключается в том, что это игровой объект, где скрипт прикреплен и превращен в сборный?

enter image description here

Ответы [ 2 ]

1 голос
/ 14 мая 2019

В этом сценарии много неправильных вещей, и он даже не может быть скомпилирован.

Давайте начнем с метода Awake.

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

Здесь вы пытаетесь установитьмодификатор доступа к переменной lr внутри локальной области действия Awake, это невозможно.Вы также пытаетесь добавить lineRenderer, используя new 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); Должно работать отлично для уничтожения игрового объекта, который, в свою очередь, уничтожит компонент linerenderer, который должен избавиться от самих линий

IЯ также посоветовал бы вам прочитать некоторую информацию о «областях» и о том, как они работают, а также о том, как смотреть на консоль на наличие ошибок, так как ошибки там помогают вам отладить подобные проблемы.

Причина, по которой выпродолжайте видеть строки, потому что вы создаете строки в цикле обновления, причем таймер, вероятно, короче 5 секунд, но уничтожает их только через 5 секунд.Это означает, что новые строки будут непрерывно создаваться до , когда вы удаляете старые строки.

, если вы перемещаете его из обновления и в метод, вызываемый только один раз (запуск, пробуждение и т. Д.), Выувидит, что он создает только одну строку и удаляет эту строку через 5 секунд, или увеличит значение timer до 5 секунд.

0 голосов
/ 15 мая 2019

Я наконец нашел решение для этого. Я создал пустой игровой объект и вручную добавил компонент linerender, а не сценарий, а затем создал префаб. Затем в скрипте я просто вызвал компонент linerenderer, используя lr = GetComponent () ;. При уничтожении этого префаба игровой объект не остается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...