C# 如何在ARfoundation中用图像跟踪显示不同的预制件?
我正在使用字典保存实例化的预置以及图像名称。因此,每当出现相应的图像时,都会显示匹配的预置。我可以使用不同的图像显示预置,但问题是我想在图像未被跟踪时隐藏预置,并且在图像被重新跟踪时取消隐藏添加了预置得到实例化C# 如何在ARfoundation中用图像跟踪显示不同的预制件?,c#,dictionary,unity3d,C#,Dictionary,Unity3d,我正在使用字典保存实例化的预置以及图像名称。因此,每当出现相应的图像时,都会显示匹配的预置。我可以使用不同的图像显示预置,但问题是我想在图像未被跟踪时隐藏预置,并且在图像被重新跟踪时取消隐藏添加了预置得到实例化 public void OnImageChanged(ARTrackedImagesChangedEventArgs args) { //For everytime an image gets detected a video is played.Runs only when i
public void OnImageChanged(ARTrackedImagesChangedEventArgs args)
{
//For everytime an image gets detected a video is played.Runs only when image is added
foreach (var trackedImage in args.added)
{
Debug.Log("Instantiate Cube");
cubePrefab = Instantiate(cubeTv, trackedImage.transform);
//Getting file name of the video
var data = allDataContent.FirstOrDefault(i => i.imgFileName == trackedImage.referenceImage.name);
videoName = data.vidFileName;
//Getting the videoplayer component from he instantiated gameobject
vp = cubePrefab.GetComponent<VideoPlayer>();
vp.source = VideoSource.Url;
vp.url = Application.persistentDataPath + "/" + videoName;
vp.playOnAwake = true;
vp.isLooping = true;
vp.renderMode = UnityEngine.Video.VideoRenderMode.MaterialOverride;
vp.targetMaterialRenderer = GetComponent<Renderer>();
vp.targetMaterialProperty = "_MainTex";
vp.Play();
//Adding the prefab and name to a dictionary
holdList.Add(cubePrefab, trackedImage.referenceImage.name);
}
foreach (var trackedImage in args.updated)
{
if (trackedImage.trackingState == TrackingState.Tracking)
{
//Getting the video with respect to the tracked image
var data = allDataContent.FirstOrDefault(i => i.imgFileName == trackedImage.referenceImage.name);
videoName = data.vidFileName;
if (File.Exists(Application.persistentDataPath + "/" + videoName))
{
foreach (var v in holdList.Values)
{
//Getting the correct gameobject from the dictionary according to tracked image
GameObject go = holdList.FirstOrDefault(x => x.Value == trackedImage.referenceImage.name).Key;
if (v == trackedImage.referenceImage.name)
{
go.SetActive(true);
continue;
}
else
{
// go.SetActive(false);
}
}
}
}
else
{
// cubePrefab.SetActive(false);
}
}
foreach (var trackedImage in args.removed)
{
//Read in some forum this is not working
}
}
public void OnImageChanged(ARTRACKDIMAGESCHANGEDVENTARGS参数)
{
//每次检测到图像时,都会播放视频。仅在添加图像时运行
foreach(参数中的变量trackedImage.added)
{
Log(“实例化多维数据集”);
cubePrefab=实例化(cubeTv,trackedImage.transform);
//正在获取视频的文件名
var data=allDataContent.FirstOrDefault(i=>i.imgFileName==trackedImage.referenceImage.name);
videoName=data.vidFileName;
//从实例化的游戏对象中获取videoplayer组件
vp=cubePrefab.GetComponent();
vp.source=VideoSource.Url;
vp.url=Application.persistentDataPath+“/”+videoName;
vp.playOnAwake=true;
vp.isLooping=true;
vp.renderMode=UnityEngine.Video.VideoRenderMode.MaterialOverride;
vp.targetMaterialRenderer=GetComponent();
vp.targetMaterialProperty=“\u MainTex”;
vp.Play();
//将预置和名称添加到字典
添加(cubePrefab,trackedImage.referenceImage.name);
}
foreach(args.updated中的var trackedImage)
{
if(TrackeImage.trackingState==trackingState.Tracking)
{
//获取与跟踪图像相关的视频
var data=allDataContent.FirstOrDefault(i=>i.imgFileName==trackedImage.referenceImage.name);
videoName=data.vidFileName;
if(File.Exists(Application.persistentDataPath+“/”+videoName))
{
foreach(holdList.Values中的变量v)
{
//根据跟踪图像从字典中获取正确的游戏对象
GameObject go=holdList.FirstOrDefault(x=>x.Value==trackedImage.referenceImage.name).Key;
if(v==trackedImage.referenceImage.name)
{
go.SetActive(true);
继续;
}
其他的
{
//go.SetActive(false);
}
}
}
}
其他的
{
//cubePrefab.SetActive(false);
}
}
foreach(参数中的var trackedImage.removed)
{
//在一些论坛上读到这是不起作用的
}
}
对foreach(args.updated中的var trackedImage)中发生的事情有点困惑
编辑:-Unity AndroidVideoMedia:启动编解码器时出错-10000。当我取消注释时
go.SetActive(false)代码>当我向第一个图像显示设备摄像机时,预置实例化并播放视频,然后显示到预置实例化的第二个图像,但视频没有播放。根据我对foreach的理解(args.added中的var trackedImage)
当检测到库中已添加的新图像时,循环仅运行一次。我正在实例化预置。我将实例化的预置与检测到的图像名称一起添加到字典中。因此,每当再次显示图像时,我可以根据检测到的图像隐藏和取消隐藏预置
public void OnImageChanged(ARTrackedImagesChangedEventArgs args)
{
foreach (var trackedImage in args.added)
{
//Instantiating prefab
cubePrefab = Instantiate(cubeTv, trackedImage.transform);
Debug.Log("Cube prefb name "+cubePrefab.name);
var data = allDataContent.FirstOrDefault(i => i.imgFileName == trackedImage.referenceImage.name);
videoName = data.vidFileName;
Debug.Log("Video File Name = " + videoName);
vp = cubePrefab.GetComponent<VideoPlayer>();
vp.source = VideoSource.Url;
vp.url = Application.persistentDataPath + "/" + videoName;
vp.playOnAwake = true;
vp.isLooping = true;
vp.renderMode = UnityEngine.Video.VideoRenderMode.MaterialOverride;
vp.targetMaterialRenderer = GetComponent<Renderer>();
vp.targetMaterialProperty = "_MainTex";
vp.Play();
holdList.Add(cubePrefab, trackedImage.referenceImage.name);
}
foreach (var trackedImage in args.updated)
{
if (trackedImage.trackingState == TrackingState.Tracking)
{
var data = allDataContent.FirstOrDefault(i => i.imgFileName == trackedImage.referenceImage.name);
videoName = data.vidFileName;
if (File.Exists(Application.persistentDataPath + "/" + videoName))
{
foreach (var v in holdList.Values)
{
go = holdList.FirstOrDefault(x => x.Value == trackedImage.referenceImage.name).Key;
if (v == trackedImage.referenceImage.name)
{
go.SetActive(true);
}
else if(v!= trackedImage.referenceImage.name)
{
List<GameObject> go = new List<GameObject>();
var exceptOne = holdList.Where(i => i.Value != trackedImage.referenceImage.name).ToList();
foreach (var item in exceptOne)
{
go.Add(item.Key);
}
foreach (var gameObjectone in go)
{
gameObjectone.SetActive(false);
}
}
}
}
}
else
{
// go.SetActive(false);
}
}
foreach (var trackedImage in args.removed)
{
// go.SetActive(false);
}
}
public void OnImageChanged(ARTRACKDIMAGESCHANGEDVENTARGS参数)
{
foreach(参数中的变量trackedImage.added)
{
//实例化预置
cubePrefab=实例化(cubeTv,trackedImage.transform);
Log(“多维数据集prefb name”+cubePrefab.name);
var data=allDataContent.FirstOrDefault(i=>i.imgFileName==trackedImage.referenceImage.name);
videoName=data.vidFileName;
Debug.Log(“视频文件名=“+videoName”);
vp=cubePrefab.GetComponent();
vp.source=VideoSource.Url;
vp.url=Application.persistentDataPath+“/”+videoName;
vp.playOnAwake=true;
vp.isLooping=true;
vp.renderMode=UnityEngine.Video.VideoRenderMode.MaterialOverride;
vp.targetMaterialRenderer=GetComponent();
vp.targetMaterialProperty=“\u MainTex”;
vp.Play();
添加(cubePrefab,trackedImage.referenceImage.name);
}
foreach(args.updated中的var trackedImage)
{
if(TrackeImage.trackingState==trackingState.Tracking)
{
var data=allDataContent.FirstOrDefault(i=>i.imgFileName==trackedImage.referenceImage.name);
videoName=data.vidFileName;
if(File.Exists(Application.persistentDataPath+“/”+videoName))
{
foreach(holdList.Values中的变量v)
{
go=holdList.FirstOrDefault(x=>x.Value==trackedImage.referenceImage.name).Key;
if(v==trackedImage.referenceImage.name)
{
go.SetActive(true);
}
else if(v!=trackedImage.referenceImage.name)
{
List go=新列表();
var exceptOne=holdList.Where(i=>i.Value!=trackedImage.referenceImage.name).ToList();
foreach(exceptOne中的var项)
{
go.Add(item.Key);
}
foreach(go中的var gameObjectone)
{
gameObjectone.SetActive(false);
}
}
}
}
}
其他的
{
//go.SetActive(fa