如何使用Unity在ARfoundation中使用图像跟踪显示不同的预制件?

问题描述 投票:-1回答:1

我正在使用词典来保存实例化的预制件以及图像名称。因此,每当对应的图像出现时,都会显示匹配的预制件。我能够显示具有不同图像的预制件,但是问题是我想在当重新添加图像时,不会跟踪图像,也不会隐藏图像。添加图像时,将实例化预制件。

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
    }
}

foreach (var trackedImage in args.updated)中发生的事情感到困惑。

编辑:-Unity AndroidVideoMedia:启动编解码器时发生错误-10000。当我取消注释go.SetActive(false);时,我显示设备摄像头进行第一次成像时,预制实例化并播放视频,显示到第二个图像时,预制体实例化了,但是视频没有播放。

c# dictionary unity3d
1个回答
0
投票

据我了解,foreach (var trackedImage in args.added)循环仅在检测到已添加到库中的新图像时运行一次。在此实例化预制件。我将实例化的预制件和检测到的图像名称一起添加到字典中因此,每当再次显示图像时,我都可以根据检测到的图像隐藏和取消隐藏预制件。

 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);
    }

}

我面临的问题是快速更改图像时会崩溃,否则会播放视频。

© www.soinside.com 2019 - 2024. All rights reserved.