Migrar versão 4.6 para versão 4000 instância: migrar exemplo ImageTracking_Targets
Este artigo descreve como migrar o exemplo ImageTracking_Targets do EasyAR Sense Unity Plugin versão 4.6 para a versão 4000.
Substituir pacote de plug-in
Consulte o guia de migração geral para substituir o pacote de plug-in.
Modificar código incompatível: execução mais rápida possível
Reimportar os StreamingAssets usados no exemplo:
Código original:
[UnityEditor.InitializeOnLoadMethod] static void ImportSampleStreamingAssets() { FileUtil.ImportSampleStreamingAssets(); }Modificado para:
private static readonly string[] streamingAssetsFiles = new string[] { "EasyARSamples/ImageTargets/idback.etd", "EasyARSamples/ImageTargets/namecard.jpg", }; [UnityEditor.InitializeOnLoadMethod] static void ImportSampleStreamingAssets() { var pacakge = $"Packages/{UnityPackage.Name}/Samples~/StreamingAssets/ImageTargets/ImageTargets.unitypackage"; if (streamingAssetsFiles.Where(f => !System.IO.File.Exists(System.IO.Path.Combine(Application.streamingAssetsPath, f))).Any() && System.IO.File.Exists>(System.IO.Path.GetFullPath(pacakge))) { UnityEditor.AssetDatabase.ImportPackage(pacakge, false); } }
No Update, remova a lógica de inversão automática da imagem da câmera frontal:
Código original:
private void Update() { bool isFront = false; if(cameraDevice.Device != null) { using (var cameraParameters = cameraDevice.Device.cameraParameters()) { if (cameraParameters.cameraDeviceType() == CameraDeviceType.Front) { isFront = true; } } } var statusText = "CenterMode: " + Session.CenterMode + Environment.NewLine + "CenterObject: " + (Session && Session.CenterObject ? Session.CenterObject.name : null) + Environment.NewLine + "HorizontalFlip: " + (isFront ? Session.HorizontalFlipFront : Session.HorizontalFlipNormal) + Environment.NewLine + "Camera: " + (cameraDevice && cameraDevice.enabled ? "On" : "Off") + Environment.NewLine + "Tracking: " + (imageTracker && imageTracker.enabled ? "On" : "Off") + Environment.NewLine + Environment.NewLine + "Target Load Status:" + Environment.NewLine; foreach (var item in imageTargetControllers) { statusText += "\t" + item.Key.gameObject.name + ": " + item.Value + Environment.NewLine; } Status.text = statusText; }Modificado para:
private void Update() { var statusText = "CenterMode: " + Session.CenterMode + Environment.NewLine + "CenterObject: " + (Session && Session.CenterObject ? Session.CenterObject.name : null) + Environment.NewLine + //"HorizontalFlip: " + (isFront ? Session.HorizontalFlipFront : Session.HorizontalFlipNormal) + Environment.NewLine + "Camera: " + (cameraDevice && cameraDevice.enabled ? "On" : "Off") + Environment.NewLine + "Tracking: " + (imageTracker && imageTracker.enabled ? "On" : "Off") + Environment.NewLine + Environment.NewLine + "Target Load Status:" + Environment.NewLine; foreach (var item in imageTargetControllers) { statusText += "\t" + item.Key.gameObject.name + ": " + item.Value + Environment.NewLine; } Status.text = statusText; }
Usando a nova API, atualize a função SwitchHFlipMode():
Código original:
public void SwitchCenterMode() { if (Session.AvailableCenterMode.Count == 0) { return; } while (true) { Session.CenterMode = (ARSession.ARCenterMode)(((int)Session.CenterMode + 1) % Enum.GetValues(typeof(ARSession.ARCenterMode)).Length); if (Session.AvailableCenterMode.Contains(Session.CenterMode)) { break; } } }Modificado para:
public void SwitchHFlipMode() { Session.HorizontalFlip.FrontCamera = (ARSession.ARHorizontalFlipMode)(((int)Session.HorizontalFlip.FrontCamera + 1) % Enum.GetValues(typeof(ARSession.ARHorizontalFlipMode)).Length); Session.HorizontalFlip.BackCamera = (ARSession.ARHorizontalFlipMode)(((int)Session.HorizontalFlip.BackCamera + 1) % Enum.GetValues(typeof(ARSession.ARHorizontalFlipMode)).Length); }
Usando a nova versão da API, atualize a função NextCamera():
Código da versão original:
public void NextCamera() { if (!cameraDevice || cameraDevice.Device == null) { return; } if (CameraDevice.cameraCount() == 0) { GUIPopup.EnqueueMessage("Camera unavailable", 3); cameraDevice.Close(); return; } var index = cameraDevice.Device.index(); index = (index + 1) % CameraDevice.cameraCount(); cameraDevice.CameraOpenMethod = CameraDeviceFrameSource.CameraDeviceOpenMethod.DeviceIndex; cameraDevice.CameraIndex = index; GUIPopup.EnqueueMessage("Switch to camera index: " + index, 3); cameraDevice.Close(); cameraDevice.Open(); }Modificado para:
public void NextCamera() { if (!cameraDevice || cameraDevice.Opened) { return; } if (CameraDeviceFrameSource.CameraCount == 0) { cameraDevice.Close(); return; } var index = cameraDevice.Index; index = (index + 1) % CameraDeviceFrameSource.CameraCount; cameraDevice.CameraOpenMethod = CameraDeviceFrameSource.CameraDeviceOpenMethod.DeviceIndex; cameraDevice.CameraOpenIndex = index; cameraDevice.Close(); cameraDevice.Open(); }
Usando a nova versão da API, atualize a função CreateTargets():
Código da versão original:
private void CreateTargets() { // dynamically load from image (*.jpg, *.png) var targetController = CreateTargetNode("ImageTarget-argame00"); targetController.Tracker = imageTracker; targetController.SourceType = ImageTargetController.DataSource.ImageFile; targetController.ImageFileSource.PathType = PathType.StreamingAssets; targetController.ImageFileSource.Path = "sightplus/argame00.jpg"; targetController.ImageFileSource.Name = "argame00"; targetController.ImageFileSource.Scale = 0.1f; GameObject duck02 = Instantiate(Resources.Load("duck02")) as GameObject; duck02.transform.parent = targetController.gameObject.transform; // dynamically load from json string foreach (var image in imageJosn.images) { targetController = CreateTargetNode("ImageTarget-" + image.name); targetController.Tracker = imageTracker; targetController.ImageFileSource.PathType = PathType.StreamingAssets; targetController.ImageFileSource.Path = image.image; targetController.ImageFileSource.Name = image.name; targetController.ImageFileSource.Scale = image.scale; var duck03 = Instantiate(Resources.Load("duck03")) as GameObject; duck03.transform.parent = targetController.gameObject.transform; } }Modificado para:
private void CreateTargets() { // dynamically load from image (*.jpg, *.png) var targetController = CreateTargetNode("ImageTarget-argame00"); targetController.Tracker = imageTracker; targetController.Source = new ImageTargetController.TargetDataFileSourceData { PathType = PathType.StreamingAssets, Path = "idback.etd", }; GameObject duck02 = Instantiate(Resources.Load("duck02")) as GameObject; duck02.transform.parent = targetController.gameObject.transform; // dynamically load from json string ... foreach (var image in imageJson.images) { targetController = CreateTargetNode("ImageTarget-" + image.name); targetController.Tracker = imageTracker; targetController.Source = new ImageTargetController.ImageFileSourceData { Path = image.image, Name = image.name, Scale = 0.1f, }; var duck03 = Instantiate(Resources.Load("duck03")) as GameObject; duck03.transform.parent = targetController.gameObject.transform; } }
Usando a nova versão da API, atualize a função AddTargetControllerEvents(ImageTargetController controller):
Código da versão original:
private void AddTargetControllerEvents(ImageTargetController controller) { if (!controller) { return; } controller.TargetFound += () => { Debug.LogFormat("Found target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name()); }; controller.TargetLost += () => { Debug.LogFormat("Lost target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name()); }; controller.TargetLoad += (Target target, bool status) => { imageTargetControllers[controller] = status ? true : imageTargetControllers[controller]; Debug.LogFormat("Load target {{id = {0}, name = {1}, size = {2}}} into {3} => {4}", target.runtimeID(), target.name(), controller.Size, >controller.Tracker.name, status); }; controller.TargetUnload += (Target target, bool status) => { imageTargetControllers[controller] = status ? false : imageTargetControllers[controller]; Debug.LogFormat("Unload target {{id = {0}, name = {1}}} => {2}", target.runtimeID(), target.name(), status); }; }Modificado para:
private void AddTargetControllerEvents(ImageTargetController controller) { if (!controller) { return; } controller.TargetFound += () => { Debug.LogFormat("Found target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name()); }; controller.TargetLost += () => { Debug.LogFormat("Lost target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name()); }; controller.TargetDataLoad += (bool status) => { imageTargetControllers[controller] = status ? true : imageTargetControllers[controller]; Debug.LogFormat("Load target {{id = {0}, name = {1}, size = {2}}} into {3} => {4}", controller.Target == null? controller.Target.runtimeID> ():string.Empty, controller.Target.name(), controller.Size, controller.Tracker.name, status); }; }
Neste ponto, o exemplo já pode ser executado basicamente.
Reconstruir cena: preparar para usar novos recursos
Excluir a AR Session da cena:
Recriar a AR Session:
Reatribuir o ImageTrackerFrameFilter para ImageTarget-idback na cena:
Reatribuir o ImageTrackerFrameFilter para ImageTarget-namecard na cena:
Reatribuir o ARSession nos scripts de exemplo para a nova AR Session criada (EasyAR):
Neste ponto, a cena de exemplo e os scripts foram atualizados para a versão 4000.0 e podem ser executados.
Além disso, os parâmetros relacionados ao ImageTarget podem ser ajustados para usar o novo método de carregamento Texture2D.




