我正在使用词典来保存实例化的预制件以及图像名称。因此,每当对应的图像出现时,都会显示匹配的预制件。我能够显示具有不同图像的预制件,但是问题是我想在当重新添加图像时,不会跟踪图像,也不会隐藏图像。添加图像时,将实例化预制件。
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);
时,我显示设备摄像头进行第一次成像时,预制实例化并播放视频,显示到第二个图像时,预制体实例化了,但是视频没有播放。
据我了解,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);
}
}
我面临的问题是快速更改图像时会崩溃,否则会播放视频。