Динамически отображать GameObject в Unity C # - PullRequest
0 голосов
/ 02 января 2019

Я работаю над проектом AR, где виртуальные объекты будут отображаться / скрываться в сцене на основе информации, найденной в текстовом файле. Текстовые файлы будут обновлены из внешнего сервиса. Поэтому мне нужно читать файл с частотой и обновлять сцену. В результате у меня есть только объект Camera, и я отрисовываю сцену в методе OnPreCull().

Текстовые файлы содержат много объектов, но не все объекты находятся внутри сцены в любой момент времени. Я искал способ визуализации только тех объектов, которые находятся внутри сцены.

Будет ли создание и размещение игровых объектов в методе OnPreCull() причиной каких-либо проблем с производительностью?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Будет ли создание и размещение игровых объектов в методе OnPreCull () создавать проблемы с производительностью?

Да, абсолютно ... так же будет, если вы сделаете это в Update или любом другомдругой, неоднократно называемый метод.

Вместо этого вы должны скорее создавать объекты в Awake и только активировать или деактивировать их.

Допустим, у вас есть 3 объекта A, B и C чем бы я создал своего рода класс контроллера, который выглядит как

public class ObjectsController : MonoBehaviour
{
    // Define in which intervals the file should be read/ the scene should be updated
    public float updateInterval;

    // Prefabs or simply objects that are already in the Scene
    public GameObject A;
    public GameObject B;
    public GameObject C;
    /* Etc ... */

    // Here you map the names from your textile to according object in the scene
    private Dictionary<string, GameObject> gameObjects = new Dictionary<string, gameObjects>();

    private void Awake ()
    {
        // if you use Prefabs than instantiate your objects here; otherwise you can skip this step
        var a = Instantiate(A);
        /* Etc... */

        // Fill the dictionary
        gameObjects.Add(nameOfAInFile, a);

        // OR if you use already instantiated references instead
        gameObjects.Add(nameOfAInFile, A);
    }
}

private void Start()
{
    // Start the file reader
    StartCoroutine (ReadFileRepeatedly());
}

// Read file in intervals
private IEnumerator ReadFileRepeatedly ()
{
    while(true)
    {
        //ToDo Here read the file

        //Maybe even asynchronous?
        // while(!xy.done) yield return null;

        // Now it depends how your textile works but you can run through 
        // the dictionary and decide for each object if you want to show or hide it
        foreach(var kvp in gameObjects)
        {
            bool active = someConditionDependingOnTheFile;

            kvp.value.SetActive(active);

            // And e.g. position it only if active
            if (active)
            {
                kvp.value.transform.position = positionFromFile;
            }
        }

        // Wait for updateInterval and repeat
        yield return new WaitForSeconds (updateInterval);
    }
}

Если у вас есть несколько экземпляров одного и того же префаба, вам также следует взглянуть на Объединение объектов

0 голосов
/ 02 января 2019

Я бы порекомендовал добавить каждый из игровых объектов в реестр и включить или выключить их (отключить / включить SetActive) с помощью цикла Update () класса реестра.

Один процесс Update () для извлечения и обработки файла сервера, другой процесс Update () для отключения / включения объектов. Звучит слишком упрощенно, но я думаю, что это самый быстрый способ получить результат.

Удачи!

...