Table of Contents

Migrasi versi 4.6 ke versi 4000 contoh: migrasi contoh ImageTracking_Targets

Artikel ini menjelaskan cara memigrasi contoh ImageTracking_Targets dari EasyAR Sense Unity Plugin versi 4.6 ke versi 4000.

Ganti paket plugin

Lihat Panduan migrasi umum untuk mengganti paket plugin.

Modifikasi kode yang tidak kompatibel: paling cepat dapat dijalankan

Impor ulang StreamingAssets yang digunakan contoh:

Kode versi asli:

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

Dimodifikasi menjadi:

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

Dalam Update, hapus logika flip otomatis untuk kamera depan:

Kode versi asli:

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

Dimodifikasi menjadi:

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

Gunakan API versi baru, perbarui fungsi SwitchHFlipMode():

Kode versi asli:

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

Dimodifikasi menjadi:

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

Gunakan versi API baru, perbarui fungsi NextCamera():

Kode versi asli:

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

Dimodifikasi menjadi:

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

Gunakan versi API baru, perbarui fungsi CreateTargets():

Kode versi asli:

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

Dimodifikasi menjadi:

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

Gunakan versi API baru, perbarui fungsi AddTargetControllerEvents(ImageTargetController controller):

Kode versi asli:

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

Dimodifikasi menjadi:

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

Saat ini contoh sudah dapat dijalankan.

Bangun ulang adegan: persiapan untuk menggunakan fitur baru

Hapus AR Session di adegan:

Buat ulang AR Session:

Tentukan ulang ImageTrackerFrameFilter untuk ImageTarget-idback di adegan:

Tentukan ulang ImageTrackerFrameFilter untuk ImageTarget-namecard di adegan:

Tentukan ulang ARSession di skrip contoh ke AR Session baru yang dibuat (EasyAR):

Saat ini adegan dan skrip contoh telah diperbarui ke versi 400.0 dan dapat dijalankan.

Selain itu, Anda juga dapat menyesuaikan parameter terkait ImageTarget untuk menggunakan metode pemuatan Texture2D baru.

Topik terkait