请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

本文来自

EasyAR 教程

EasyAR 教程

1 人已关注

EasyAR引擎使用教程,使用案例。

精选帖子

【AR学院】使用Assetbundle打包资源到SD卡并读取

[复制链接]

2

主题

5

帖子

34

积分

新手上路

Rank: 1

积分
34
01828 arvrschool 发表于 2015-12-25 15:26:23
本帖最后由 arvrschool 于 2015-12-25 15:44 编辑

欢迎加入AR/VR技术交流群 129340649 转自AR学院:www.arvrschool.com
Assetbundle的原理及实现代码参考 雨松MOMO 的教程
(1)在Assets/Editor文件夹下创建脚本:ExportAssetBundles.cs
  1. using UnityEngine;
  2. using UnityEditor;
  3.             
  4. public class ExportAssetBundles : MonoBehaviour {
  5.             
  6.     [MenuItem("Custom Editor/Create AssetBunldes Main")]
  7.     static void CreateAssetBunldesMain ()
  8.     {
  9.         Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);

  10.         foreach (Object obj in SelectedAsset)
  11.         {
  12.             string sourcePath = AssetDatabase.GetAssetPath (obj);
  13.             //本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
  14.             //StreamingAssets是只读路径,不能写入
  15.             //服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
  16.             string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
  17.   //   if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies, BuildTarget.Android))
  18.        if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies))
  19.             {
  20.                 Debug.Log(obj.name +"资源打包成功");
  21.             }
  22.             else
  23.             {
  24.                 Debug.Log(obj.name +"资源打包失败");
  25.             }
  26.         }
  27.         //刷新编辑器
  28.         AssetDatabase.Refresh ();  
  29. }
  30. }
复制代码
此脚本要注意的地方:
1、头文件脚本放置的位置;
2、注意第20行与第21行,分别是用来打包使用在Android平台上的AB文件和使用在PC端上的AB文件)
在哪个平台测试就要用相应方式导出的AB文件,不能混用(区别在于最后的那个参数);
3、一次只能打包一个资源(批量打包请继续研究雨松的教程)。
4、记得在Assets下创建一个StreamingAssets文件夹(如果原本没有的话)
        脚本保存完之后,刷新工程(保存一下),会在Unity菜单栏出现Custom Editor/Create AssetBunldes Main选项。打包流程:将要打包的模型资源保存成prefab → 选中此prefab → 选择Create AssetBunldes Main菜单项 → 导出成功。将导出得到的.assetbundle文件通过数据线放入手机SD卡根目录下等待测试吧。
(2)在控制识别到识别图的脚本

1、添加一个函数:
  1. //读取一个资源
  2. private IEnumerator LoadMainGameObject(string path)
  3.         {
  4.             WWW bundle = new WWW(path);
  5. yield return bundle;
  6. //加载到游戏中
  7.             yield return Instantiate(bundle.assetBundle.mainAsset);
  8. bundle.assetBundle.Unload(false);
  9.         }
复制代码
2、在识别函数的最后添加下列语句:
表示识别到识别图之后,加载相应的模型进场景。
  1. //      StartCoroutine(LoadMainGameObject(PathURL + "carcar.assetbundle"));//PC端测试
  2.   //    StartCoroutine(LoadMainGameObject("file:///storage/emulated/0/carcar.assetbundle"));//Android端测试(绝对路径)
  3.         StartCoroutine(LoadMainGameObject("file://" + Application.persistentDataPath + "/carcar.assetbundle"));//Android端测试(相对路径)
复制代码
          这三句分别用于PC端测试和Android端测试。Android端的路径请注意路径格式,在真机中Application.persistentDataPath 得到的路径名是
/mnt/sdcard/Android/data/com.xxx.xxx/files,因此AB文件也要相应的找到那个文件夹的位置放置。
3、在丢失识别函数最后添加下列语句:
表示在识别图丢失之后将识别图上对应的模型从场景中删除
  1. Destroy(GameObject.Find("carcar(Clone)"));
复制代码
           从上面语句我们可以注意到,从AB文件读取来的资源会自动在后面添加 (Clone) ,比如我的资源本身名字是carcar的,加入场景后自动变成了carcar(Clone),因此操作时应该对物体名字做出相应的修改。

(3)创建一个脚本:ModelShow.cs (注意不能放在Editor文件夹中,与步骤(1)区分开来
          此脚本用来对识别到识别图后加载进场景的模型进行位置、大小等方面的调节,因为模型加载进场景中时默认坐标为0,0,0 ,大小为原始大小,不利于我们观看。
  1. using UnityEngine;
  2. using System.Collections;
  3.          
  4. public class ModelShow : MonoBehaviour {
  5.          
  6.     public int count;
  7.     GameObject obj;
  8.     void Start () {
  9.         count = 0;
  10.     }

  11.     void Update () {
  12.         if (count == 0)
  13.         {
  14.             if (GameObject.Find("carcar(Clone)"))
  15.             {
  16.                 obj = GameObject.Find("carcar(Clone)");
  17.                 obj.transform.parent = GameObject.Find("ImageTargetCar").transform;
  18.                 obj.transform.position = GameObject.Find("ImageTargetCar").transform.position;
  19.                 obj.transform.localScale = new Vector3(0.024f, 0.024f, 0.024f);
  20.                 count++;
  21.             }
  22.         }
  23.         if (GameObject.Find("carcar(Clone)") == null)
  24.         {
  25.             count = 0;
  26.         }
  27.     }
  28. }
复制代码
         值得注意的是:如果模型身上带有脚本,在工程中要存在对应的脚本,加载模型到场景中后会根据脚本名字寻找对应的脚本重载挂在物体上。
最后一步:导出APK时别忘了打开SD卡读取权限。
Player Settings → Other Settings → Write Access 选择 External(SDCard)
完成,导出APK测试吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表