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