2

如何将不同的预制件分配给不同的图像?

现在,我的所有预制件都加载在彼此之上,但是我如何获得它,以便每个预制件仅在一个图像之上加载一次,因此每个图像都有不同的预制件?

我已经修改了示例代码(框架角)以加载到我自己的预制件中,并使用字典将预制件与数据库中的图像配对,但是当程序运行时,它会将所有预制件放在同一个地方而不是放置一个预制件在每张图片上,它将所有预制件放在每张图片上 - 这是我一直在使用的代码:

        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 语句来询问是否加载了一个预制件,然后选择加载下一个预制件并让他们一次实例化一个,但我不知道该怎么做,或者如果有更直接的方法可以做到这一点......?

4

2 回答 2

2

您可以更改您的 AugmentedImageVisualizer 预制件,以便在开始时所有不同的对象都处于非活动状态(.SetActive(false);)。要更改预制件,您可以将其添加到层次结构中,将所有对象设置为非活动状态,然后应用更改。应用后,您可以从游戏层次结构中删除预制件。

在此处输入图像描述 图 1:将现有预制添加到游戏层次结构 在此处输入图像描述 图 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;
        }
于 2018-07-09T13:58:19.407 回答
0

我通过这种方式将不同的预制件分配给不同的图像:

  • 我修改了AugmentedImageExampleController.cs:.
  • 我添加了一个预制件列表:

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

  • 对于预制件的相关图像,我image.DatabaseIndex在可视化器中使用了参考:

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

现在可以在您的检查ExampleController器中放入预制件(AugmentedImageVisualizer)。

就是这样,它的工作正常!

于 2018-07-12T08:32:40.730 回答