前言
上周跟大家分享了高通AR的基本使用,跟着我一起做的同学应该有所发现,其实AR项目与游戏的区别就在于一个图像识别,识别出来之后,我们就可以在识别出来之后的对象上添加代码实现功能。本周先分享一个小小的迁移项目,AR版本的2048。
-
最常需要操作的AR脚本
DefaultTrackableEventHandler.cs
/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class DefaultTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLESprivate TrackableBehaviour mTrackableBehaviour; #endregion // PRIVATE_MEMBER_VARIABLES #region UNTIY_MONOBEHAVIOUR_METHODS void Start() { mTrackableBehaviour = GetComponent<TrackableBehaviour>(); if (mTrackableBehaviour) { mTrackableBehaviour.RegisterTrackableEventHandler(this); } } #endregion // UNTIY_MONOBEHAVIOUR_METHODS #region PUBLIC_METHODS /// <summary> /// Implementation of the ITrackableEventHandler function called when the /// tracking state changes. /// </summary> public void OnTrackableStateChanged( TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus) { Debug.Log("!!!" + newStatus); if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) { OnTrackingFound(); } else { OnTrackingLost(); } } #endregion // PUBLIC_METHODS #region PRIVATE_METHODS private void OnTrackingFound() { Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Enable rendering: foreach (Renderer component in rendererComponents) { component.enabled = true; } // Enable colliders: foreach (Collider component in colliderComponents) { component.enabled = true; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); } private void OnTrackingLost() { Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Disable rendering: foreach (Renderer component in rendererComponents) { component.enabled = false; } // Disable colliders: foreach (Collider component in colliderComponents) { component.enabled = false; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost"); } #endregion // PRIVATE_METHODS
-
根据跟踪状态实现相应功能
TrackableBehaviour.Status.DETECTED//检测到
TrackableBehaviour.Status.EXTENDED_TRACKED//延伸跟踪
TrackableBehaviour.Status.NOT_FOUND//未找到
TrackableBehaviour.Status.TRACKED//跟踪中
TrackableBehaviour.Status.UNDEFINED//未定义的
TrackableBehaviour.Status.UNKNOWN//未知的
可以通过状态 + 控制,完成识别后的切换,如果想识别多张图,可以创建多个ImageTarget。
-
高通会为识别图评测识别度(星级✨),在项目中识别图最少要三星。
-
ImageTarget子对象添加子对象时会自动缩放比例
✨✨所以在添加新对象之后要重新设置transform(P-R-S),修改transform时需修改本地transform。
- 对于新的AR2048主要是针对位置、旋转、缩放,做一些细致的调整,具体请看实际代码。下载地址(M:6kwt)
结束语
其实AR能完成的需求很多,只是大部分需要的技术还是前面Unity引擎的技术了,AR这边的Unity实现还需要AR引擎的支持,当然大牛可以自己开发引擎,国内这边最近也出了一个AR引擎,名字叫EasyAR,有兴趣的同学可以看一下,多支持一下国产。至于AR项目,今后遇到好的创意,还会和大家分享,如想交流请私密。