Unity LineRenderer - невозможно установить позиции - PullRequest
2 голосов
/ 18 июня 2020

Это ссылка на мой предыдущий вопрос о невозможности получить ссылку на Unity LineRenderer. Временно обошелся, хотя до сих пор не понимаю, в чем проблема. Но теперь, получив ссылку на LineRenderer, я ничего не могу с ней сделать.

LineRenderer добавляется программно, и ссылка, полученная в Awake (), затем, позже, по запросу, необходимо получить к ней доступ, добавить нагрузку точки и отобразите его. Но я не могу - не буду компилировать. Код:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    //////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////

    public class Test : MonoBehaviour
    {
        LineRenderer
                lineOfFlight;

        void Awake()
        {
            GameObject
                    lineObject = new GameObject("Line");

            lineOfFlight = lineObject.AddComponent<LineRenderer>();
        }

        void Start() { }

        void Update()
        {
            List<Vector3>
                    savedBuffer = new List<Vector3>();  //  added for test
            Vector3[]
                    positions = new Vector3[3000];
            int     index = 0;

            foreach (Vector3 m in savedBuffer)
                positions[index++] = new Vector3(index, index, index);

            lineOfFlight.SetPositions(positions);
        }

    }

Он устанавливает OK в Awake ().

Ошибка в том, что lineOfFlight (тип LineRenderer) не имеет метода SetPositions () - согласно руководству Unity это есть, я не могу найти никакого метода, который вообще мог бы использовать для установки позиций. Все, что у него есть, это стандартные методы GameObject.

Это пример руководства Unity (в Update ()):

    LineRenderer lineRenderer = GetComponent<LineRenderer>();
    var points = new Vector3[lengthOfLineRenderer];
    var t = Time.time;
    for (int i = 0; i < lengthOfLineRenderer; i++)
    {
        points[i] = new Vector3(i * 0.5f, Mathf.Sin(i + t), 0.0f);
    }
    lineRenderer.SetPositions(points);

Так что же отличается?

Я упускают из виду главное - как получить доступ к этим компонентам? Я обнаруживал эту проблему раньше на других компонентах - очевидно, я не понимаю, как получить доступ к API в Unity.

Класс является производным от MonoBehaviour, и UnityEngine включен.

STOP PRESS:

Создан тестовый файл Test.cs - в нем есть только ключевые биты - теперь показан выше (заменен исходным примером). Не собирается делать много (ничего в saveBuffer), но должен компилироваться? Выдает точно такую ​​же ошибку в строке lineOfFlight.SetPositions(positions);.

Я также пробовал GetComponent<LineRenderer>().SetPositions(positions); - точно так же: «'LineRenderer' не содержит определения для 'SetPositions' и нет доступного метода расширения ' SetPositions ', принимающий первый аргумент типа' LineRenderer ', может быть обнаружен (вам не хватает директивы using или ссылки на сборку?) [Assembly-CSharp] csharp (CS1061) ".

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Код в вашем вопросе работает для меня из коробки, поэтому он почти наверняка должен быть конфликтом с другой библиотекой или пакетом, использующим то же имя LineRenderer.

Вероятно, определение того, что вы хотите использовать LineRenderer из пространства имен UnityEngine, должно исправить вашу проблему. (помимо избавления от другого пакета, но вы сказали, что не можете его найти)

using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    UnityEngine.LineRenderer lineOfFlight;// <- Note the UnityEngine.Linerenderer
    void Awake()
    {
        GameObject lineObject = new GameObject("Line");

        lineOfFlight = lineObject.AddComponent<UnityEngine.LineRenderer>();// <- notice the UnityEngine.LineRenderer
    }

    // Update is called once per frame
    void Update()
    {
        List<Vector3> savedBuffer = new List<Vector3>();

        if (Input.GetKey(KeyCode.V))
        {
            if (true)
            {
                Vector3[] positions = new Vector3[30];
                int index = 0;

                foreach (Vector3 m in savedBuffer)
                    positions[index++] = new Vector3(index, index, index);

                lineOfFlight.SetPositions(positions);
            }
        }
    }
}

Обычно такая проблема должна сопровождаться тем, что IDE выдает ошибку в строках

ошибка CS0104: LineRenderer - это неоднозначная ссылка между SomePackage.LindeRenderer и UnityEngine.LineRenderer

0 голосов
/ 18 июня 2020

Возможно, вы сможете решить проблему, добавив что-то вроде:

if(lineOfFlight == null)
{
     GameObject lineObject = new GameObject("Line");
     lineOfFlight = lineObject.AddComponent<LineRenderer>();
}

чуть ниже

if (recording.savedBuffer != null)
    {

, чтобы убедиться, что lineOfFlight настроен правильно перед вызовом вашим скриптом Update (). Если это устраняет вашу проблему, значит, существует состояние гонки, вызывающее срабатывание Update () для объекта до срабатывания Awake ()

...