Table of Contents

Migrer l'exemple de la version 4.6 vers la version 4000 : migration de l'exemple ImageTracking_Targets

Cet article explique comment migrer l'exemple ImageTracking_Targets d'EasyAR Sense Unity Plugin version 4.6 vers la version 4000.

Remplacer le package du plugin

Consultez le guide général de migration pour remplacer le package du plugin.

Modifier le code incompatible : moyen le plus rapide d'exécuter

Réimportez les StreamingAssets utilisés par l'exemple :

Code de la version d'origine:

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

Modifier en:

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

Supprimez dans Update la logique qui inverse automatiquement l'image de la caméra avant:

Code de la version d'origine:

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

Modifier en:

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

Utilisez la nouvelle version de l'API pour mettre à jour la fonction SwitchHFlipMode():

Code de la version d'origine:

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

Modifier en:

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

Utilisez la nouvelle version de l'API pour mettre à jour la fonction NextCamera():

Code de la version d'origine:

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

Modifier en:

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

Utilisez la nouvelle version de l'API pour mettre à jour la fonction CreateTargets():

Code de la version d'origine:

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

Modifier en:

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

Utilisez la nouvelle version de l'API pour mettre à jour la fonction AddTargetControllerEvents(ImageTargetController controller):

Code de la version d'origine:

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

Modifier en:

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

À ce stade, l'exemple peut globalement s'exécuter.

Reconstruire la scène : se préparer à utiliser les nouvelles fonctionnalités

Supprimez AR Session de la scène :

Recréez AR Session :

Réattribuez le ImageTrackerFrameFilter de ImageTarget-idback dans la scène :

Réattribuez le ImageTrackerFrameFilter de ImageTarget-namecard dans la scène :

Réattribuez ARSession dans le script de l'exemple à la nouvelle AR Session (EasyAR) créée :

À ce stade, la scène et le script de l'exemple ont tous deux été mis à jour vers la version 4000.0 et peuvent s'exécuter.

Vous pouvez également ajuster les paramètres associés d'ImageTarget pour utiliser la nouvelle méthode de chargement Texture2D.

Rubriques connexes