配置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中。
初始化EasyAR¶
为了让EasyAR正常工作,你需要将 EasyAR prefab 和/或其它prefab添加到场景。SDK中包含一个通常用的 EasyAR_Startup Prefab 。拖拽 EasyAR_Startup Prefab 或其他需要的prefab到场景中。
在 inspector中输入key。
你可以在登录EasyAR网站后创建key。你可以在 EasyAR SDK入门 找到如何操作。然后使用这个key来初始化EasyAR。
添加Target¶
Planar Image Tracking¶
使用planar image tracking功能需要 ImageTarget。
ImageTarget 有许多种用法,可以参考 HelloARTarget sample。
如果需要在场景中静态配置 ImageTarget ,需要拖拽一个 ImageTarget Prefab 到场景中。如何配置可以参考Unity接口文档中的 ImageTarget Prefab 和 ImageTargetBaseBehaviour 。
在target节点下的Object 需要与 ImageTarget 底面对齐,
3D Object Tracking¶
使用3D object tracking功能需要 ObjectTarget。使用方法与 ImageTarget 类似。
ObjectTarget 节点下的物体Rotation 需要设成,
X: 90
y: 180
z: 0
SLAM¶
使用SLAM功能需要 ARSceneTarget。使用方法与 ImageTarget 类似。
Target 事件¶
不同类型的 target 使用类似的事件。ImageTarget 和 ObjectTarget 有 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。
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就不需要了。
Graphics API(Android/iOS)¶
在导出Android和iOS应用的时候,需要设置graphics API 为OpenGL ES 2.0。这个设置在不同的Unity版本中有所不同。
Unity 4.x 中设置如下
Unity 5.x 设置如下
XCode 配置(iOS)¶
如果你在使用最新的Unity版本,Unity会自动完成这个步骤。
如果你在生成iOS app,在Unity打包生成Xcode工程之后,需要多一步设置。
XCode 6.x: 添加 “libc++.dylib” 到链接选项中
XCode 7.x: 添加 “libc++.tbd” 到链接选项中。并设置 “Enable Bitcode” 为“NO”。
EasyAR SDK Pro XCode 配置¶
如果是在使用EasyAR SDK Pro的sample,需要添加 Accelerate.framework
iOS 隐私配置¶
在iOS上需要配置一些隐私设置。
如果要使用 camera,添加 Privacy - Camera Usage Description,
如果要使用录屏,添加 Privacy - Microphone Usage Description,
iOS arm64 支持¶
在 Player Settings 中手动打开 IL2CPP 选项。
并修改 architecture 为 Universal 或 arm64,
如果你在使用老版本的Unity,可能会碰到这样的编译错误,
这是 Unity 的 bug 并且在新版本的Unity中已经修复。推荐更新Unity版本,或者像下面这样删除 NORETURN
字符。
Android IL2CPP¶
Android IL2CPP 支持并没有被包含在官方 EasyAR Unity 插件中。我们会在今后的版本中加入支持。但是如果你是使用自己写的 EasyAR Unity 插件,你可以加入 IL2CPP 支持。