Engine
游戏引擎:场景图、组件、脚本、物理、PBR 管线、世界编辑器,以及桌面和移动端的原生构建。
一句话概括#
浏览器里的一整套游戏引擎:搭建一个场景,赋予它行为,按下播放,然后把它 导出到网页,或导出为一个原生的桌面和移动端可执行文件。
它是 aukimi 里迄今为止规模最大的模块。这份文档按照界面本身的方式来梳理 它,按每个面板所在的抽屉分类,而不是按字母顺序罗列功能。
界面布局#

| 菜单栏 | File · Edit · View · Windows · Run · Plugins |
| 工具栏 | 项目名称、撤销/重做、视口模式切换(3D · 2.5D · 2D · TXT)、场景选择器、四个面板按钮、FX Master、HUD、分辨率框、传输控制(播放、暂停、停止)和 Build |
| 左侧 | 一条图标栏、场景图、列表、音频、控制台,以及它打开的那个面板 |
| 中央 | 视口,带自己的操纵器工具条(平移、旋转、缩放、世界/本地、网格、吸附、取景)和一个质量选择器 |
| 右侧 | 所选实体的 inspector |
| 底部 | Console 和 Profiler,并排显示 |
| 状态栏 | 模式、视口尺寸、实体数量、网格状态 |
四个面板按钮#

