跳转到内容

整体导出流程

  • 入口LayaAir3Export.ExportScene()
  • 核心类HierarchyFile · NodeMap · ResoureMap
  • 产物.ls / .lh / .lm / .lmat / .lani

Unity 编辑器中打开导出工具

导出入口: Unity 菜单 LayaAir3D 3.0 / Export Tool 打开导出窗口;左侧 Hierarchy 即待导出的场景层级,场景视图为 3D Game Kit Lite 关卡。

本节给出整条流水线的全景:从点下「导出」到文件落盘,插件依次走过六个阶段。 六个阶段依次为——入口与配置 → 多场景循环 → 层级收集(展开为节点列表)→ 节点映射与建树 → 组件分发 → 落盘。

  1. 入口与配置 · LayaAir3D.OnGUIExportScene() 导出窗口(菜单 LayaAir3D 3.0 / Export Tool)顶部切「导出为场景 / 导出为预设」,下含节点设置 / 模型设置 / 其他设置 / 自定义 Shader 设置 / 组件脚本导出配置五个折叠区与保存路径。点导出按钮 → LayaAir3Export.ExportScene()

  2. 初始化与多场景循环 · ExportScene() 先初始化各工具类(GameObjectUitls / MetarialUitls / AnimationCurveGroup / UnsupportedFeatureCollector,并清空自定义 Shader 缓存),再遍历当前所有已打开场景仅导出已保存的场景:路径为空(未保存)的场景不在导出范围内。每个场景构造一个 HierarchyFile 并调用 saveAllFile()

  3. 层级收集 · HierarchyFile 构造 从场景根对象递归把整棵树拍平成节点列表。其间两类节点被整体跳过:勾了「忽略未激活节点」时的非激活物体;以及Canvas 的对象及其整棵子树(UI 2D 暂未启用)。随后建立总资源表 ResoureMap,并为每个对象登记进 NodeMap

  4. 节点映射与建树 · NodeMapResoureMap.createNodeTree() 每个 GameObject 生成基础节点 JSON 并分配自增 _$id#0=Scene2D、#1=Scene3D 预留,业务节点从 #2 起)。场景模式直接导出实例内容;预制体模式则检测预制体实例根、写 _$prefab 引用。之后按父子关系挂成 _$child 树,并逐节点调 writeCompoent() 写组件。(_$ 前缀是 LayaAir 场景 / 预制体文件的字段约定,下文 _$type / _$comp 等同理。)

  5. 组件分发 · ResoureMap.writeComponentData() 整个插件的「总开关」:遍历每个组件,按类型分发给对应导出器(相机 / 网格 / 蒙皮网格 / 灯光 / 动画 / 粒子 / 精灵 / 自定义脚本…)。详见下方 ② 组件分发链。

  6. 落盘 · saveAllFile()ResoureMap.SaveAllFile() 场景模式构建 Scene2D → Scene3D 根(写入天空盒 / 环境光 / 球谐 / 雾),输出 .ls预设模式把每个根节点输出为 .lh(开启「批量导出一级节点」时按一级子节点拆分)。最后迭代保存所有登记文件——保存中可能动态产生新文件(如动画又引用了材质),用「已处理集合 + 循环」确保不漏。完成后弹出不支持功能汇总对话框。

导出窗口折叠总览

折叠态总览: 顶部切换导出为场景 / 预设,下含五个折叠设置区与保存路径、导出按钮。

导出窗口展开全部设置

展开全部设置: 节点 / 模型 / 其他(含粒子默认模式)/ 自定义 Shader / 组件脚本导出配置。

导出为预设模式与导出进度

导出过程:「导出为预设」模式下多出「批量导出一级节点」选项;导出时 Unity 会对涉及的纹理触发重导入并显示进度。

选择导出保存路径

选择保存路径: 点「浏览」从文件系统选择导出目录。图中目标是一个已有的 LayaAir 工程的 assets 目录——其中的 atlasresources 等文件夹是 LayaAir 引擎工程自带的结构,并非本次导出生成

本节展开 ① 中的组件分发阶段:插件逐个检查节点上的组件,按类型交给对应导出器,各自产出对应文件。 下表枚举每种 Unity 组件、其对应的 LayaAir 产物,以及对应的细化页。

