ARCore + Unity + Augmented Images - загрузка разных префабов для разных изображений - PullRequest
0 голосов
/ 06 июля 2018

Как назначить разные префабы разным изображениям?

прямо сейчас у меня есть все мои префабы, загружаемые друг на друга, но как мне получить их, чтобы каждый префаб загружался только один раз поверх одного изображения, чтобы у каждого изображения был свой префаб?

Я изменил пример кода (углы рамки) для загрузки в свой собственный префаб и использовал словарь для сопряжения префабов с изображениями из базы данных, но при запуске программы он устанавливает все префабы в одном месте, а не Помещая один префраб на каждое изображение, он помещает все префабы на каждое изображение - вот код, который я использовал:

        public GameObject obj1, obj2, obj3, obj4;
    Dictionary<int, GameObject> imagePrefabPairs;
    public AugmentedImage Image;

    void Start()
    {
        instantiateDictionary();
    }

    // TODO: make initialisation dynamic, to match the size of the db.
    public void instantiateDictionary()
    {
        imagePrefabPairs = new Dictionary<int, GameObject>
        {
            { 0, obj1 },
            { 1, obj2 },
            { 2, obj3 },
            { 3, obj4 }
        };
    }

    public void Update()
    {
        if (Image == null || Image.TrackingState != TrackingState.Tracking)
        {
            obj1.SetActive(false);
            obj2.SetActive(false);
            obj3.SetActive(false);
            obj4.SetActive(false);
            return;
        }
        Pose _centerPose = Image.CenterPose;
        imagePrefabPairs[Image.DatabaseIndex].transform.localPosition = _centerPose.position;
        imagePrefabPairs[Image.DatabaseIndex].transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
        imagePrefabPairs[Image.DatabaseIndex].SetActive(true);
    }

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

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

Я назначаю разные префабы разным изображениям следующим образом:

  • Я изменил AugmentedImageExampleController.cs:.
  • Я добавил список префабов:

public List<AugmentedImageVisualizer> prefabs = new List<AugmentedImageVisualizer>();

  • Для связанного изображения для сборного дома я сделал ссылку, используя image.DatabaseIndex в визуализаторе:

visualizer = (AugmentedImageVisualizer)Instantiate(prefabs[image.DatabaseIndex], anchor.transform);

В инспекторе ExampleController теперь вы можете вставить префабы (AugmentedImageVisualizer).

Вот и все, и все работает нормально!

0 голосов
/ 09 июля 2018

Вы можете изменить свой префаб AugmentedImageVisualizer, чтобы при запуске все ваши разные объекты были неактивны (.SetActive(false);). Для изменения префаба вы можете добавить его в свою иерархию, установить все объекты неактивными и затем apply изменения. После применения вы можете удалить префаб из игровой иерархии.

enter image description here Img 1: добавить существующий сборник в игровую иерархию enter image description here Img 2: установите все прикрепленные объекты в неактивное (1) и примените изменения к префабу (2)

Поэтому, когда вы обнаруживаете изображение из вашей базы изображений, присоединяется префаб AugmentedImageVisualizer, и активным становится только объект с указанным индексом. Тогда ваш код должен работать.

Поскольку в начале все ваши объекты неактивны, вы можете изменить эту часть своего кода:

if (Image == null || Image.TrackingState != TrackingState.Tracking)
    {
        obj1.SetActive(false);
        obj2.SetActive(false);
        obj3.SetActive(false);
        obj4.SetActive(false);
        return;
    }

чтобы деактивировать только активный объект:

if (Image.TrackingState != TrackingState.Tracking)
        {
            imagePrefabPairs[Image.DatabaseIndex].SetActive(false);
            return;
        }
...