Skip to content

内容制作规范

更多性能上的制作参考该文档资源限制与优化

1 导入规范

所有内容导入场景后需要作为World的子级GameObject.

导入文件规格
文件格式

- fbx、obj、gltf、glb、usdz

- 由于Unity 3D对中文字符的兼容性较差,请使用英文对实体单位进行命名.

模型面数

- 单个模型的面数建议不超过30000;

- 只支持三角面;

- 3D模型不要直接使用高模,采用高模烘低模,细节通过贴图来表现,如法线贴图、AO贴图等等。

贴图- 由于各个三维软件模型自带的材质编码格式不同Unity不一定支持材质解析,大多数情况下需要在Unity中重新进行材质调整
贴图材质

- 贴图源文件为png、jpg、jpeg、tga格式

- 单张图分辨率小于2048*2048

- 支持8bit色深图,10bit色深图可能无法良好的在所有设备上显示正确颜色

透明视频- 即带alpha通道的视频,最多不超过3个,低性能机型可能只能流畅播放1个视频

模型的枢轴点(Pivot Point)尽量放在Mesh内部,最好在中心位置,而不是在距离Mesh很远的地方。

  • 空间编辑器的单位为米. 在原点我们放置了一个和现实世界身高1.65人对应 的工具小人作为尺寸参考对象.帮助用户在缩放内容时对内容大小进行模糊创作.

  • 慎用动态阴影,静态物体尽量使用烘焙阴影,不需要计算阴影的Mesh请关闭Rendering组件中的ReceiveShadows和CastShadows。需要计算阴影的物体也根据投射阴影还是接收阴影来开启或关闭这两个选项。

  • 空间编辑器中 Color Space设置为 Gamma, 切换后不可在山海镜App中体验.

2 动画

2.1 Timeline动画

编辑器支持使用 Timeline 插件制作管理大量动画

创建一条新的时间线赋予 World, 将动画拖动到时间线并添加动画对应的物件.

为了保持内容观看时的连贯性,一般我们建议将时间线的Wrap Mode选择为Loop

2.2 使用外部骨骼动画

外部动画 Rig 格式必须为 Humanoid,模型需要符合 humanIK

动画和模型的 Rig 均要设置为 Humanoid

将动画 clip 拖到模型上,再将动画文件拖到模型中作为子集后模型即可播放动画

3 2D 内容

2D 面片如果只是显示图片,能用 Quad 就不用 Plane,除非有处理顶点的需求.

4 视频

4.1 普通视频

将视频拖入 Unity 再拖到 Quad 上.选中 Quad 即可看到右侧的 inspector 上出现了 Video Player 栏. 将新建一个材质球使用 i3dEngine/UnlitMovie shader,赋予 Plane,再勾选 Loop 即可.

为了在设备上有良好的用户体验,建议视频按照以下格式进行处理:

  • 原速播放时长少于15秒
  • 文件大小小于30M
  • 格式转换为mp4
  • 视频最长边不超过1920像素
  • 视频编码格式建议为H.264
  • 音频编码格式建议为LC-AAC

4.2 透明视频

为考虑到不同设备用户的体验,在同一个场景内请勿放置超过3个透明视频,且视频质量越高、数量越多,对低性能设备的兼容性就越差

Unity在 安卓端的视频支持不是很好, 需要双端体验的内容请使用以下制作方法来制作特殊的透明视频。

在视频软件中将视频处理成左半边为带透明通道视频,右边为仅 Alpha 通道视频,导出格式为 mp4.

将视频拖到 Quad上,材质球使用 i3dEngine/UnlitTransparentMovie

为了在设备上有良好的用户体验,建议视频按照以下格式进行处理:

  • 原速播放时长少于10秒
  • 文件大小小于30M
  • 格式转换为mp4,制作过程中格式可能为avi、mov,只需要最终格式为mp4即可
  • 视频最长边不超过1920像素
  • 视频编码格式建议为H.264
  • 音频编码格式建议为LC-AAC

4.3 音频

在 GameObject 栏中添加 Audio Source

在场景中会出现一个小喇叭, 在右侧 Audio Source 中的 AudioClip 中选择要添加的音源,并勾选 Loop

5 天空球

天空是环境 AR 必不可少的元素, 在空间编辑器自带的素材库中带有一个天空球.将其拖入场景中再进行编辑即可得到各种梦幻的天空效果. 更多天空球用法参见天空球模板教程。

⚠️天空球的 render queue 数值要设置高于 reality scene shader 的数值

程序优化

设备性能最佳实践

详见: 资源限制与优化

额外说明

  1. 不在 Update 里 FindGameObject 或 GetComponent,这些操作要放在其他一次性调用的方法里处理好