Migrazione versione 4.6 a versione 4000 esempio: migrazione esempio ImageTracking_Targets
Questo articolo spiega come migrare l'esempio ImageTracking_Targets da EasyAR Sense Unity Plugin versione 4.6 alla versione 4000.
Sostituire il pacchetto plugin
Fare riferimento alla Guida generale alla migrazione per sostituire il pacchetto plugin.
Modificare codice incompatibile: eseguibile più velocemente
Reimportare le StreamingAssets utilizzate dall'esempio:
Codice versione originale:
[UnityEditor.InitializeOnLoadMethod] static void ImportSampleStreamingAssets() { FileUtil.ImportSampleStreamingAssets(); }Modificato in:
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); } }
Rimuovere la logica di capovolgimento automatico della fotocamera anteriore in Update:
Codice versione originale:
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; }Modificato in:
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; }
Aggiornare la funzione SwitchHFlipMode() utilizzando la nuova versione dell'API:
Codice versione originale:
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; } } }Modificato in:
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); }
Usa la nuova API, aggiorna la funzione NextCamera():
Codice versione originale:
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(); }Modificato in:
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(); }
Usa la nuova API, aggiorna la funzione CreateTargets():
Codice versione originale:
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; } }Modificato in:
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; } }
Usa la nuova API, aggiorna la funzione AddTargetControllerEvents(ImageTargetController controller):
Codice versione originale:
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); }; }Modificato in:
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); }; }
A questo punto l'esempio è sostanzialmente eseguibile.
Ricostruire la scena: prepararsi per usare le nuove funzionalità
Eliminare la AR Session nella scena:
Ricreare la AR Session:
Riassegnare ImageTrackerFrameFilter per ImageTarget-idback nella scena:
Riassegnare ImageTrackerFrameFilter per ImageTarget-namecard nella scena:
Riassegnare ARSession negli script di esempio alla nuova AR Session creata (EasyAR):
A questo punto la scena e gli script di esempio sono aggiornati alla versione 4000.0 e possono essere eseguiti.
Inoltre è possibile regolare i parametri correlati a ImageTarget per utilizzare la nuova modalità di caricamento Texture2D.




