ARCore + Unity + Augmented Images - 为不同的图像加载不同的预制件
ARCore + Unity + Augmented Images - Load different prefabs for different Images
如何将不同的预制件分配给不同的图像?
现在,我的所有预制件都在彼此之上加载,但如何才能让每个预制件只在一张图片上加载一次,这样每张图片都有不同的预制件?
我修改了示例代码(框架角)以加载到我自己的预制件中,并使用字典将预制件与数据库中的图像配对,但是当程序运行时它会在同一个地方实例化所有预制件与其在每个图像上放置一个预制件,不如在每个图像上放置所有预制件 - 这是我一直在使用的代码:
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 语句来询问是否加载了一个预制件,然后只选择加载下一个预制件并让它们一次实例化一个,但我不确定如何这样做,或者是否有更直接的方法来做到这一点......?
您可以更改您的 AugmentedImageVisualizer 预制件,以便在开始时所有不同的对象都处于非活动状态(.SetActive(false);
)要更改预制件,您可以将其添加到您的层次结构中,将所有对象设置为非活动状态,然后 应用 更改。应用后,您可以从游戏层次结构中删除预制件。
Img 1:将现有预制件添加到游戏层次结构
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;
}
我是这样给不同的图片分配不同的prefabs的:
- 我修改了
AugmentedImageExampleController.cs
:.
- 我添加了预制件列表:
public List<AugmentedImageVisualizer> prefabs = new List<AugmentedImageVisualizer>();
- 对于预制件的相关图像,我使用可视化工具中的
image.DatabaseIndex
做了参考:
visualizer = (AugmentedImageVisualizer)Instantiate(prefabs[image.DatabaseIndex], anchor.transform);
在 ExampleController
的检查器中,您现在可以放入预制件 (AugmentedImageVisualizer
)。
就是这样,而且工作正常!
如何将不同的预制件分配给不同的图像?
现在,我的所有预制件都在彼此之上加载,但如何才能让每个预制件只在一张图片上加载一次,这样每张图片都有不同的预制件?
我修改了示例代码(框架角)以加载到我自己的预制件中,并使用字典将预制件与数据库中的图像配对,但是当程序运行时它会在同一个地方实例化所有预制件与其在每个图像上放置一个预制件,不如在每个图像上放置所有预制件 - 这是我一直在使用的代码:
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 语句来询问是否加载了一个预制件,然后只选择加载下一个预制件并让它们一次实例化一个,但我不确定如何这样做,或者是否有更直接的方法来做到这一点......?
您可以更改您的 AugmentedImageVisualizer 预制件,以便在开始时所有不同的对象都处于非活动状态(.SetActive(false);
)要更改预制件,您可以将其添加到您的层次结构中,将所有对象设置为非活动状态,然后 应用 更改。应用后,您可以从游戏层次结构中删除预制件。
因此,当您从图像数据库中检测到图像时,会附加 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;
}
我是这样给不同的图片分配不同的prefabs的:
- 我修改了
AugmentedImageExampleController.cs
:. - 我添加了预制件列表:
public List<AugmentedImageVisualizer> prefabs = new List<AugmentedImageVisualizer>();
- 对于预制件的相关图像,我使用可视化工具中的
image.DatabaseIndex
做了参考:
visualizer = (AugmentedImageVisualizer)Instantiate(prefabs[image.DatabaseIndex], anchor.transform);
在 ExampleController
的检查器中,您现在可以放入预制件 (AugmentedImageVisualizer
)。
就是这样,而且工作正常!