Unity 组件LayaAir 产物说明 / 详情
Camera *Camera 节点(_$type投影、FOV、裁剪面、清屏色;相机有额外 Y180 朝向补偿(见 ③)
MeshFilter + MeshRenderer.lm 网格 + .lmat 材质网格导出 · 材质 / Shader
SkinnedMeshRenderer网格 + 骨骼引用 + 包围盒骨骼按节点引用,localBounds 中心 X 取反 · 网格导出
Light方向光 / 点光 / 聚光按类型分流,写颜色 / 强度 / 范围等;与相机同样有额外 Y180 朝向补偿(见 ③)
Animator.lani + 状态机曲线绑定按类型分发;纯 SpriteRenderer 颜色动画转 2D · 动画导出
ReflectionProbe / LODGroup反射探针 / LOD包围盒经矩阵变换;LOD 各级按节点引用
ParticleSystemGPU(Shuriken) 或 CPU 粒子按模式分两条路;启用 Trails/Noise 等会自动转 CPU · 粒子导出
ParticleSystemForceField力场仅在 CPU 粒子模式下有意义 · 粒子导出
SpriteRendererUI3D + 2D 预制体 + 图集整图直引 / 子区域出 .atlas;颜色动画出 .mcc · 2D 精灵导出
自定义 MonoBehaviour脚本组件 + 序列化属性仅在配置了 UUID 映射时导出,否则不导出;只搬属性值,不转逻辑代码

本节说明贯穿全程的坐标系转换:Unity 为左手系、LayaAir 为右手系,分发链的每条导出路径在写出空间数据前都需先对齐坐标。 两个引擎手性相反,插件统一以沿 X 轴翻转处理,相应逻辑分布于各导出路径中,汇总如下:

对象处理方式
网格顶点顶点位置 X 分量取反(导出时逐顶点翻转,详见网格导出
SpriteRenderer 节点没有导出网格可翻转,改为在节点 transform.localScale.x 取反补偿
SkinnedMeshRenderer 包围盒localBounds 中心 X 取反后重算 min / max
相机 / 灯光本体施加额外 Y180 旋转;其子节点改用「取反 Z」而非取反 X,并左乘 Y180 补偿父级
反射探针包围盒顶点经 worldToLocalMatrix 变换到局部空间

本节列出整条链路落盘产出的文件类型。 每种产物对应一类资源——场景、节点、网格、材质、动画、贴图等,构成最终交付 LayaAir 工程的导出结果。

扩展名 / 目录内容
.ls场景文件(Scene2D → Scene3D 根,含天空盒 / 环境光 / 球谐 / 雾)
.lh节点 / 预制体(导出为预设模式;可按一级节点批量拆分)
.lm网格(顶点流 / 子网格范围 / 骨骼绑定)
.lmat材质(贴图 / 颜色 / 浮点参数 / 渲染状态)
.lani动画片段(骨骼 / 属性曲线)
.atlas + 贴图2D 图集(SpriteRenderer 子区域)
.mcc2D 动画控制器(SpriteRenderer 颜色动画)
贴图 .png/.jpg/.hdr纹理(按是否含 Alpha / HDR 决定格式)
_src_/ 运行时脚本内置注入的 TS(目前仅 Animator2DSync.ts

本节以真实场景验证前四节的整条链路导出结果。 以 3D Game Kit Lite 的示例场景实测:导出后将产物导入 LayaAir 3.x,场景层级、角色网格、材质贴图、灯光、骨骼等核心美术资源均忠实还原并正常渲染——这部分正是分发链里有明确分支的组件。

Unity 与 LayaAir 并排对比

Unity(左)↔ LayaAir(右): 导出产物在 LayaAir 3.x 中打开,场景层级、角色、地块均还原渲染。

导出完成的不支持组件兼容性提示

兼容性提示: 导出完成时插件弹出汇总对话框(UnsupportedFeatureCollector),列出场景中不支持、不会被导出的组件——碰撞器、AudioSource、CharacterController、TrailRenderer 等,详细 GameObject 列表同步输出到 Console。


本页基于插件 1.1.7 源码与实测整理。