Engine

游戏引擎:场景图、组件、脚本、物理、PBR 管线、世界编辑器,以及桌面和移动端的原生构建。

一句话概括#

浏览器里的一整套游戏引擎:搭建一个场景,赋予它行为,按下播放,然后把它 导出到网页,或导出为一个原生的桌面和移动端可执行文件。

它是 aukimi 里迄今为止规模最大的模块。这份文档按照界面本身的方式来梳理 它,按每个面板所在的抽屉分类,而不是按字母顺序罗列功能。

界面布局#

Engine,带场景图、视口、检查器和控制台

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

四个面板按钮#

Engine 工具栏:场景名称、撤销、视口模式切换、四个面板按钮和传输控制

它们的行为并不完全一样,这个差异值得在你四处寻找某样东西之前先弄清楚:

按钮行为
Systems打开一个抽屉
Tools打开同一个抽屉,Systems 和 Tools 会互相关闭对方
Assets切换一个常驻的停靠面板
Scripts打开一个模态窗口

Systems 和 Tools 共用一个位置是故意设计的;它们被并排放置,好让这一点看得见。

Systems#

引擎自身的子系统:一个场景拥有的东西,而不是你用来制作的东西。

分组面板
Plugins插件浏览器
RenderingRendering · Rendering Pipeline · Look Presets · Shader Lab · Render Style · Shadows · Mesh LOD · Post Process Volumes
GameplayMultiplayer room · Physics · AI & Navigation · Gameplay Zones
WorldScene 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 LODPost 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#

你用来制作的东西。

分组面板
EditorsScripts · Blueprint Editor · UI Editor · Tilemap
WorldSky Studio · Terrain · Water · Tree Generator · Plant Generator · Rock Generator · Kitbash
GameplayInventory · Data tables · Dialogue Trees
AnimationTimeline · Cinematic Sequencer · Camera Tools
AudioAudio Manager
DebugProfiler

World generators#

地形、水、天空,以及四种内容生成器:树木、植物、岩石和 kitbash 拼装件。 它们在下面有属于自己的一章

Gameplay authoring#

InventoryData tablesTools → 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 CAlt + 点击设置取样源)、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#

两种模式,TreeTrunk。一棵树可以是落叶或常绿的,年龄从树苗到 古树不等,状态可以是存活、死亡、枯立木或倒木。一切都由种子决定,所以 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。六个页签:TemplatesElementsLayersPreviewStyleScript,上方是一个可以在三种 设备尺寸间切换的预览:桌面 960×540、平板 768×432、手机 375×667。

Elements 分为三组(DisplayDataInput),并且可以嵌套: panelflex 可以容纳子元素,所以 Layers 页签是一棵真正的树,而不是 一份扁平的列表。历史记录深度为五十步。

⚠️ Style 页签是类似 CSS 的,这个差异很重要。 HUD 是由 Babylon 的 GUI 系统画在画布上的,真正的 CSS 到不了这里。你在这里写的规则会映射到 GUI 的属性上;选择器是 #name 对应单个元素,.type 对应一种类型 (.text.panel),* 对应所有元素。

Script 页签是搭建界面的另一种方式:ui.* API,createTextcreatePanelcreateProgresscreateButton,有两种运行方式。 Build Layout 会在设计时执行它,留给你真实的元素供手动微调; Run Live 会在游戏里运行它。

两个对外连接:HUD 美术素材可以在 InkwellVectra 里打开,并且是链接回来的,而不是复制 过来的,一个 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(触发方式):useequipunequip,再加 八种类型之一:message、heal、damage、grant、remove、event、toast、 scene。这个面板本身有三种布局(网格、列表、紧凑)、三套外观预设(石墨、 午夜、暖色),以及四个视觉插槽:背景、格子、装备、提示框,它们会在另 一个模块里打开以便正式重绘。

Data tables 是有类型的:一列可以是 textnumberboolref。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 数、高三角面数、高内存占用,全部 对照你设定的目标帧率给出。

搭建一个场景#

实体#

Engine 视口,所选实体上带有操纵器

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

场景图,带有一个新场景起始时的四个实体

你可以添加的内容:EmptyCubeSphereCylinderPlaneLightCameraScriptMesh,外加两个自带 预先接好线路的家族:

  • 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带玩家接近警报的巡逻
AdvancedVerse 风格的异步过场动画 · 结构化并发 · 完整 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 对照一个阈值、healthmessage receivedtimer(停留在当前状态的时长),以及 flag(共享黑板上的一个 值)。两个组合符,andor,两个都列了出来,尽管 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#

PlayPauseStop。停止时,一条横幅会报告这次会话改变了什么, 所以一次试玩模式下的编辑永远不会被悄悄保留,也不会被悄悄丢弃。会话可以 被录制并回放进一份 bug 报告,scenario bookmarks(场景书签)能 让一次试玩从关卡中途开始。

Build#

Build 需要一个游戏类型(从场景自动检测,或手动设置:横版过关、 第一/第三人称、纯文字)和一个目标平台。

  • Web:WebGPU 配 WebGL 回退,可选 WebXR(VR/AR)、代码压缩、 一个 FPS 计数器,以及一个能产出单一文件的 embed assets 选项。
  • Desktopmobile:原生构建。场景以数据形式导出(scene.glb
    • scene.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 毫米的皮肤厚度来检测的,因为解算器会在检测运行之前, 把穿透量精确归零。