Vuforia 收藏本版 已有9人收藏 +发表新主题
查看: 66797|回复: 13
打印 上一主题 下一主题

[分享] Blank -> Vuforia For Unity 动态加载识别图[可放服务器]

[复制链接]

[分享] Blank -> Vuforia For Unity 动态加载识别图[可放服务器]

Blank 发表于 2016-4-14 22:24:31 浏览:  66797 回复:  13 只看该作者 复制链接
Hi !!! 大家好
-Blank 向大家问好!
大家都知道。高通本地识别图开发一般都是开发前。将识别图预知到程序中。
我今天教大家怎么样动态的把识别图文件放到服务器后。下载到本地加载。
废话不多说直接上代码:
  1. /// <summary>
  2.     /// 识别图管理器
  3.     /// </summary>
  4.     public class ImageTargetManager : MonoBehaviour
  5.     {
  6.         /// <summary>
  7.         /// 识别图加载完成
  8.         /// </summary>
  9.         public event Action<string[]> ImageTargerLoadedEvent;

  10.         /// <summary>
  11.         /// 本地文件路径
  12.         /// </summary>
  13.         private string m_localFilePath;
  14.         /// <summary>
  15.         /// 是否加载过
  16.         /// </summary>
  17.         private bool m_isLoaded;
  18.         /// <summary>
  19.         /// 数据集
  20.         /// </summary>
  21.         private DataSet m_dataSet;
  22.         /// <summary>
  23.         /// 识别器
  24.         /// </summary>
  25.         private ObjectTracker m_tracker;
  26.         /// <summary>
  27.         /// 识别图集合对象
  28.         /// </summary>
  29.         private ImageTargetBehaviour[] m_imageTargetBehaviours;

  30.         private void Start()
  31.         {
  32.             m_isLoaded = false;
  33.             //TODO  识别图相关信息加载
  34.             VuforiaBehaviour.Instance.RegisterVuforiaInitializedCallback(VuforiaInitedCallBack);
  35.         }
  36.         /// <summary>
  37.         /// 高通初始化完毕回调
  38.         /// </summary>
  39.         void VuforiaInitedCallBack()
  40.         {
  41.             m_localFilePath = Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml";
  42.             if (File.Exists(m_localFilePath))
  43.             {
  44.                 //Load Local
  45.                 StartCoroutine(LoadLocalFile());
  46.             }
  47.             else
  48.             {
  49.                 //Load NetWork
  50.                 StartCoroutine(LoadNetworkFile());
  51.             }
  52.         }
  53.         /// <summary>
  54.         /// 加载网络配置文件
  55.         /// </summary>
  56.         /// <returns></returns>
  57.         private IEnumerator LoadNetworkFile()
  58.         {
  59.             WWW wwwdat = new WWW(AppConfigConst.IMAGE_TARGET_FILE_PATH + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".dat");
  60.             yield return wwwdat;
  61.             Debug.Log(wwwdat.url);
  62.             WWW wwwxml = new WWW(AppConfigConst.IMAGE_TARGET_FILE_PATH + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml");
  63.             yield return wwwxml;
  64.             File.WriteAllBytes(Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".dat", wwwdat.bytes);
  65.             File.WriteAllBytes(Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml", wwwxml.bytes);
  66.             StartCoroutine(LoadLocalFile());
  67.         }


  68.         /// <summary>
  69.         /// 加载本地配置文件
  70.         /// </summary>
  71.         /// <returns></returns>
  72.         IEnumerator LoadLocalFile()
  73.         {
  74.             bool isVuforiaEnabled = VuforiaRuntimeUtilities.IsVuforiaEnabled();
  75.             if (isVuforiaEnabled && m_isLoaded == false)
  76.             {
  77.                 if (m_dataSet == null)
  78.                 {
  79.                     m_tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
  80.                     m_dataSet = m_tracker.CreateDataSet();
  81.                 }
  82.                 if (m_dataSet.Load(m_localFilePath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE))
  83.                 {
  84.                     m_isLoaded = true;
  85.                     m_tracker.ActivateDataSet(m_dataSet);
  86.                     UpdateImageTarget();
  87.                 }
  88.                 else
  89.                 {
  90.                     m_isLoaded = false;
  91.                 }
  92.             }
  93.             WWW www = new WWW("file:///" + m_localFilePath);
  94.             yield return www;
  95.         }


  96.         /// <summary>
  97.         /// 修改Imagetarget 的名称
  98.         /// </summary>
  99.         void UpdateImageTarget()
  100.         {

  101.             List<string> imagetargetNameList = new List<string>();
  102.             m_imageTargetBehaviours = FindObjectsOfType<ImageTargetBehaviour>();
  103.             for (int i = 0; i < m_imageTargetBehaviours.Length; i++)
  104.             {
  105.                 ImageTargetBehaviour imageTargetBehaviour = m_imageTargetBehaviours[i];
  106.                 imageTargetBehaviour.name = imageTargetBehaviour.ImageTarget.Name;
  107.                 imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();
  108.                 imageTargetBehaviour.gameObject.AddComponent<TurnOffBehaviour>();
  109.                 imagetargetNameList.Add(imageTargetBehaviour.name);
  110.             }
  111.             OnImageTargerLoadedEvent(imagetargetNameList.ToArray());
  112.         }

  113.         /// <summary>
  114.         /// 获取所有的识别图对象
  115.         /// </summary>
  116.         /// <returns></returns>
  117.         public ImageTargetBehaviour[] GetImageTargetBehaviours()
  118.         {
  119.             return m_imageTargetBehaviours;
  120.         }

  121.         protected virtual void OnImageTargerLoadedEvent(string[] obj)
  122.         {
  123.             var handler = ImageTargerLoadedEvent;
  124.             if (handler != null)
  125.             {
  126.                 handler(obj);
  127.             }
  128.         }
  129.     }
复制代码

注:外部如果需要动态加载资源 建议注册加载完毕的回调函数。。回调函数中返回了所有的识别图名称。
     当然:你也可以修改 直接返回识别图对象。进行自定义操作



分享至:
| 人收藏
回复

使用道具 举报

该用户从未签到

沙发
Blank
 楼主|
发表于 2016-4-14 22:25:28 只看该作者
PS:有任何问题 可以在帖子的下方提问 。我每天都会抽时间来回答大家
回复 支持 反对

使用道具 举报

该用户从未签到

板凳
sunShine 发表于 2016-5-3 21:42:37 只看该作者
AppConfigConst.IMAGE_TARGET_FILE_PATH中的AppConfigConst是什么东西,这个找不到,需要引入什么包?
回复 支持 反对

使用道具 举报

该用户从未签到

地板
Blank
 楼主|
发表于 2016-5-9 15:25:37 只看该作者
sunShine 发表于 2016-5-3 21:42
AppConfigConst.IMAGE_TARGET_FILE_PATH中的AppConfigConst是什么东西,这个找不到,需要引入什么包? ...

十分 抱歉 .最近比较忙 没有上线查看你的问题.
在这里先说声抱歉!!!
AppConfigConst.IMAGE_TARGET_FILE_PATH  是我在项目中使用的东西.
这个的意思就是识别图的包的下载地址.
如果还有其他问题 可以在下方继续提问
回复 支持 反对

使用道具 举报

该用户从未签到

6#
sunShine 发表于 2016-5-17 21:44:07 只看该作者
Blank 发表于 2016-5-9 15:25
十分 抱歉 .最近比较忙 没有上线查看你的问题.
在这里先说声抱歉!!!
AppConfigConst.IMAGE_TARGET_FILE_P ...

嗯,现在我可以在电脑上实现动态加载,但是放到android手机上就不能加载成功,执行
if (m_dataSet.Load(m_localFilePath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE)){}的时候,app就会闪退,这里还有什么需要注意的吗?
回复 支持 反对

使用道具 举报

该用户从未签到

7#
sunShine 发表于 2016-5-18 19:10:22 只看该作者
sunShine 发表于 2016-5-17 21:44
嗯,现在我可以在电脑上实现动态加载,但是放到android手机上就不能加载成功,执行
if (m_dataSet.Load( ...

我已经解决,是我自己加载了一个空的文件;这个方法可以实现动态加载,真的不错
回复 支持 反对

使用道具 举报

该用户从未签到

8#
some1205 发表于 2016-5-18 20:10:01 只看该作者
sunShine,你好,我没弄出来,能传份源码吗?谢谢!谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

9#
some1205 发表于 2016-5-18 21:29:51 只看该作者
我在PC上测试的,识别图加载出来了,但报错,NullReferenceException: Object reference not set to an instance of an object
回复 支持 反对

使用道具 举报

该用户从未签到

10#
sunShine 发表于 2016-5-19 17:34:22 只看该作者
some1205 发表于 2016-5-18 21:29
我在PC上测试的,识别图加载出来了,但报错,NullReferenceException: Object reference not set to an ins ...

代码跟跟楼主一样的,就是我把 WWW wwwdat = new WWW(AppConfigConst.IMAGE_TARGET_FILE_PATH + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".dat");代码改成了网上的直链地址,就可以把dat和xml下载下载,然后File.WriteAllBytes(Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml", wwwxml.bytes);也把路径改成自己的,就可以了。
PC上下载不了,那个文件,我试的时候,直接把dat和xml文件放要读取的路径里的
回复 支持 反对

使用道具 举报

12下一页
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.