它们的行为并不完全一样,这个差异值得在你四处寻找某样东西之前先弄清楚:
| 按钮 | 行为 |
|---|---|
| Systems | 打开一个抽屉 |
| Tools | 打开同一个抽屉,Systems 和 Tools 会互相关闭对方 |
| Assets | 切换一个常驻的停靠面板 |
| Scripts | 打开一个模态窗口 |
Systems 和 Tools 共用一个位置是故意设计的;它们被并排放置,好让这一点看得见。
Systems#
引擎自身的子系统:一个场景拥有的东西,而不是你用来制作的东西。
| 分组 | 面板 |
|---|---|
| Plugins | 插件浏览器 |
| Rendering | Rendering · Rendering Pipeline · Look Presets · Shader Lab · Render Style · Shadows · Mesh LOD · Post Process Volumes |
| Gameplay | Multiplayer room · Physics · AI & Navigation · Gameplay Zones |
| World | Scene Graph · Level Streaming · Baking · Light Probes · Decals |
Rendering#
工具栏上的 FX Master 开关能一键打开或关闭整条后期处理管线:这是查看 它到底花了你多少开销的最快方法。单独来看,有:泛光、景深、SSR、SSAO、 GTAO、SSGI、时间性抗锯齿(TAA)、FXAA、动态模糊、体积雾、接触阴影、调色、 胶片颗粒、色差、暗角和色调映射,外加 Nanite 风格的几何体和 Hi-Z 遮挡剔除。
Look Presets 是以上这些设置的整套配置。Render Style 会改变画面的 整体调性,从写实转向风格化。Shader Lab 是你编写自己着色器的地方。 Mesh LOD 和 Post Process Volumes 是在大场景里最值回开销的两个: 按 mesh 分级的细节层级,以及只在一个体积内部生效的后期处理。
渲染器是 Babylon.js。它从 WebGL 起步,在浏览器支持时自动切换到 WebGPU,切换失败时也会自行回退。
Gameplay systems#
Physics 涵盖 3D 解算器(Havok)和 2D 解算器两者。AI & Navigation 是 NavMesh 以及它上面的代理。Gameplay Zones 是附带行为的触发体积。 Multiplayer room 把场景连接到一个 Colyseus 服务器(见下文)。
World systems#
Level Streaming 会随着玩家移动加载和卸载关卡的各个部分。Baking 预先计算光照;Light Probes 在空间中的各个点上捕捉间接光和反射。 Decals 把细节投射到表面上,而不增加任何几何体。
Tools#
你用来制作的东西。
| 分组 | 面板 |
|---|---|
| Editors | Scripts · Blueprint Editor · UI Editor · Tilemap |
| World | Sky Studio · Terrain · Water · Tree Generator · Plant Generator · Rock Generator · Kitbash |
| Gameplay | Inventory · Data tables · Dialogue Trees |
| Animation | Timeline · Cinematic Sequencer · Camera Tools |
| Audio | Audio Manager |
| Debug | Profiler |
World generators#
地形、水、天空,以及四种内容生成器:树木、植物、岩石和 kitbash 拼装件。 它们在下面有属于自己的一章。
Gameplay authoring#
Inventory、Data tables(Tools → Data)和 Dialogue Trees 是 三个编辑器,让一款游戏能拥有内容,而不必把这些内容写进代码里, 详见下文。
Animation#
Timeline 用于实体动画,Cinematic Sequencer 用于镜头, Camera Tools 用于取景。参见动画与摄像机。
世界编辑器#
Tools → World 下的七个面板。它们是快速填充一个场景的办法,也是一个 关卡不必从建模开始的原因。
Terrain#
一个场景可以容纳多个地形;每一个都是 Terrains 列表里的一行,创建时 可选三种分辨率之一:128²(快速)、256²(均衡)或 512²(精细)。
这个面板有十种模式,它们共享一件事:在 Masks 里绘制的遮罩会限制它们 每一个的作用范围。
| 模式 | 作用 |
|---|---|
| Sculpt | 高度场上的十七种画笔 |
| Paint | 最多八层贴图,分布在两张溅射贴图上 |
| Generate | 噪波、自动贴图,以及真实世界高程数据导入 |
| Sketch | 画出山脊和山谷,合成出与之匹配的地形 |
| Masks | 把其他每一种模式限制在表面的一部分 |
| Water | 海平面,以及在地形水体和 FFT 海洋之间选择 |
| Paths | 一条烘焙进地面的贝塞尔道路 |
| Vegetation | 基于画笔或规则的散布 |
| SDF | 一种光线步进渲染的地形,靠渲染而不是生成 mesh |
| Biomes | 一次完成土壤、植物、树木和岩石的铺设 |
Sculpt。 Raise 1、Lower 2、Smooth 3、Flatten 4、Pinch 5、
Inflate 6、Noise 7、Sharpen 8、Stamp 9、Terrace 0、Erode E、
Fill F、Clone C(Alt + 点击设置取样源)、Blur B、Ramp R,外加
两个水体工具:River 画出一条水道,Lake 在一点上填出一片水面。
画笔本身带有动态属性:压力曲线、懒惰鼠标、衰减、对称、图案,以及尺寸和
强度上的抖动。Stamp 自带六种形状:陨石坑、山峰、高原、河谷、穹顶、
噪声丘。侵蚀有两种形式:E 画笔是局部的,而 Adjustments 会对整个地形
运行水力、热力和风力侵蚀。
Paint。 八个图层,因为两张 RGBA 溅射贴图各自能容纳四个通道。材质库 按类别排序:草地、泥土、森林、岩石、道路与地表、悬崖、沙地、雪地、火山、 湿地、奇幻,以及你自己的材质,每一层都带有 UV 缩放、位移、一张细节贴图, 以及表面浮雕(凹凸强度和视差深度)。Break texture tiling(cell bombing) 是防止重复的地面贴图看起来像一张网格的设置。
Generate 从噪波开始搭建,然后 Generate Textures 按高度和坡度分配 材质,带有南北朝向的明暗变化,以及水体附近的沙滩或卵石海岸线。 Real World 导入公开的 NASA/USGS 高程瓦片:选择一个地标或输入坐标, 选择缩放级别,面板会报告它取回的高程范围。
Sketch 是另一种进入方式。在一张 2D 地图上画出山脊和山谷的笔触,最多 选择三个真实的参考地貌,地形就会被合成出来匹配这幅草图,可以选择与已有 的地形混合,并在同一次处理中自动贴图和侵蚀。
Masks 用画笔绘制,然后整体编辑:清除、反转、模糊、扩张、收缩。 智能遮罩会直接从地形本身推导出一个遮罩:按高度、按坡度、按图层或按 凹陷处。
Paths。 点击放置控制点,一条平滑曲线会穿过它们;拖动琥珀色的点来 移动它们,拖动青色的控制柄来弯曲曲线。Bake Path 会压平路径下方的地面, 绘制贴图,并抬高路堤。
Vegetation 分为两半。画笔用来手动放置和移除实例;scatter rules (散布规则)按条件、图层权重、种子、最小/最大缩放,以及每种素材能接受的 高度和坡度范围来放置它们。草和花会在一个可配置的绘制距离之外淡出, Export to Scene 会把这些实例转换成场景对象。
Biomes 是以上所有功能的一键版本:选择一个生物群落,勾选你想要的类别 (土壤、树木、植物和草、花朵、水边的藻类、岩石),设置一个密度, Apply Biome 就会绘制地面并散布所有内容,并报告每一种放置了多少个实例。 树木的age variety(年龄多样性)会混合幼苗到古树,而不是到处都放同一 棵树,ground blend(RVT) 会把每块岩石的基底融进它下方的地形颜色里。
SDF 是一个不同的渲染器,而不是一个不同的工具:地形从一个距离场里 光线步进出来,形状由 octaves、lacunarity 和 persistence 决定,用 grass/rock/snow 贴图配合雪线和坡度阈值,并带有自己的软阴影、环境光遮蔽 和雾。
大型地形带有一套 LOD system,配有裙边几何体(用来闭合各级之间的 缝隙)、平滑的层级过渡、视锥剔除,以及一个统计信息叠加层。高度图以 16 位 PNG、8 位 PNG 或 RAW 16 位格式导入导出;溅射贴图以一张 RGBA PNG, 或每层一个文件的形式;整个地形,或者只是它的设置,也可以另存为一个预设。
Sky Studio#
大气。四种天空类型:纯色、渐变、HDRI,以及一个带有瑞利散射和米氏 散射、米氏吸收、臭氧、地面反照率、浑浊度、行星半径和大气厚度的 physical atmosphere(真实大气)。
一切都挂在time of day(一天中的时间)之下,它可以自行循环:太阳按 仰角、方位角和强度变化,带有自己的阴影强度;月亮按相位变化;星星带有 闪烁;还有一道极光。Volumetric clouds(体积云)有厚度、侵蚀、噪波 尺度和卷曲扭曲,光照则通过吸收、散射、环境光和一个 powder 项来表现; 卷云和金星带是分开的。Aerial perspective(空气透视)是随距离增厚、 让远处几何体淡入地平线的雾霭,正是这个设置让一片风景读起来显得辽阔。
十种可以作为起点的预设:晴天、黎明、日落、黄昏、夜晚、阴天、暴风雨、 沙漠、极地和太空。
Water#
两个页签:**Ocean(FFT)**用于开阔海面,Shore & lakes 用于其余情况。
⚠️ 水体是在 Terrain 编辑器里创建的:用河流和湖泊工具,或者 Show Water,然后在这里调整。在一个没有水体的场景里打开这个面板,你 只会得到一堆没有对象可作用的设置。
近岸水体带有颜色、不透明度、波浪强度与速度、破碎程度、泡沫宽度和菲涅尔 效应,配合屏幕空间反射和折射模糊。再往下就是 WGSL 着色器本身:两组各自 带有滚动方向和速度的法线缩放、泡沫阈值和柔和度、折射强度和折射率,以及 水体内部的光照:吸收、浑浊度、散射和半透明度。
Tree Generator#
两种模式,Tree 和 Trunk。一棵树可以是落叶或常绿的,年龄从树苗到 古树不等,状态可以是存活、死亡、枯立木或倒木。一切都由种子决定,所以 Randomize seed 是获得一棵风格相同、但样子不同的树最快的办法。
形状是按每一级枝条分别控制的:子枝数量、长度、半径、锥度、扭结感、扭转、 段数、分段、角度和起始高度,此外还有自然变化、phototropism(向光性) 和gravitropism(向重力性):这两者让一棵树朝光倾斜、在自身重量下 下垂,此外还有一个带自身强度的全局作用力。
树基带有根部展开(叶瓣数和高度)和板状根。
树叶是公告板,单面或双面,可控制数量、大小、角度、差异度、簇拥程度、 卷曲、下垂、光泽和圆润的法线。树皮有六种风格:ridged、aspen、pine、 birch、smooth、palm,带有浮雕、苔藓、潮湿的基部、日晒褪色、树冠环境光 遮蔽和秋色变化。四个季节可以一次性切换整体外观。
Forest 一次性散布大量树木:数量、扩散半径、缩放差异,以及一种年龄 混合方式(单一、自然、年轻、年老、均匀)。Add age progression 会把 全部五个生命阶段依次排开放置,这是并排比较它们最快的办法。一棵树可以 作为场景实体离开,也可以作为 GLB 离开,任何设置都可以另存为预设。
Plant Generator#
五种类型:花、簇、草本、蕨类、草,共享一套茎干参数(数量、高度、粗细、 弯曲度、颜色)和叶片参数(数量、大小、宽度、角度)。蕨类额外带有小叶 对数、小叶扫掠角和叶片拱度;草额外带有叶片数量和弧度。
花朵对其中任何一种都是可选的:花瓣、花瓣行数、长度、宽度、卷曲度、尖端 锐度、绽放程度、花心大小,以及三种颜色,花瓣、花瓣尖端和花心,还有控制 光线穿过叶片方式的半透明度和粗糙度。可以把一株加入场景,也可以大量散布, 或导出 GLB。
Rock Generator#
三种类型:rock、stone、cliff,三种风格:写实、卡通,或带描边的低多边形。
形状是叠加在一个球体上的噪波:缩放、强度、octaves、persistence、扭曲, 以及一个 ridged 选项,此外还有带自己频率的strata(岩层)和带深度与 锐度的facet cuts(切面),用于呈现有棱角的石头。半径、细节、压平、 形状差异和一个平底选项共同决定轮廓,四种侵蚀预设:fresh、weathered、 natural、eroded,会一次性调整全部这些参数。
表面带有颜色变化、矿脉、地衣和苔藓、一张带平铺和强度的细节贴图、三平面 混合和视差浮雕。它默认使用一份内置的 Stone 材质;从 Matter 把一份材质发送到 Engine,即可覆盖它。
Kitbash,与 Sculpt 共用同一个库#
Kitbash 与 Sculpt 共用:这个面板和 Sculpt 的 Edit Forge 读取同一个库。在那边搭建的一个拼装件,可以放置在这里;在 这里绘制过的一个拼装件,也可以存回那个库里。
场景存储的是这个部件和它的尺寸,而不是它的顶点,这就是为什么一栋 kitbash 搭建的建筑在文件里几乎不占空间,并且之后还能从它的源头更新。
从目录里选中一个部件,每次左键点击都会放置它。三种吸附模式决定它落在
哪里:on terrain(部件跟随其下方的地面高度)、on water(建造
平面落在水面高度),以及 snap to sockets:瞄准一个已放置部件上的
连接点,新部件会自动转向去对接它。一条链会从它的自由端继续生长,已占用
的插座会从候选项里排除,每一次点击都是独立的一次撤销步骤。Ctrl/Cmd
始终保留给选择,Alt 保留给旋转。集合会保留它们的来源和版本,这样当
原始件发生变化时,一个实例也能被更新。
其他编辑器#
世界编辑器负责填充一个场景;这些编辑器则赋予它一个界面、一张地图、它的 内容表格,以及检查开销的工具。
HUD 编辑器#
Tools → Editors → UI。六个页签:Templates、Elements、 Layers、Preview、Style 和 Script,上方是一个可以在三种 设备尺寸间切换的预览:桌面 960×540、平板 768×432、手机 375×667。
Elements 分为三组(Display、Data、Input),并且可以嵌套:
panel 和 flex 可以容纳子元素,所以 Layers 页签是一棵真正的树,而不是
一份扁平的列表。历史记录深度为五十步。
⚠️ Style 页签是类似 CSS 的,这个差异很重要。 HUD 是由 Babylon 的
GUI 系统画在画布上的,真正的 CSS 到不了这里。你在这里写的规则会映射到
GUI 的属性上;选择器是 #name 对应单个元素,.type 对应一种类型
(.text、.panel),* 对应所有元素。
Script 页签是搭建界面的另一种方式:ui.* API,createText、
createPanel、createProgress、createButton,有两种运行方式。
Build Layout 会在设计时执行它,留给你真实的元素供手动微调;
Run Live 会在游戏里运行它。
两个对外连接:HUD 美术素材可以在 Inkwell 或 Vectra 里打开,并且是链接回来的,而不是复制 过来的,一个 Vectra 文档也可以被导入为 HUD 元素。小地图元素是独立的 一类,带有范围、网格,以及玩家、敌人、盟友、物品和目标的标记。
图块地图编辑器#
十一种工具:画笔、橡皮擦、填充、矩形、选择、吸管、图章、自动拼贴、道具、 区域和路径,支持四种地图投影方式:orthogonal(正交)、 isometric(等距)、staggered isometric(交错等距)和 hexagonal(六边形)。
Autotiling(自动拼贴)自带四套模板,每个名字里的数字就是它需要的 图块数量:Blob 47(完整的角和边)、Wang 16(基于边)、Simple 4 (NSEW 四方向),以及 RPG Maker A2(48 个图块,与那边制作的地图兼容)。
图块本身之上还有两个图层。Zones 绘制的是玩法含义:可建造、水域、 森林、道路、农田、住宅、商业、禁行;props 按类别放置对象:树木、 岩石、建筑、植被、水体、道路。地图存储在浏览器自己的数据库里,所以一份 未保存的地图在刷新之后依然存在。
Inventory、data tables 与对话#
这三个编辑器让一款游戏能拥有内容,而不必把内容写进代码里。
Inventory 编辑一份目录,并把它应用到场景里。一件物品带有多个动作,
一个动作是一个trigger(触发方式):use、equip、unequip,再加
八种类型之一:message、heal、damage、grant、remove、event、toast、
scene。这个面板本身有三种布局(网格、列表、紧凑)、三套外观预设(石墨、
午夜、暖色),以及四个视觉插槽:背景、格子、装备、提示框,它们会在另
一个模块里打开以便正式重绘。
Data tables 是有类型的:一列可以是 text、number、bool 或
ref。CSV 可以导入也可以导出。每一次编辑都通过纯函数完成,这正是导出
写出的表格与构建读取的表格保持一致的原因。
Dialogue trees 由带有说话者和一句台词的节点组成。一个节点要么继续
到一个 next,要么分支进入若干choices(分支选项),每一个都有自己
的文本和目的地,是否分支,是这个编辑器里唯一的结构性决定。
动画与摄像机#
Cinematic Sequencer 搭建带有时长和循环标记的序列,每个实体一条 轨道,关键帧在播放头位置捕捉,Add Key 会直接取用实体当前的值,而不 需要你手动输入。下方的graph editor(曲线编辑器)以时间对进度作图, 配圆形控制柄用于缓动:斜率就是速度。镜头有自己的时长,还提供一个 Cinemascope 画幅(1.422:1)用于遮幅。
Camera Tools 涵盖 FOV、位置、目标、模式和速度,此外还有供你反复 回到的视角所用的bookmarks(书签),以及摄像机图层。
音频#
Audio Manager 保存着音频事件、轨道,以及一个带通道和分类的混音器。 每个音源自带的效果是一个低通、一个高通和一个混响发送;一个 random 模式会在多段片段之间随机选择,让一个重复的声音不再听起来像 循环播放。拖动播放头时会试听音频(scrubbing)。
分析器#
一份逐帧明细,而不是一个帧数计数器:摄像机渲染、mesh 计算、粒子、精灵 和着色器编译,每一项都标注为real(实测)或estimated(估算), 这样一个来自实际测量的数字,就绝不会被误认成来自模型估算的数字。旁边 还有计数器:mesh 与活跃 mesh 数量、灯光、摄像机、物理体。
录制是显式触发的,结束后给出的是一份 Issues 列表,而不是一张需要你 自己解读的图表:低 FPS、高 draw call 数、高三角面数、高内存占用,全部 对照你设定的目标帧率给出。
搭建一个场景#
实体#

