配置EasyAR Unity SDK

这篇文章介绍如何使用EasyAR Unity Package配置EasyAR。

如果你需要运行EasyAR unity样例,请阅读 这篇文章

安装需求

  • Unity 4.6或更新版本

  • (如果要发布Android应用)Android SDK with Build Tools 至少需要版本23.0.1

  • (如果要发布iOS应用)IPhone或IPad或其它真实Apple设备(EasyAR不支持在虚拟机上运行)

导入Package

首先,你需要下载EasyAR压缩包,找到EasyAR Unity Package(.unitypackage) ,打开并导入到Unity中。

../_images/image71.png

初始化EasyAR

为了让EasyAR正常工作,你需要将 EasyAR prefab 和/或其它prefab添加到场景。SDK中包含一个通常用的 EasyAR_Startup Prefab 。拖拽 EasyAR_Startup Prefab 或其他需要的prefab到场景中。

../_images/image72.png

在 inspector中输入key。

../_images/image73.png ../_images/image74.png

你可以在登录EasyAR网站后创建key。你可以在 EasyAR SDK入门 找到如何操作。然后使用这个key来初始化EasyAR。

添加Target

Planar Image Tracking

使用planar image tracking功能需要 ImageTarget

ImageTarget 有许多种用法,可以参考 HelloARTarget sample。

如果需要在场景中静态配置 ImageTarget ,需要拖拽一个 ImageTarget Prefab 到场景中。如何配置可以参考Unity接口文档中的 ImageTarget PrefabImageTargetBaseBehaviour

在target节点下的Object 需要与 ImageTarget 底面对齐,

../_images/image81.png ../_images/image82.png ../_images/image83.png

3D Object Tracking

使用3D object tracking功能需要 ObjectTarget。使用方法与 ImageTarget 类似。

ObjectTarget 节点下的物体Rotation 需要设成,

X: 90
y: 180
z: 0
../_images/image84.png ../_images/image85.png ../_images/image86.png

SLAM

使用SLAM功能需要 ARSceneTarget。使用方法与 ImageTarget 类似。

../_images/image87.png ../_images/image88.png

Target 事件

不同类型的 target 使用类似的事件。ImageTargetObjectTarget 有 found/lost 以及 load/unload 事件。 ARSceneTarget 只有found/lost 事件。

这里只介绍 ImageTarget 的事件,在下面代码中替换target类型之后就能获得对其他类型的target的事件处理方法。也可以参考sample来使用这些事件。

你可以在 ImageTargetBehaviour 中处理 ImageTarget 的事件,

public class EasyImageTargetBehaviour : ImageTargetBehaviour
{
    protected override void Awake()
    {
        base.Awake();
        TargetFound += OnTargetFound;
        TargetLost += OnTargetLost;
        TargetLoad += OnTargetLoad;
        TargetUnload += OnTargetUnload;
    }

    void OnTargetFound(TargetAbstractBehaviour behaviour)
    {
        Debug.Log("Found: " + Target.Id);
    }

    void OnTargetLost(TargetAbstractBehaviour behaviour)
    {
        Debug.Log("Lost: " + Target.Id);
    }

