Unity引擎打包AssetBundle后模型网格数据丢失问题

这篇具有很好参考价值的文章主要介绍了Unity引擎打包AssetBundle后模型网格数据丢失问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是阿赵。
在项目里面,有时候会遇到这样一个问题。在Unity编辑器里面编写了一个shader,在编辑器看,效果都是没有问题的。但如果把资源打包成AssetBundle后,会发现shader的表现不对了。遇到了这种问题的时候,一般人会各自的怀疑,怀疑是不是shader写得不对,导致在不同平台的表现不对。
实际上,有很多时候这并不是shader本身的问题,而是shader需要的数据丢失了,比如顶点颜色、法线、切线等。

一、模拟一个环境

我这里准备了2样东西:
1、一个shader,为了简单,我直接用ase连了一下线。这个shader有2个功能,一个是根据顶点颜色显示模型颜色,第二个是做了个边缘光效果。
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

2、从3DsMax里面导出了一个茶壶模型。茶壶模型带有顶点颜色,颜色是从底部到顶部从黑到白色渐变。
把模型从3DsMax导出成fbx,然后导入Unity,并且赋予材质之后,效果应该是这样的:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

二、打包AssetBundle并加载

我这里模拟了拆分依赖的情况来打包AssetBundle,其中茶壶的预设、材质球和茶壶的fbx,都分别设置了AssetBundleName,并打包成3个AssetBundle。
然后加载了,通过依赖查找的方式,先加载了fbx和材质球的AssetBundle,然后再加载茶壶预设的AssetBundle。并把茶壶生成在场景里面。看到的效果是这样的:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

很明显,和刚才在编辑器里面看到的效果不一样。

三、问题和解决

为了验证一下出现问题的原因,我们可以单独把模型的顶点色、法线、切线用shader输出一下来检查。
下面的图片里面,左边的茶壶是通过AssetBundle加载的,右边的是直接在编辑器拖进去的。
顶点颜色:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

世界空间法线:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

世界空间切线:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

可以看出来,通过AssetBundle加载的茶壶,它的顶点颜色丢失了,变成了全部都是白色。法线数据还在,但切线数据也丢了。
为什么在打包AssetBundle的时候,模型网格的数据会丢失呢?
可以打开PlayerSetting看看,里面有2个选项:
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

Vertex Compression选项,看看说明可以知道,这是一个对顶点数据的压缩。压缩顶点数据可以减少内存和带宽的占用,但精度会变低。从说明可以知道,这个选项只会降低精度,并不会把数据直接丢弃。所以这个选项并不是引起问题的原因。
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

再看来Optimize Mesh Data选项。这个选项直接是去掉了不使用的网格组件数据。
这里要回头看看一个问题,由于我们把fbx单独打包了AssetBundle。而由于这个fbx在单独打包的时候,并不知道有什么材质球使用了它的哪些属性,所以它会认为,除了必要的顶点、索引和UV信息以外,其他的数据都是可以被丢弃掉的。
为了验证这个问题。我取消了fbx和材质球的单独打包,只打包预设作为AssetBundle。果然shader的显示就正常了。
但实际项目中,由于同一个fbx被多个模型预设使用,为了减少重复依赖打包,我们是不可避免的把网格模型单独打包AssetBundle作为依赖的。所以,这个问题不能简单的整体打包来解决。
下面来看看解决的办法。

方法一:

很明显的,由于Optimize Mesh Data选项导致数据被丢弃,我们只要不勾选这个选项,那么数据就不会被丢弃了。

方法二:

不要直接打包Fbx,而是通过ctrl+D,把Fbx里面的mesh复制出来,然后再把这个mesh作为资源来打包AssetBundle,预设上面也不要引用fbx,而是引用复制出来的mesh。
Unity引擎打包AssetBundle后模型网格数据丢失问题,Unity功能与问题解决,unity,游戏引擎,AssetBundle,顶点信息

这样操作之后,打包AssetBundle再加载,顶点数据同样的不会丢失。

对比这两种解决方法,我更倾向于第二种。这是因为,fbx在导入unity的时候,其实还带着其他的数据,比如导入或者unity自动生成的材质球数据。这些数据我们一般都不希望使用的。所以复制出我们想要的网格数据使用,就避免了引用整个fbx,也避免了产生一些不必要的内存和加载的问题。文章来源地址https://www.toymoban.com/news/detail-725741.html

