企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# **静态模型的导出** ## 零、Blender和Unity的模型比例 **H子:** AOI老师,模型做出来之后,想要导出到Unity,但是又担心资源导出之后会各种混乱,所以有什么好办法处理呢。 **AOI:** 一般来说资源导出之后各种混乱基本都是自己的开发规范没做好吧,除了问题不要赖软件阿。 **H子:** 但是啊,导出模型之后,导入Unity,尺寸比例,还有角度朝向什么的,一不小心就出错了阿。 **AOI:** 这些的话,因为3D软件间各自使用的坐标系各有不同,所以最终确实会导致这样的结果。既然现在是使用Blender的话,那就直接确定Blender的规范吧。第一步就是先确认Unity和Blender之间的单位关系。 **H子:** 这样的话,直接用Blender默认的Cube导出之后,再跟Unity的Cube进行比较,就可以知道,在默认状态下,两个软件间的比例关系了吧。 **AOI:** 这个确实是一种简单易懂而又客观的做法。 **H子:** 那么直接就用新建场景的时候的默认的这个Cube就好了 ![](https://box.kancloud.cn/860c05773b37849a6545a76e44a3f531_1053x661.png) 导出FBX再倒入到Unity 和默认的Unity的Cube进行比较 ![](https://box.kancloud.cn/8a8643b05ef2e3c79e0a9166f3e55a3d_658x380.png) 啊,大了一倍呢。 ![](https://box.kancloud.cn/bfb1e116f4ccaa0de7188bd8ea507347_467x375.png) 这么说,Unity和Blender的尺寸比例是1:2 了? **AOI:** 所以你什么时候能改改这种做事不仔细的习惯。 **H子:** 嗯?? **AOI:** 再回去Blender看看Blender里面的Cube的具体参数。 ![](https://box.kancloud.cn/3773bd1adfaff8e1c314161d21ad7aad_609x393.png) 你看清楚了,这可是长宽高都是2的Cube。 **H子:** 啊,看到了。也就是说,实际上Unity和Blender的默认单位是1:1了。这样的话,只要以Blender的标准单位为标准统一制作即可。 **H子:** 确定好标准之后,首先根据标准调整模型就可以了吧。角色,场景模型的比例,实际上我建模的时候就是以Blender的cube为标准进行建模的呢。 **AOI:** 对的,确保模型的比例本身是很重要的,理应在建模阶段就已经考虑好。既然本身已经有一套标准的话,那么直接按照这套标准进行就好了。但是确保在Unity内部的比例和尺寸,会影响到光照,物理模拟等等相关的计算。所以尽可能确保比例和尺寸比较好。 **H子:** 那么我直接利用Blender内建的人形骨骼作为标准人体进行参考也是可以的吧。 **AOI:** 这倒是没有什么问题。 **H子:** 那么,就这样! ![](https://box.kancloud.cn/a33903e44702125158fceccda9e7ea6e_386x385.png) ![](https://box.kancloud.cn/dce07ef371406470f39784d22ae4120f_818x405.png) ## 壹、导出的基本设置 ### **1) 模型的材质** **AOI:** 那么,有检查一下模型的材质设置吗。 **H子:** 没问题的,毕竟这个是在做基础模型的时候就已经添加好的材质,自动化生成的模型都是这个基础模型的副本,所以材质方面没问题。 ![](https://box.kancloud.cn/c43ea591f1dfbd4515de5b7eb5064393_534x158.png) **AOI:** OK,可以。在这里明确一下的事情就是。你给材质进行的命名,在导入Unity的时候,如果选择了导入材质,那么自动导入的材质就会使用这里的材质命名。如果不设置材质直接导出一个模型,那么导入Unity之后,就会自动产生一个叫**No Name**的材质了。 为了不出错,所以材质的命名要规范。而如果这里使用了多组材质的话,就更应该仔细的细分了。而且这里也并不推荐一个模型使用多个材质。关于这一点,我们后面关于格式的时候再说。 **H子:** 恩,我这里并没有使用了多个材质的物体呢。那么下一步该是确认什么东西呢? **AOI:** 那么下一步,该确认一下模型的对象名称和网格名称了。 ### **2) 模型的网格名称** **AOI:**首先打开在大纲视图,把需要导出的对象展开看看吧。 ![](https://box.kancloud.cn/c6bd84b8a06d8f816f3f5a40fe12b9b4_477x64.png) 可以看到,大纲视图上面,橙黄色三角形图标的是对象,而白色三角形图标的是网格,材质球图标的自然就是材质了。 从这里可以得知,现在选中的对象,对象名称是TreeTri.002,而网格名称却是TreeTri.007,也就是说两者并不一致。 **H子:** 这里不一致会有什么问题呢? 啊,我知道了,导入Unity之后,如果要对Mesh而不是GameObject操作的时候,名称不同的话,索引会有难度吧。虽然对使用本身是没有太多的影响。 **AOI:** 对的,不过归根结底,这个是一个项目规范和项目需求的问题了。根据需求,你决定好网格和对象名称是不是需要一致。 **H子:** 啊,把全部模型改过来好累啊!快进行下一步吧! ### **3) 模型的朝向与Unity的前向** **AOI:** 这里有一件事情需要提醒一下,就是模型朝向的问题。因为Unity和Blender用的并不是同一套坐标系,所以建模和导出的时候,要牢牢的记住模型的朝向问题。 1. Blender的Z轴,是垂直地面向上的轴向,而对应的是Unity的Y轴,同时轴向相同,也就是上方。 2. Blender的Y轴的负方向,对应的是Unity的Z轴正方向,也就是前方。 3. Blender的X轴负方向,对应的是Unity的X轴正风向,也就是右方。 **H子:** 阿,老师,这样记忆起来好复杂啊。有什么方便的方法吗。 **AOI:** 这个时候,Blender自带的人形骨骼就是我们最好的朋友了。直接创建一个人形骨骼,人形骨骼默认状态下的脸朝向就是Unity的Z轴正方向,也就是Unity坐标系的前方,右手就是右,至于上的话,就没有什么好说了。 **H子:** 嗯嗯,这个就简单明白多了。 ### **4) 模型的变换塌陷与清零** **AOI:** 那么,进行下一步,为了模型在Unity里面能正常的调用,不会出现坐标偏差,所以必须确保导出的模型每一个的中心都落在世界中心(0,0,0)上。 而现在可以看到的就是,因为当初为了方便观察,所以随机生成的树木都落在了场景的各处。 所以在导出前,都必须确保模型的变换归零或者塌陷。 而Blender的重置快捷键是Alt+G,Alt+R,Alt+S,分别对应位置,旋转和缩放的归零。 如果已经确定当前的模型的变换,则不应进行归零操作,而是塌陷变换。对应操作为,选中对象,按下Ctrl+A,在弹出的快捷菜单选择需要塌陷的项目即可。 ![](https://box.kancloud.cn/0f618624896b5c47f759f5604278d5c2_199x293.png) **H子:** 把位置归零之后,再塌陷了变换之后就变成这样了。 ![](https://box.kancloud.cn/cfb9ef0da53df4c66eacd286e6cb7d23_462x260.png) ### **5) 导出格式的选择** **H子:** 模型的参数各方面都设置好之后,就该导出模型了吧。因为是静态模型,所以无需专门用FBX吧,那么我直接选择OBJ就可以了吗? **AOI:** OBJ作为纯粹的单个材质静态模型也并非不可,不过其实相较之FBX格式,OBJ格式的优势其实几乎不存在。而最大的好处则是OBJ格式本质上就是明文记录的模型数据,所以只要遵循格式,就可以直接读取,无需第三方库的介入。不过这个优势,对于实际上开发来说却并不是很重要。 首先我们来看看一些实际情况吧。 1. OBJ并不支持多个材质的模型,所以,当你一个模型使用了多个材质的时候,导出的OBJ文件就会变成一个材质一个对象的结构的模型组。导入到Unity之后看起来是这样的: ![](https://box.kancloud.cn/ea1f0235ab103106cff9d135dfd64234_398x97.png) 2. OBJ并不支持骨骼形变动画的记录,稍作一个测试: 制作这样的一段简单的骨骼动画 ![](https://box.kancloud.cn/c8e3058565aa043c177c0ae3707b9425_461x376.png) ![](https://box.kancloud.cn/d16c081c88f8e62ee6c0609f6450500c_424x333.png) 导出的时候勾选动画 ![](https://box.kancloud.cn/1b2262845002f497f2c25892ddd67d26_225x291.png) 最后看起来是这样的: ![](https://box.kancloud.cn/11162f62e5ed6ecba849f6a27fe8dcea_1047x405.png) 3. OBJ作为明文记录的文件格式,对于同样的静态模型,有时候可能会有数据冗余,导致模型数据还会比FBX格式更大。 因此,实际上直接使用FBX格式会更好,当有对单材质静态模型数据直接操作,又不依赖第三方SDK的时候,OBJ会是一个比较好的选择。而大部分情况,FBX会是最好的选择。 ### **5)导出参数的设置** **H子:** 好了!选中需要导出的模型,然后点击文件-导出-FBX,打开了FBX格式的导出窗口了。 **AOI:** 那么接下来就要好好设置一下导出的参数了。这里虽然并不难,但是实际上也有不少需要留意的细节。 **H子:** 首先果然是主标签面板的参数吧 ![](https://box.kancloud.cn/8da10034233c8ccda6c14dcbacea4319_242x382.png) **AOI:** 如果这里保持默认,什么都不改的话,那么就会直接把整个Blender项目里面的模型都一起导出了。所以,在导出的时候要注意,因为实际上只需要导出有用的数据即可,但是项目里面为了方便,可能会留存有大量的游戏实际开发中并不需要的数据。 所以这里建议: 1. 勾选上【选定的物体】这一选项。 2. 同时,因为是导出模型,所以并没有其他的东西,因此下面的导出类型多选栏里面,只要选上网格即可 3. 而!EXPERIMENTAL! Apply Transform,也就是应用变换选项,这个选项建议静态模型的时候勾选上。在这个功能的前面加上了实验特性的标签,意味着这个功能可能会出现不可预料的错误。但是对于静态模型来说,这并没有任何错误可以发生。而且,勾选之后,就可以 **解决模型导入Unity之后,X轴出现-90度的问题。** 而其他的参数,对于Unity游戏开发,并非必要的选项,直接无视即可。但是当需要导出动态模型的时候,这个选项就需要斟酌了,不过这个事情留到动态模型导出的时候再作讨论。 ![](https://box.kancloud.cn/1144f238a0775dbe3169cd192e9479c9_237x392.png) 而【几何数据】标签下面并不需要太多的修改,因为当你导出模型到游戏引擎的时候,不管怎么样,都需要应用修改器的操作。而其他参数,对导出模型的影响并不算大。当然,要不要勾选并导出【切向空间】,这个取决于你需不需要对切向空间的数据的利用。一般没有特殊需求的情况下,并没有导出的必要。 ![](https://box.kancloud.cn/28b67000bda3c6b42b760ca78717c81d_243x289.png) 【骨架】标签下面的参数,同样不需要多做修改,如果没有骨骼的模型,则直接无视这一栏 ![](https://box.kancloud.cn/21b38a418b831104954768dfb32fb591_242x247.png) 要注意的一个地方就是【Add Leaf Bones】选项,如果勾选了这个选项,那么就会在导出的时候,骨骼的末端,再添加一个以xxxx_end格式命名的末端骨骼。如果取消勾选,就不会产生这个末端骨骼,同样是根据需要进行设置。 因为目前是进行静态对象的导出,所以【动画】标签下的参数直接去掉【烘焙动画】的勾选即可。其他参数的意义,在需要导出动态物体的时候再作讨论。 ![](https://box.kancloud.cn/bc91f8821078384227b68c1e02a9d443_255x271.png) 而至此,则已经完成了模型导出的关键设置。只需要设置好文件的路径和名称,点击导出即可。 **H子:** 全部树木都塞一起了啊。只能在Unity里面手动一个个模型的拆开做成Prefab吗? ![](https://box.kancloud.cn/77e34c3ee70e8d2b8947cf32f0b12e3a_264x271.png) **AOI:** 在这里的话,倒是建议使用脚本进行批量化导出了,可以根据需要,把这一堆模型每个独立的导出成一个FBX文件。就算对单个模型修改,也可以只修改对应的模型就可以了,而无需修改一个模型,就全部重新导出一次。 把资源全部独立分开导出,可以很大限度的降低风险。 **H子:** 那么之后果断要写一份把上面的操作全部自动化完成的脚本!这样手动太烦了!简直浪费人生! ## 贰、H子的静态模型导出总结笔记 1. 确保模型的材质与材质命名,如非必要,尽量避免一个模型多个材质 2. 确保模型的对象名和网格名。 3. 确保模型的朝向与变换的塌陷和清零,确保模型的底部或者原点落在世界中心,避免导出的模型坐标偏移 4. 如有特殊需求,导出模型一律FBX总没错 5. 导出模型的时候记得勾选【选定的物体】一栏,以免导出多余的东西 6. 可以的话,用脚本导出,用脚本完成模型的规范化处理。