邓杰
贫民
贫民
  • UID569
  • 粉丝0
  • 关注0
  • 发帖数1
阅读:8965回复:0

网页动态加载三维模型

楼主#
更多 发布于:2019-04-30 11:35
在Web端对存储在服务器上的三维模型进行动态的加载生成的实现,可分为三个过程:1.了解Unity外部资源动态加载方式;2.选择Web网页可使用的方式;3.实现Web端的动态加载和生成。
1.Unity可实现外部资源动态加载的方式
1.   Resources文件夹
Resources文件夹是一个只读的文件夹,可通过Resources.Load()来进行对象的读取。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。
不建议使用Resources系统:
1.使用Resources文件夹将会使细粒度的内存管理变得更难
2.对Resources文件夹的不恰当使用会导致应用程序构架和启动时间变长
3.随着Resources文件夹数量的增加,在这些文件夹中管理Asset将会变得越来越难
4.使用Resources系统会降低项目向不同平台提供定制内容的能立,并且导致项目无法进行增量内容更新
当然也有两种特殊情况,Resource还是很有用的:
1. Resources系统简单易用的特点使其非常适合用于快速开发原型。不过,当项目进入正式开发阶段时,应该停止使用Resources文件夹。
2. Resources文件夹可以用于处理一些简单的内容:
 在项目的整个生命周期中都被使用的内容
非内存密集型内容
不太可能添加补丁或者不受平台和设备影响的内容
用于最小化引导的内容
2. StreamingAssets文件夹
StreamingAssets和Resource很像,StreamingAssets同样也是一个只读的文件夹,可通过WWW类来读取。不过两者也具有很大的差距,那就是Resource文件夹中的内容在打包时会被进行压缩和加密,然而StreamingAssets文件夹中的内容则会被原封不动的打包出来,因此建议StreamingAssets主要用来存放配置文件。
3. AssetBundle
AssetBundle就是把prefab或者二进制文件封装成AssetBundle文件,并且可保留prefab之间的依赖关系。其实AssetBundle只是一种使用LZMA压缩方式压缩的资源文件。
4. PersistenDataPath
这个路径下是可读写。而且在IOS上就是应用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的时候,ProjectSetting页面有一个选项Write Access,可以设置它的路径是沙盒还是sdcard。1.内容可读写,不过只能运行时才能写入或者读取。 提前将数据存入这个路径是不可
的。2.无内容限制。你可以从 StreamingAsset 中读取二进制文件或者从 AssetBundle 读取文件来写入 PersistentDataPath 中。
3.写下的文件,可以在电脑上查看。同样也可以清掉。4.需要使用WWW类来读取。
2.选择Web网页可以使用的方式
了解完上面四种Unity外部资源的加载方法后,现在来看什么方法适合于网页动态加载存储在服务器上三维模型。首先Resource和StreamingAssets文件加载方法大多用于本地的存储以及加载,且如果我们需要的三维模型过多,程序发布容易出错。PersistenDataPath很明显在网页不可使用。就剩一个AssetBundle,那是否选取这个方法?使用这个方法又有什么好处呢?1. 提供了简便的脚本API,可对Unity编辑器进行工具扩展,实现AssetBundle资源批量打包。
[MenuItem("AssetsBoundle1/Build AssetBoudles")]
   static void BuildAllAssetBoundles() {
       string strDir = "AssetBoundles";
       if (Directory.Exists(strDir) == false) {
           Directory.CreateDirectory(strDir);
       }
  BuildPipeline.BuildAssetBundles(strDir,BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.WebGL);
}

图片:1.png

图片:2.png


2.Unity本身会处理所有的依赖关系,生成了一种叫做manifest的文件,用于记录资源之间的依赖关系,并以链式结构记录,修改时只需修改链的其中一环,所以最后我们可以直接将打包好的三维模型AssetBundle文件放到服务器上进行使用。

图片:3.png


3.实现Web端的动态加载和生成
1.实现WebGL与Unity之间的通信
Application.ExternalCall("SendMessageToUnity",address); //由Untiy向Web端发送,调用Web端SendMessageToUnity方法并且传递参数addtess。
SendMessage("ReadAssetbundle","MyFunction","http://localhost:8189/AssetBoundles/temp.ab-1,1,1"); //由Web端向Unity发送,调用Unity场景中名为ReadAssetbundle的物体上的MyFunction方法,并且传递参数http://localhost:8189/AssetBoundles/temp.ab-1,1,1
2.实现下载并且解析生成
.Split(); //将得到的参数拆分为服务器下载网址、位置、旋转和颜色的信息
using (WWW bundleW = new WWW(address)); //下载,用using的方式,为了web自己释放
AssetBundle assetBd = bundleW.assetBundle;
Object[] objs = assetBd.LoadAllAssets(); //将下载得到的AssetBundle文件进行解析成Unity的Object格式
foreach (Object obj in objs) {        
Instantiate(obj,position,Quaternion.identity);
} //最后进行遍历实例化物体
[邓杰于2019-04-30 15:59编辑了帖子]
游客

返回顶部