一个新场景自带一个 Main Camera、一个 Directional Light、一个 Skybox 和一个 Ground Plane。

你可以添加的内容:Empty、Cube、Sphere、Cylinder、 Plane、Light、Camera、Script、Mesh,外加两个自带 预先接好线路的家族:
- Characters:Third-Person、First-Person(FPS)、Top-Down、 Platformer、Basic。
- Props:Pickup(治疗)和 Hazard(伤害)。
场景图支持搜索、按类型筛选,以及添加、复制或删除;实体可以嵌套,重新 挂靠只需要一次拖拽。放置支持吸附,还有一支scatter brush(散布画笔) 用于快速铺满地面。
inspector#
Transform(位置、旋转、缩放)、一个 Enabled 开关,以及实体的 components:在这里添加、配置和移除,底部还有 Add Script。选中 多个实体,inspector 会切换到批量编辑模式,一次字段修改会同时作用到 全部实体上。
控制台#
它不只是一份日志。它可以按级别筛选(全部、logs、info、warning、
error),把一条消息链接回产生它的实体,还带有一个expression
prompt(表达式输入框):输入一个表达式,Enter 会针对当前运行中的
场景执行它,方向键可以在历史记录里前后浏览。
赋予它行为#
三条路径,它们可以共存。
脚本#
带生命周期钩子的 JavaScript,有自己的一份参考文档:
function start() {} // once, when the entity starts
function update(dt) {} // every frame
function fixedUpdate(dt) {} // fixed timestep, for physics
function onCollisionEnter(other) {} // first frame of contact
function onCollisionStay(other) {} // every frame while touching
function onCollisionExit(other) {} // contact just ended
function onTriggerEnter(other) {} // entered a trigger volume
function onTriggerExit(other) {}
function onMessage(msg, data, senderId) {} // entity-to-entity messaging
function onAnimationEvent(name, data) {}
function onDestroy() {}
碰撞和触发在 2D 和 3D 下都会触发,双方各自收到自己的接触法线:
other.contact.normal 指向的方向是从对方实体指向这一方。这就是脚本
能够分辨“我落在它上面”和“它落在我上面”的原因:一次平台跳跃的踩踏判定
读取的是 other.contact.normal.y > 0.5。
脚本编辑器#
F2,或者在一个实体上点击 Add Script。一个带页签的 Monaco 编辑器,
可以同时打开多个脚本,每一个都保存在浏览器自己的数据库里,而不是项目
文件里,所以一份未保存的缓冲区在刷新之后依然存在。
五种方言,一份程序。 语言切换提供 JavaScript、BASIC、Python、C# 和 Rust。它的实际做法和看起来的不一样:JavaScript 才是唯一真实的来源, 另外四种都是从存储的 JS 转译出来的视图。从 Python 切到 Rust 并不会 翻译 Python,它会回到生成这段 Python 所依据的那份 JS,再去翻译那份 JS。 多跳翻译正是会毁掉一段程序的做法,编辑器拒绝这样做。
十三个模板,分在五个类别里,每个都标注了难度:
| 类别 | 模板 |
|---|---|
| Basics | 带生命周期占位函数的空白脚本 |
| Movement | 自动旋转 · WASD 移动 · 基于坐标轴的 3D 移动 · 带地面检测的物理跳跃 · 第三人称摄像机跟随 |
| Gameplay | 触发区域 · 带伤害和治疗的血条 · 定时生成器 |
| AI | 带玩家接近警报的巡逻 |
| Advanced | Verse 风格的异步过场动画 · 结构化并发 · 完整 API 覆盖测试 |
角色控制器预设和游戏起始道具(pickup、hazard)出现在同一份列表里,这是 把一个能用的控制器直接套到一个导入角色上的实用办法。
运行与调试。 F5 运行,F9 设置一个断点。调试器会在某一行暂停,
可以单帧步进,并通过监视表达式报告实时的值。Script Lab 在完全不
挂载任何实体的情况下运行一段程序,是一个针对 API 的草稿本,而不是挂在
某个对象上的组件。
代码旁边还有:一份 API reference、当前打开文件的符号列表,以及一个
带收藏和最近使用的代码片段库。Ctrl+S 保存,Ctrl+F 查找,Ctrl+H
替换,编辑器自带八套主题。
Blueprints 与行为#
一张可视化节点图,一个现成行为的库,以及一台叠加在行为堆栈之上的状态机。
这张节点图带有 267 个节点,分在二十二组里:Math、Scene、Entity、 Animation、Flow Control、String、Events、Physics、UI、Array、Vector、 Transform、Debug、Input、Utility、Game、Boolean、Camera、Tween、 Variables、Audio,以及 2D 和 3D 家族。三种属性把它们区分开来,也正是这 张图的构成方式:17 个事件节点启动执行,117 个纯节点计算一个值, 没有副作用也没有执行引脚,9 个延迟节点会在之后才完成,正是它们让一 个延迟或一个补间动画不需要你自己搭一台状态机就能表达。
四个工具:选择 V、平移 H、注释 C、改线 R,画布可以从 0.1× 缩放
到 3×,并带有一张小地图。变量有六种类型:boolean、integer、float、
string、vector3 和 object。每个节点的说明都在它的提示信息里,对于这么
大规模的一个库来说,这是唯一能自我解释的地方。
状态机#
它有自己独立的面板,刻意与 Animator 的状态机分开:Animator 的条件是一个 扁平的枚举,每种情况都要手写界面,而这里的条件是结构化的,谈论的是 世界本身。
七种条件,每一种都是关于场景的一个问题:sees(范围内一个带标签的 目标,可选限定角度并要求视线可见)、lost(N 秒内没有目标)、 distance 对照一个阈值、health、message received、 timer(停留在当前状态的时长),以及 flag(共享黑板上的一个 值)。两个组合符,and 和 or,两个都列了出来,尽管 or 本来就 已经隐式存在,两条通向同一个状态的转换本身就是一个 or,但“它看见了 我,并且我还有生命值”原本完全无法表达。
⚠️ 生命值是按最大值的比例比较的,永远不是绝对数值。 “低于 30 点生命值”这样的阈值撑不过一次数值重新平衡;“低于 0.3”则可以。
进入或离开一个状态时,有四种效果:send 一条消息、set 一个黑板 键、play 一段动画片段,或触发一个named effect(命名效果)。它们 都不负责移动任何东西,移动始终由行为负责,状态机只决定哪个行为处于 激活状态。
一次转换可以从 * 开始,代表任意状态。校验器返回的是一份问题清单,
而不是遇到第一个问题就报错,所以一台写了一半的状态机依然能画出来,你
可以一次性看到所有问题。节点位置本身也是数据的一部分:一张布局存在场景
之外的图,会在下一个打开它的人面前被重新打乱。
BASIC#
TXT 视口模式是一个经典 BASIC 环境,自带演示程序,这门语言也
有自己的一份参考文档。它在这里是一门真正的
语言,不是玩具:多文件模块(#INCLUDE)、带类型的数值(有符号和无符号
的 8/16/32/64 位、float32 和 float64)、嵌套记录、带 SELF 的对象方法、
引用(REF/BYREF)、结构化的 TRY/CATCH/FINALLY、条件编译、
协程、带类型的句柄,以及带存储缓冲区和原始 WGSL 的WebGPU compute
(WebGPU 计算)。
OPTION EXPLICIT 是可选启用的;经典的隐式变量声明仍然是默认行为,这样
导入的程序依然能运行。
试玩与交付#
Play#
Play、Pause、Stop。停止时,一条横幅会报告这次会话改变了什么,
所以一次试玩模式下的编辑永远不会被悄悄保留,也不会被悄悄丢弃。会话可以
被录制并回放进一份 bug 报告,scenario bookmarks(场景书签)能
让一次试玩从关卡中途开始。
Build#
Build 需要一个游戏类型(从场景自动检测,或手动设置:横版过关、 第一/第三人称、纯文字)和一个目标平台。
- Web:WebGPU 配 WebGL 回退,可选 WebXR(VR/AR)、代码压缩、 一个 FPS 计数器,以及一个能产出单一文件的 embed assets 选项。
- Desktop 和 mobile:原生构建。场景以数据形式导出(
scene.glbscene.json),并通过一个生成的 Bevy(Rust)项目编译;脚本会 在一个内嵌的 QuickJS 运行时里原样运行。
压缩可以按不同维度分别配置:算法、贴图、mesh,并有一个质量预设把它们 绑在一起。构建会保留在一份历史记录里,附带它们的体积(原始体积对比 压缩后体积),之后还可以再次下载。
一个原生构建只包含导出器知道如何导出的内容。glTF 无法承载自定义 着色器、薄实例、程序化天空或后期处理,所以任何还没有被移植到 Bevy 那 一侧的运行时系统,会在桌面或移动构建里缺失,尽管它在 Web 上看起来完全 正常。在依赖一个原生构建之前,先检查一遍。
多人联机#
Multiplayer room 面板把一个场景连接到一个 Colyseus 游戏服务器。一个 免费的共享测试服务器不需要账号、不需要任何配置即可使用;一个项目也可以 拥有自己专属的服务器。房间由一个分享码作为键,你可以自己留着,也可以 分发出去。
支持读写的文件#
| 原生格式 | .engine |
| 导入 | .glb、.gltf、.obj、.fbx、.png、.svg、.mp4、.webm、.mov、.scene |
| 导出 | 一个 Web 构建、一个原生桌面/移动构建、scene.glb + scene.json |
向其他模块发送内容#
接受 来自 Sculpt、Retopo 和 Pigment 的 mesh,来自 Render 的完整场景, 像素画,动画,来自 Matter 的 PBR 材质集,2D 绑定,视频项目,图片,矢量 作品,以及 Vectra objects。
产出 2D 绑定。
一个 Vectra 界面草图到达时是结构,而不是一张图片。 它会变成一棵 Engine 可以布局并编写脚本的 HUD 层级结构:这就是一个可以接线的设计, 和一张它的截图之间的区别。
快捷键#
Cmd/Ctrl + K 能从命令面板里找到 Engine 自己的命令,和全局命令放在
一起。Engine 在自己的设置里还有一个专属的、可搜索的键盘快捷键面板;它
拥有的快捷键远多于快捷键页面能容纳的数量。
局限与常见问题#
- 视口空白通常是浏览器的问题,不是场景的问题。 Engine 需要 WebGL 2;检查硬件加速是否已开启。
- Systems 和 Tools 共用一个抽屉。 如果一个面板“不见了”,它多半就在 另一个里面。
- 控制台是应该第一个查看的地方,而不是最后一个:它会把错误链接回 引发它的实体。
- 在试玩模式下添加的一个组件,可能撑不过停止操作。 阅读你停止试玩 时出现的那条横幅。
- 物理在 2D 和 3D 之间的解算器不同,尽管脚本回调是一样的。2D 里的 一个静止接触是用 2 毫米的皮肤厚度来检测的,因为解算器会在检测运行之前, 把穿透量精确归零。