游戏引擎通常并不具备专业的建模功能,所以通常情况下模型都是在专业的三维软件中进行设计,然后再通过特定格式的文件导入到游戏引擎中进行游戏开发。Unity支持多种外部导入的模型格式,如FBX、3ds、dxf和obj等。
本文中介绍的FBX文件是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件,通过FBX用户能访问大多数三维供应商的三维文件。FBX文件支持所有主要的三维数据元素以及二维、音频和视频媒体元素,是当今主流的文件格式。通过在3ds Max中将模型导出为FBX格式文件,再将文件导入到Unity中,就能够对模型进行进一步的游戏设计。在导出导入FBX文件的过程中不少用户会发现模型的尺寸会发生变化,“明明在3ds Max中的设计尺寸为1米,导入到Unity却扩大了一百倍”。究其原因,是因为二者单位转换的问题,弄明白二者之间的关系,就能节省很多开发时间。本文中采用Unity2018.3.0与3ds Max2012进行示范演示。
第一种情形:
(1)在3ds Max2012中将系统单位设置“1单位 = 1m”,如图1所示。(设置系统单位的方式:在菜单栏中选择“自定义”-“单位设置”-“系统单位设置”)
(3)点击3ds Max左上角的图标,选择“导出”-“导出”,命名为“testCube.FBX”,这样一个最基础的FBX文件就创建完成。
(4)将FBX文件导入到Unity场景中。在Unity项目中新建文件夹,命名为“Prefab”,将上一步生成的FBX文件放置到该文件夹下,并将模型拖至场景中,为了后续便于区分,给该正方体添加黄色材质。如图3所示。
(5)为了验证3ds Max与Unity之间模型的尺寸关系,我们需要知道Unity中模型的实际尺寸。Unity中默认单位为米。通过以下脚本获取模型的尺寸
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetSize : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Vector3 theSize = GetObjectSize();
print(theSize);
}
// Update is called once per frame
Vector3 GetObjectSize()
{
Vector3 realSize = Vector3.zero;
Mesh mesh = GetComponent<MeshFilter>().mesh;
if(mesh == null)
{
return realSize;
}
Vector3 meshSize = mesh.bounds.size;
Vector3 scale = transform.lossyScale;
realSize = new Vector3(meshSize.x * scale.x, meshSize.y * scale.y, meshSize.z * scale.z);
return realSize;
}
}
将脚本挂载到测试正方体中,运行程序,在控制台输出窗口就会显示尺寸,如图4所示。
可以看出模型在Unity中的尺寸为2m x 2m x 2m,与我们在3ds Max中的尺寸一致,并且注意到图3右侧Inspector面板中Transform一栏中的Scale的三个值全为1。
第二种情形
(1)将第一种情形中3ds Max中的系统单位设置为"1单位=1cm",同样绘制边长为2m的正方体。在导出FBX文件时仍然选择场景单位转化为“米”,注意到此时比例因子变成0.01,如图5所示。
(2)将导出的FBX文件导入到Unity场景中,如图6中红色立方体所示。通过脚本获取立方体尺寸大小。
从图中可以看出,立方体的尺寸依旧为2m x 2m x 2m,但是Inspector面板中Transform一栏中的Scale的三个值全为0.01。这也就可以看出,因为在3ds Max导出设置时比例因子为0.01,这也就使得Scale变为0.01。
第三种情形
(1)3ds Max中的系统单位设置为"1单位=1m",同样绘制边长为2m的立方体。在导出FBX文件时仍然选择场景单位转化为“厘米”,注意到此时比例因子变成100,如图7所示。
(2)将导出的FBX文件导入到Unity场景中,如图8中浅蓝色立方体所示。通过脚本获取立方体尺寸大小,物体尺寸仍为2m x 2m x 2m。但是Inspector面板中Transform一栏中的Scale的三个值全为100。这也就可以看出,因为在3ds Max导出设置时比例因子为100,这也就使得Scale变为100。
第四种情形
(1)在Unity的project面板单击第三种情形中创建的正方体,会在相应位置显示该模型的Inspector面板,可以注意到Convert Units属性是默认选中的,我们现在取消选中,如图8所示。
(2)再将该立方体拖放到场景中,会发现立方体会扩大很多倍,使用脚本获取尺寸,大小为200m x 200m x 200m,如图10所示。
为什么会发生这种情况呢? 因为我们在3ds Max模型的单位为米,而导出设置时场景单位为厘米,这样模型大小就可以表示为200厘米 x 200厘米 x 200厘米。因为在默认条件下,Convert Units选项是被选中的,而且选项中有指出"1 cm(File) to 0.01m(Unity)",这样最终转到Unity中就是2米 x 2米 x 2米,可以理解为“带单位转换”。但是如果取消Convert Units选项,Unity就不会识别FBX文件中模型的单位是多少,而只是默认识别为200单位 x 200单位 x 200单位 。之前讲过Unity中默认的单位为"1单位=1米",这样导入到场景中就会变成200米 x 200米 x 200米,“可以理解为不带单位转换”。
总结
经过上述几个情形的举例,我们已经能够大致了解Unity与3ds Max之间的单位关系。3ds Max中的比例因子参数就是对应了Unity的Transform中的Scale属性。而场景单位就是对应于Unity中的单位,为与Unity单位一致,场景单位最好设置为米。将模型导入到Unity之后要注意观察其Convert Units选项,通常情况下,为了保证3ds Max与Unity中的模型尺寸一致,需要将该选项选中。