Table of Contents

Migrare l'esempio dalla versione 4.6 alla versione 4000: migrazione del sample ImageTracking_Targets

Questo articolo descrive come migrare il sample ImageTracking_Targets da EasyAR Sense Unity Plugin versione 4.6 alla versione 4000.

Sostituire il pacchetto del plugin

Fare riferimento alla guida generale alla migrazione per sostituire il pacchetto del plugin.

Modificare il codice incompatibile: il modo più rapido per eseguire

Reimportare gli StreamingAssets usati dal sample:

Codice della versione originale:

[UnityEditor.InitializeOnLoadMethod]
static void ImportSampleStreamingAssets()
{
    FileUtil.ImportSampleStreamingAssets();
}

Modificare 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 in Update la logica che ribalta automaticamente l'immagine della camera frontale:

Codice della 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;
}

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

Usare la nuova versione dell'API per aggiornare la funzione SwitchHFlipMode():

Codice della 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; }
    }
}

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

Usare la nuova versione dell'API per aggiornare la funzione NextCamera():

Codice della 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();
}

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

Usare la nuova versione dell'API per aggiornare la funzione CreateTargets():

Codice della 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;
    }
}

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

Usare la nuova versione dell'API per aggiornare la funzione AddTargetControllerEvents(ImageTargetController controller):

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

Modificare 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 il sample può sostanzialmente essere eseguito.

Ricostruire la scena: prepararsi a usare le nuove funzionalità

Eliminare AR Session dalla scena:

Ricreare AR Session:

Riassegnare ImageTrackerFrameFilter di ImageTarget-idback nella scena:

Riassegnare ImageTrackerFrameFilter di ImageTarget-namecard nella scena:

Riassegnare ARSession nello script del sample alla AR Session (EasyAR) appena creata:

A questo punto la scena e lo script del sample sono stati aggiornati alla versione 4000.0 e possono essere eseguiti.

È inoltre possibile regolare i parametri relativi a ImageTarget per usare il nuovo metodo di caricamento Texture2D.

Argomenti correlati