Table of Contents

移行バージョン 4.6 からバージョン 4000 インスタンス: ImageTracking_Targets サンプルの移行

この文書では、ImageTracking_Targets サンプルを EasyAR Sense Unity Plugin 4.6 バージョンから 4000 バージョンに移行する方法について説明します。

プラグインパッケージの置き換え

汎用移行ガイド を参照してプラグインパッケージを置き換えてください。

非互換コードの修正: 最速実行可能

サンプルで使用される StreamingAssets を再インポートします:

元のバージョンコード:

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

変更後:

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

Update メソッドでフロントカメラの自動反転ロジックを削除:

元のバージョンコード:

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

変更後:

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

新しいバージョンの api を使用して、switchhflipmode() 関数を更新:

元のバージョンコード:

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

変更後:

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

使用新バージョン API を使用して、NextCamera() 関数を更新します:

元のバージョンコード:

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

次のように変更します:

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

新バージョン API を使用して、CreateTargets() 関数を更新します:

元のバージョンコード:

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

次のように変更します:

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

新バージョン API を使用して、AddTargetControllerEvents(ImageTargetController controller) 関数を更新します:

元のバージョンコード:

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

次のように変更します:

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

これでサンプルは基本的に実行可能になります。

シーンの再構築: 新機能使用の準備

シーン内の AR Session を削除します:

AR Session を再作成します:

シーン内の ImageTarget-idbackImageTrackerFrameFilter を再指定します:

シーン内の ImageTarget-namecardImageTrackerFrameFilter を再指定します:

サンプルスクリプト内の ARSession を新しく作成した AR Session (EasyAR) に再指定します:

これでサンプルシーンとスクリプトは 4000.0 バージョンに更新され、実行可能になります。

また、追加された Texture2D ロード方式を使用するために、ImageTarget の関連パラメータを調整することもできます。

関連トピック