    void OnTargetLoad(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
    {
        Debug.Log("Load target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
    }

    void OnTargetUnload(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
    {
        Debug.Log("Unload target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
    }
}

或是在全局target管理器中处理target事件,

public class ARIsEasyBehaviour : MonoBehaviour
{
    private void Awake()
    {
        var EasyARBehaviour = FindObjectOfType<EasyARBehaviour>();
        EasyARBehaviour.Initialize();
        foreach (var behaviour in ARBuilder.Instance.ARCameraBehaviours)
        {
            behaviour.TargetFound += OnTargetFound;
            behaviour.TargetLost += OnTargetLost;
        }
        foreach (var behaviour in ARBuilder.Instance.ImageTrackerBehaviours)
        {
            behaviour.TargetLoad += OnTargetLoad;
            behaviour.TargetUnload += OnTargetUnload;
        }
    }

    void OnTargetFound(ARCameraBaseBehaviour arcameraBehaviour, TargetAbstractBehaviour targetBehaviour, Target target)
    {
        Debug.Log("<Global Handler> Found: " + target.Id);
    }

    void OnTargetLost(ARCameraBaseBehaviour arcameraBehaviour, TargetAbstractBehaviour targetBehaviour, Target target)
    {
        Debug.Log("<Global Handler> Lost: " + target.Id);
    }

    void OnTargetLoad(ImageTrackerBaseBehaviour trackerBehaviour, ImageTargetBaseBehaviour targetBehaviour, Target target, bool status)
    {
        Debug.Log("<Global Handler> Load target (" + status + "): " + target.Id + " (" + target.Name + ") " + " -> " + trackerBehaviour);
    }

    void OnTargetUnload(ImageTrackerBaseBehaviour trackerBehaviour, ImageTargetBaseBehaviour targetBehaviour, Target target, bool status)
    {
        Debug.Log("<Global Handler> Unload target (" + status + "): " + target.Id + " (" + target.Name + ") " + " -> " + trackerBehaviour);
    }
}

Target Show/Hide

从 EasyAR SDK 2.0开始, target show/hide 行为默认开启。这个行为可以很容易关闭,只需要去掉 Target Inspector的 GameObject Active Control 状态即可。每种类型的target上都可以找到这个选项。另外也可以在脚本中通过代码关闭默认行为,只需将 TargetAbstractBehaviour.GameObjectActiveControl 设为false。

../_images/image89.png

GameObjectActiveControl 的默认行为如下,

protected virtual void Start()
{
    if (gameObjectActiveControl)
        gameObject.SetActive(false);
}

internal void OnTargetFound()
{
    if (gameObjectActiveControl)
        gameObject.SetActive(true);
}

internal void OnTargetLost()
{
    if (gameObjectActiveControl)
        gameObject.SetActive(false);
}

这是内部代码的一部分,它仅用来显示 EasyAR SDK 在 GameObjectActiveControl 开启状态下做了什么,复制这段代码到你的代码中并不会产生任何作用。如果你需要处理更加复杂的情况,可以按照下面的描述进行。

所以如果你关闭了 GameObjectActiveControl,可以在脚本中实现你所需要的改变,比如更自由的控制何时显示/隐藏物体,或完成“脱卡”所需的功能。你需要做的只是重写 Start 并实现 OnTargetFound/OnTargetLost 的事件处理。更具体一些,你可以参考如下代码在关闭 GameObjectActiveControl 后实现与默认行为相同的功能,这与 EasyAR SDK 1.x 版本中的实现相当类似,

public class EasyImageTargetBehaviour : ImageTargetBehaviour
{
    protected override void Awake()
    {
        base.Awake();
        GameObjectActiveControl = false;
        TargetFound += OnTargetFound;
        TargetLost += OnTargetLost;
    }
    protected override void Start()
    {
        base.Start();
        gameObject.SetActive(false);
    }

    void OnTargetFound(TargetAbstractBehaviour behaviour)
    {
        gameObject.SetActive(true);
    }

    void OnTargetLost(TargetAbstractBehaviour behaviour)
    {
        gameObject.SetActive(false);
    }
}

Bundle ID(Android/iOS)

你需要在生成Android/iOS应用的时候设置bundle ID。 bundle ID 应该与easyar网页上生成的ID相同。否则可能造成SDK初始化失败并黑屏。如果是在 Mac or Windows上,这个ID就不需要了。

../_images/image75.png

Graphics API(Android/iOS)

在导出Android和iOS应用的时候,需要设置graphics API 为OpenGL ES 2.0。这个设置在不同的Unity版本中有所不同。

Unity 4.x 中设置如下

../_images/image76.png ../_images/image77.png

Unity 5.x 设置如下

../_images/image78.png ../_images/image79.png

XCode 配置(iOS)

如果你在使用最新的Unity版本,Unity会自动完成这个步骤。

如果你在生成iOS app,在Unity打包生成Xcode工程之后,需要多一步设置。

XCode 6.x: 添加 “libc++.dylib” 到链接选项中

../_images/image47.png

XCode 7.x: 添加 “libc++.tbd” 到链接选项中。并设置 “Enable Bitcode” 为“NO”。

../_images/image48.png ../_images/image49.png

EasyAR SDK Pro XCode 配置

如果是在使用EasyAR SDK Pro的sample,需要添加 Accelerate.framework

../_images/image40.png

iOS 隐私配置

在iOS上需要配置一些隐私设置。

如果要使用 camera,添加 Privacy - Camera Usage Description

../_images/image55.png

如果要使用录屏,添加 Privacy - Microphone Usage Description

../_images/image56.png

iOS arm64 支持

Player Settings 中手动打开 IL2CPP 选项。

../_images/image57.png

并修改 architecture 为 Universal 或 arm64,

../_images/image58.png

如果你在使用老版本的Unity,可能会碰到这样的编译错误,

../_images/image59.png

这是 Unity 的 bug 并且在新版本的Unity中已经修复。推荐更新Unity版本,或者像下面这样删除 NORETURN 字符。

../_images/image510.png

Android IL2CPP

Android IL2CPP 支持并没有被包含在官方 EasyAR Unity 插件中。我们会在今后的版本中加入支持。但是如果你是使用自己写的 EasyAR Unity 插件,你可以加入 IL2CPP 支持。