到了这里,关于Unity引擎打包AssetBundle后模型网格数据丢失问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Unity-AssetBundle Browser 打包和加载

    Unity-AssetBundle Browser 打包和加载

    进入unity手册中,搜素 Unity Asset Bundle Browser 工具,选择你使用的版本号,根据显示出的操作进行资源导入即可。 注:有的版本可能没有资源链接,可以百度一下有很多。 1、制作预制体(省略)  2、选择一个预制体,在Inspector窗口下方,设置预制体的ab包名(包名只能为小写字

    2024年04月13日
    浏览(11)
  • Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

    Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

    1、文章介绍 2、具体思路和写法         (1)AB包的打包         (2)AB包的加载         (3)AB包卸载 3、结语 本篇博客主要起记录和学习作用,简单的介绍一下AB包批量的打包和加载AB包的方式,若各位同学有幸看到本篇博客,希望能够对你有所帮助。 (1)

    2024年02月04日
    浏览(11)
  • Unity 解决SpriteAtlas图集打包AssetBundle白图问题

    Unity 解决SpriteAtlas图集打包AssetBundle白图问题

    之前文档上说勾选了Include in build之后,就不需要自己增加一个Binding脚本,但是仍然会弹出警告,并且会出现白图现象 Tight Packing 勾选之后当Sprite有透明通道可能会出现错位 不推荐勾选 选项取消勾选之后打包AssetBundle会报警告 并且出现白图现象 那是因为没有进行bing  Sprite

    2024年02月11日
    浏览(62)
  • Unity中使用AssetBundle打包与加载的注意事项

    Unity中使用AssetBundle打包与加载的注意事项

    一、使用AssetBundle进行打包与加载 个人觉得可以参考以下两篇博客,这个网上相关教程很多,还不明白的可以去百度,或者给我留言。 Unity 打包与加载AssetBundle(加载对应的依赖) Unity中的AssetBundle 二、使用AssetBundle进行加载的时候注意事项: 注意事项一:AssetBundle名字和设置

    2024年02月11日
    浏览(9)
  • 【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)

    【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)

    需要源码及依赖请点赞关注收藏后评论区留言私信~~~ AssetBundle最重要的操作就是AssetBundle打包 下载 加载以及卸载 下面就来了解一下AssetBundle的常用操作 AssetBundle打包主要用到下面两个API BuildAssetBundles(string outputPath,AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions,BuildTarg

    2024年02月10日
    浏览(15)
  • 从有限元到Unity——从abaqus网格模型文件到Unity模型数据

    从有限元到Unity——从abaqus网格模型文件到Unity模型数据

    一、从有限元到Unity——有限元网格信息导出及分析 二、从有限元到Unity——Unity网格编程 三、从有限元到Unity——从abaqus网格模型文件到Unity模型数据 四、从有限元到Unity——有限元分析结果导出 五、从有限元到Unity——渲染管线与着色器   上一篇文章大概说了Unity的网格

    2024年02月03日
    浏览(43)
  • [游戏开发][Unity]Assetbundle打包篇(5)使用Manifest二次构建资源索引

    [游戏开发][Unity]Assetbundle打包篇(5)使用Manifest二次构建资源索引

    打包与资源加载框架目录 正文开始前,先把打包代码放过来,请注意,前面的代码已省略,自己去对比前面的文章。本篇文章从第一次执行打包代码开始。 第一次调用BuildPipeline.BuildAssetBundles打包API后(详见代码第七行),会返回AssetBundleManifest的引用, 【疑问】: BuildPipe

    2024年02月03日
    浏览(8)
  • 【Unity基础】2.网格材质贴图与资源打包

    【Unity基础】2.网格材质贴图与资源打包

        大家好,我是Lampard~~     欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢      第一次接触3D物体的话,会觉得好神奇啊,这个物体究竟是由什么组成的呢?其实3D物体基本就是由网格,材质和纹理3个部分构成的 (1)网格     那什么是网格?首先需要知道

    2024年01月22日
    浏览(11)
  • Unity的AssetBundle系统来动态加载FBX模型

    在Unity中,可以使用C#脚本和Unity的AssetBundle系统来动态加载FBX模型。以下是一个简单的示例,演示如何动态加载FBX模型: 准备FBX模型 首先,准备一个或多个FBX模型,并将它们导入到Unity项目中。确保每个FBX模型都有一个独立的游戏对象,并且已经被正确地设置为“Static”或“

    2024年02月06日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包