Unity3d 阿科雷+;统一+;增强图像-为不同的图像加载不同的预设
如何为不同的图像指定不同的预设 现在,我有我的所有预制加载在彼此的顶部,但我如何得到它,使每个预制加载在一个图像上只有一次,使每个图像有一个不同的预制 我已经修改了示例代码(帧角),将其加载到我自己的预置中,并使用字典将预置与数据库中的图像配对,但当程序运行时,它将所有预置安装在同一位置,而不是在每个图像上放置一个prefrab,它将所有预置放置在每个图像上-这是我一直使用的代码:Unity3d 阿科雷+;统一+;增强图像-为不同的图像加载不同的预设,unity3d,augmented-reality,arcore,android-augmented-reality,Unity3d,Augmented Reality,Arcore,Android Augmented Reality,如何为不同的图像指定不同的预设 现在,我有我的所有预制加载在彼此的顶部,但我如何得到它,使每个预制加载在一个图像上只有一次,使每个图像有一个不同的预制 我已经修改了示例代码(帧角),将其加载到我自己的预置中,并使用字典将预置与数据库中的图像配对,但当程序运行时,它将所有预置安装在同一位置,而不是在每个图像上放置一个prefrab,它将所有预置放置在每个图像上-这是我一直使用的代码: public GameObject obj1, obj2, obj3, obj4; Dic
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);
}
公共游戏对象obj1、obj2、obj3、obj4;
字典图像对;
公众形象;
void Start()
{
实例化指令();
}
//TODO:使初始化动态化,以匹配数据库的大小。
公共法令()
{
ImagePrefablePairs=新字典
{
{0,obj1},
{1,obj2},
{2,obj3},
{3,obj4}
};
}
公共无效更新()
{
if(Image==null | | Image.TrackingState!=TrackingState.Tracking)
{
obj1.SetActive(假);
obj2.SetActive(假);
obj3.SetActive(假);
obj4.SetActive(假);
返回;
}
姿势_centerPose=Image.centerPose;
ImagePrefablePairs[Image.DatabaseIndex].transform.localPosition=\u centerPose.position;
ImagePrefablePairs[Image.DatabaseIndex].transform.localScale=newvector3(0.1f,0.1f,0.1f);
ImagePrefablePairs[Image.DatabaseIndex].SetActive(true);
}
我想我需要一些if语句来询问是否加载了一个预置,然后选择加载下一个预置,让它们一次实例化一个,但我不确定如何做到这一点,或者是否有更直接的方法来实现…?您可以更改您的augmentImageVisualizer预置,因此,在开始时,所有不同的对象都处于非活动状态(
.SetActive(false);
)要更改预设,可以将其添加到层次结构中,将所有对象设置为非活动状态,然后应用更改。应用后,您可以从游戏层次结构中删除预设
Img 1:将现有预制添加到游戏层次结构
Img 2:将所有附加对象设置为非活动(1),并将更改应用到预置(2)
因此,当您从imagedatabase中检测到图像时,将附加AugmenteImageVisualizer预置,并且只有具有给定索引的对象被设置为活动。那么你的代码应该可以工作了
因为一开始所有对象都处于非活动状态,所以可以更改代码的这一部分:
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;
}
我通过以下方式为不同的图像指定不同的预设:
- 我修改了
:AugmentedImageExampleController.cs
- 我添加了预制件列表:
public List prefables=new List()代码>
- 对于预制件的相关图像,我使用可视化工具中的
image.DatabaseIndex
进行了参考:
visualizer=(AugmentedImageVisualizer)实例化(预置[image.DatabaseIndex],锚定.transform)代码>
在ExampleController
的检查器中,您现在可以放入预置(AugmentedImageVisualizer
)
就这样,它工作得很好 你的描述很模糊。到目前为止,您尝试了什么?*问题编辑为更清晰的公共增强图像;公共游戏对象[20]模型;如何为特定图像设置特定模型?在上面的代码中,什么是ImagePrefablePairs?@zyonneo ImagePrefablePairs是一个带有图像索引和3d游戏对象的命令:ImagePrefablePairs=new Dictionary{{0,obj1},{1,obj2},{2,obj3},{3,obj4};->请看问题中的代码,一旦目标图像未被跟踪,如何隐藏预制体?@zyonneo我将尝试帮助您回答您的问题: