Gandi 3.0文档
官网 打开编辑器
文档/扩展

物理

「物理」是引擎组里的一个扩展,给角色加上刚体物理:重力、碰撞、弹跳、摩擦、关节,以及液体、软体、 绳和力场。刚体装配在物体上,克隆体自动带上;在装配编辑器的「物理」一节里打开,按下绿旗角色就会下落、 碰撞,不需要写积木。

打开方式#

在扩展库的「引擎」一组里添加「物理」。装上后:

  • 装配编辑器里多出物理一节(角色栏里不显示);
  • 选中舞台,多出物理世界一节,是整个场景的设置;
  • 积木栏多一个物理分类。

碰撞体在装配编辑器的碰撞页里画,这一页是内置的,不装物理扩展也能用,见 引擎。

怎么用#

1. 给角色打开物理#

打开角色的装配编辑器(角色右键「装配」,或工作区那一组里的「装配」标签),在「物理」一节把「开」拨到开。没有画碰撞体时,按当前造型的轮廓算。

设置 作用
类型 静止:不动,只挡别人;动态:受重力和碰撞;随脚本:只按积木移动,能推开动态物体;角色:游戏里的主角和敌人,见下面「角色」
质量、弹性 动态物体的质量(kg)和反弹程度(0–1)
摩擦、阻尼 表面摩擦;阻尼让运动逐渐变慢
重力倍率 这个物体受多少倍重力,0 是失重,负数向上飘
锁转 不转动。角色的旋转方式不是「任意旋转」时自动锁住
单向平台 静止和随脚本的物体才有。只挡从上面落下来的东西,从下面、侧面可以穿过
脚本移动 动态物体才有。会碰撞:用运动积木挪角色时沿途碰撞、贴着墙滑;直接穿过:直接放到目标位置
高速 快速运动的物体也不穿墙,开销更大
碰撞层、撞哪些 自己在哪一层(1–16),和哪几层碰撞;一层都不选就是全撞
隐藏时 角色隐藏后:照常、暂停、不碰撞
脚底碰撞 只用碰撞外形最底下这么高(舞台单位)的一截挡路,0 是整个外形。斜俯视里的房子、树只有墙根、树干底下挡路,见下面「斜俯视」
前后遮挡、遮挡偏移 斜俯视世界里按画面底边排前后,默认开;地面这种铺在最底下的大图要关掉。偏移加到排序用的底边上,正数往后、负数往前
世界 属于哪个物理世界,默认 default
静止物体打开单向平台

2. 设置物理世界#

选中舞台,在「物理世界」一节调整:

舞台的「物理世界」一节
设置 作用
视角 横版:有重力,平台跳跃;俯视、斜俯视(宝可梦、星露谷):没有重力,角色按俯视角走,斜俯视另外自动排前后遮挡
地面摩擦 俯视、斜俯视才有。没有重力就没有地面摩擦,推一下的箱子会一直滑,这个值把它拖停
重力 横版才有。x、y 两个分量,单位是舞台单位/秒²,默认 y = -980
时间倍率 物理比真实时间快或慢多少倍
画面插值 角色显示在两步物理之间的插值位置上,作品帧率和物理步数不整除时画面不顿
时钟 真实时间:按实际经过的时间推进,卡顿时追赶,追不上时放慢;按帧:每一帧固定推进 1/帧率 秒,同样的操作得到同样的结果
边界 无、地板(舞台底边)、四面墙(舞台四边),跟着舞台尺寸走,16:9 的舞台也贴着边
鼠标拖拽 作品运行时能不能用鼠标拖物体:编辑器里、总是(全屏和发布后也能)、关

这些设置存在舞台上,一个场景一份,修改立刻生效。

3. 用积木控制#

积木栏的「物理」分类按用途分组:身体、运动、事件、查询、关节、液体、软体与绳、力场、粒子联动、 世界与存档。常用的几块:

积木 作用
把 [物体] 的速度设为 x [ ] y [ ] 直接设定速度,跳跃、冲刺常用
对 [物体] 施加 [冲量/力] x [ ] y [ ] 冲量一次性改变速度;力放在「重复执行」里每帧一次,是持续的推力
让 [物体] 移动 x [ ] y [ ],碰到障碍沿表面滑 按位移移动,碰到墙停下并沿墙滑,平台跳跃里控制角色走路用
[物体] 站在地面上? 有东西从下面托着它时为真,判断能不能起跳。站在果冻、绳子、沙堆上也算,泡在水里不算
让 [物体] 按平台角色移动:左右 [ ] 跳 < > 平台跳跃游戏的主角用它走和跳,见下面「角色」
让 [物体] 按俯视角移动 x [ ] y [ ] 俯视角游戏的主角
把 [物体] 的角色模式设为 [跟着世界视角/平台跳跃/俯视/按格子走] 按格子走就是宝可梦那种一格一格地走
让 [物体] 和面前 [ ] 以内的东西交互 砍树、开门、和人说话:面前那个物体收到「被交互」,自己收到「交互了」
[物体] 面前 [ ] 以内的物体 面前最近的物体是哪个角色,用来显示「按 K 查看」这类提示
把我的前后遮挡设为 [开/关],偏移 [ ] 没开物理的角色(作物、特效)也按画面底边排前后
让 [物体] 巡逻:速度 [ ],走到边缘时 [直接走下去/掉头] 敌人来回走,碰墙掉头
当我 [踩到/被踩/顶到/被顶/撞到/被撞/碰到] [角色] 角色之间、角色和砖块之间的事件
当我 [开始/结束] 接触 [物体] 碰撞事件
当我受到超过 [ ] 的冲量 撞击事件
连接 [物体] 和 [物体],[类型] 关节 [名字] 距离、弹簧、绳、铰链、滑轨、焊接、轮子、马达、摩擦、拖拽

细节#

角色#

物体类型选「角色」,就是游戏里的主角、敌人、会走的道具。它和动态物体不一样:不受力、不被推、不会弹,每一步由引擎算好往哪走,碰到墙停在墙前,站在地上就稳稳站着。平台跳跃和俯视角游戏的手感都靠它。

碰撞盒的底边就是脚底:把碰撞盒画到造型的脚底,站在地上时画面上正好贴地,不会浮着一两像素。

平台跳跃:「让 [物体] 按平台角色移动:左右 [ ] 跳 < >」放在「重复执行」里每帧调一次。左右填 -1 到 1(常用「按下 → ? 减 按下 ← ?」),跳填跳键按着没有。

  • 起步和刹车有加速度,转身回头快,空中也能转向;
  • 离开平台边缘后的一小会儿里还能起跳;落地前一小会儿按的跳,落地时照样跳;
  • 按住跳键跳满高度,点一下跳得低;下落比上升快,按住跳键到顶点附近会稍微悬停;
  • 起跳时头顶只擦到砖块边角,会被挪开让过去;走路能直接迈上几像素高的小台阶;往下落时差几像素够不上平台边,会被抬上去;下坡、下台阶贴着地面,不会飞起来;
  • 站在移动平台上跟着平台走;站在绳桥、果冻上会把它们压弯;
  • 进了液体自动变成游泳:每按一下跳往上划一下,下沉慢;刚冲出水面的一小会儿里按跳,给一次完整的跳跃,能跳上岸;
  • 站在单向平台上按住 ↓ 再按跳,从平台上跳下去(左右那一格填 ↓ 时的值由积木自己看,不用另外写);
  • 贴着墙不会被挂住;动态物体(箱子)横着走过去会推开,从上面能站上去。

俯视角:「让 [物体] 按俯视角移动 x [ ] y [ ]」每帧调一次,x、y 填 -1 到 1。角色模式默认跟着世界视角:俯视、斜俯视的世界里自动按俯视角走,横版里按平台跳跃,不用另外设。

  • 没有重力,按速度的方向整体加减速:斜着走和横着走一样快,转弯利落,不会拐出折线;
  • 碰到墙沿着墙滑;横着走撞到墙角、差几像素就能从旁边过去时,会被顺着引过去(门口、两棵树中间一下就钻过去),差多少由「顶头角落修正」管;
  • 朝向记最后一次按的方向:「[物体] 的角色 [朝向(上、下、左、右)]」给四方向,用来选造型、决定面前是哪一格,另外还有朝向 x、朝向 y 和「在走」;
  • 两个角色碰上只有「撞到 / 被撞」,没有踩和顶。

按格子走:「把 [物体] 的角色模式设为 [按格子走]」,还是用「按俯视角移动」喂方向。角色停在格子中心,按住方向键走一整格,走到了还按着就接着走下一格,中间不停;站着时朝新方向轻点一下只转身,按住一会儿才迈步;前面那格被挡住就原地不动,报一次撞到。格子大小、格子偏移(格子中心对齐到 偏移 + n × 格子大小)、轻点转身的时间在「角色手感」里调。

交互:「让 [物体] 和面前 [ ] 以内的东西交互」找面前最近的物体:先看正前方和身体一样宽的一条,没有才往两侧放宽一点找,贴在身体侧面的墙不会抢在正前方的树前面。找到的那个物体收到「当我 [被交互] [角色]」,自己收到「交互了」;在事件脚本里「碰到的角色」「碰到的角色的 [ ]」照样能读是谁来交互的。传感器也算,门口、告示牌的触发区直接用。「碰到(任意方向)」不包括交互。

敌人:「让 [物体] 巡逻:速度 [ ],走到边缘时 [ ]」每帧调一次,一直朝一个方向走,碰墙自己掉头;选「掉头」时走到平台边缘也回头。「让 [物体] [朝左/朝右/掉头]」改方向。

事件:角色之间不互相挡,碰到时两边各收到一个事件:

我这边 对方那边 什么时候
踩到 被踩 我从上面落到它身上
顶到 被顶 我往上撞到它(顶砖块)
撞到 被撞 侧面碰上

「碰到(任意方向)」三种都算。角色碰到地形、砖块也有「踩到、顶到、撞到」,砖块那边收到「被顶」,问号砖就这样做。在事件脚本里,「碰到的角色」是对方的角色名,「碰到的角色的 [ ]」读对方的 x、y、方向、造型、名字,或者它的某个变量(比如乌龟的「状态」),克隆体读的是那一个克隆体自己的值;对方在同一帧里把自己删了也读得到。

「[物体] 的角色 [ ]」读状态:在地面上、碰到的墙、头碰到东西、在水里、x 速度、y 速度、朝向、四方向朝向、在走。「把 [物体] 的速度设为」照样能用,踩到敌人弹起来就是设一个向上的速度。

用「把 [物体] 的角色手感 [参数] 设为 [ ]」调手感:

参数 默认 作用
最高速度 240 走得最快时每秒多少舞台单位;跑动键按下时调大就是冲刺
加速度、刹车减速度 2400、3200 地上起步、松手或转身时每秒改变多少速度
空中加速度、空中减速度 1600、500 空中的对应值
跳跃高度 120 按住跳键能跳多高
提前松开跳键保留的上升速度 0.45 上升途中松开跳键时,上升速度乘这个数
离开边缘后还能跳的时间 0.1 秒
落地前按跳的提前量 0.12 秒
下落重力倍数、顶点重力倍数 1.8、0.5 下落时、按住跳键到顶点附近时的重力倍数
顶点速度范围 80 竖直速度小于它算到了顶点附近
最大下落速度 900 下落不会比它更快
能迈上的台阶高度 6 走路直接迈上去,不用跳
顶头角落修正 6 头顶只擦到这么多像素的边角时挪开让过去
贴地距离 6 下坡、下台阶时往下贴多远
落地弹起速度 0 火球、弹跳的星星这类一落地就弹起来的东西用
水中重力倍数、水中划水速度、水中速度倍数 0.3、220、0.6 游泳手感
格子大小、格子偏移 x、格子偏移 y 24、0、0 按格子走时一格多大、格子中心对在哪
格子模式轻点转身的时间 0.08 秒。朝新方向按住超过这么久才迈步

角色卡进了墙或地里(比如刚生成时地面还没建好),会自己往上挪出来。

动态物体也能用「按平台角色移动」:它仍然是刚体,引擎每一步直接改它的速度,停止调用四分之一秒后恢复普通物理。要游戏手感选「角色」类型。

斜俯视:前后遮挡与脚底碰撞#

宝可梦、星露谷这种斜着往下看的画面,画面越靠下的东西离镜头越近。把舞台「物理世界」的视角设成斜俯视:

  • 前后遮挡:每帧按每个物体画面上的底边从上到下排前后,人走到树干下方就挡住树干,走到上方就被树冠挡住。只在参与排序的角色原来占着的那几层之间调换,界面、天空这些不参与的角色一层都不动;积木读到的「图层」编号不变。物体的「遮挡偏移」加到底边上,正数往后排、负数往前排。没开物理的角色(种下的作物、特效)用「把我的前后遮挡设为 [开]」加进来,克隆体跟着本体。
  • 地面要关掉前后遮挡:铺在最底下的地面、地板底边很低,参与排序会被排到最前面,把上面的东西都盖住。
  • 脚底碰撞:房子、树、人只有接地那一截挡路,人能走到屋顶、树冠后面去。把物体的「脚底碰撞」设成一个高度,碰撞外形(手画的或者按造型生成的)只留最底下这么高的一截;画碰撞体时也可以直接只画脚底。

用运动积木挪物理角色#

作品运行时,「移到 x y」「将 x 增加」这类积木挪的是角色,物理会跟上:

  • 挪动距离小于物体本身的大小时,按「脚本移动」的设置处理。默认「会碰撞」,走路撞墙会停下;
  • 挪动距离大于物体本身的大小时(比如「移到出生点」),直接瞬移过去;
  • 随脚本类型的物体在下一步物理里按这段位移走到位,途中能推开动态物体。

作品没运行时,在舞台上拖动角色或单击运动积木,是在摆放初始位置,按下绿旗从这里开始。

鼠标拖拽#

作品运行时,在舞台上按住物体拖动,物理会接过去:

  • 动态物体挂在鼠标上,路上会撞开别的东西,松手时带着速度,可以扔出去;
  • 软体和绳子抓住按下处附近的节点,被拉的地方先变形,整块再跟上;
  • 静止、随脚本的物体和没开物理的角色照常按角色拖。

默认只在编辑器里能拖。要让玩家在全屏或发布后的作品里也能拖,把「鼠标拖拽」设成「总是」。

画面插值#

物理默认每秒计算 60 步。作品帧率是 120 时,一半的帧里物理没有推进;打开画面插值后,这些帧显示 两步之间的位置,运动是连续的。代价是画面比物理状态晚不到一步(1/60 秒)。积木读到的角色坐标是 画面上的坐标。

撞击事件#

「当我受到超过 [ ] 的冲量」只在撞击时触发:两个物体沿接触法线的接近速度超过「撞击速度阈值」 (世界属性,默认 100 舞台单位/秒)。冲量等于有效质量 × 接近速度 ×(1 + 弹性),和物理步数无关。 静止放在地上的物体不会触发。

施加力#

「对 [物体] 施加 力」按这一帧的时长折算成冲量,放在「重复执行」里,每秒的总效果和作品帧率无关。 需要一直作用、不用每帧调用的力,用「施加持续力」和「移除持续力」。

运行中的改动不会存进作品#

作品运行中,积木创建、修改、删除的物体属性、关节、力场、液体、软体和绳,只影响这一次运行:

  • 不会把作品标成「已修改」;
  • 保存作品时存的是运行前的样子;
  • 按下绿旗时恢复运行前的样子,运行中被删掉的关节、力场等也会恢复。

在编辑器里单击积木(作品没运行)时,改动照常保存。「世界 [名字] 记录初始状态」和「加载物理配置」 在运行中也会写进作品。

拼接的地面#

静止和随脚本的物体上,材质相同的碰撞体会合成一整圈轮廓参与碰撞。用许多方块拼出的地面,圆形和胶囊 滚过拼接处不会被接缝弹起。

液体与浮力#

新建的液体按「密度 1」计算。物体的密度 = 质量 ÷ 面积,面积按 100 舞台单位 = 1 米计:60×60 的方块 面积是 0.36,质量 1 kg 时密度约 2.8,会沉;质量调到 0.36 kg 以下就会浮起来。

按「填充」积木的间距铺满的液体一出生就是静止状态,不会先炸开。

液体静止的池子会一直轻轻抖动时,给它一点阻尼和粘度(「把液体 [ ] 的 阻尼 设为 2」)。

液体、软体、绳子都停下来半秒、附近又没有会动的物体时会休眠,这时整个世界的物理点都不计算;有角色、箱子靠近,或者脚本加减了点、挪了节点,就马上醒来。一池水停下来以后也会单独休眠,旁边的吊桥被人踩得一直晃也不影响它,只有真碰到它的东西(落进来的物体、别的液体、贴上来的绳子)才会叫醒。大地图里当装饰的水池和吊桥因此几乎不占时间。

软体与绳#

「把我变成 [弹性软体/布料],网格间距 [ ]」把角色的造型剖分成三角网格,画面上的造型跟着网格一起变形: 落地会被压扁,被撞会凹下去。

  • 弹性软体有「形状保持」(0–1,默认 0.15):每一步把整块网格往原来的形状拉回一部分。数值越小越软、 晃得越久,太小(0.02 左右)压扁后回不到原形;越大越硬。允许整体倒下、转动,只恢复形状。
  • 布料默认不保持整体形状,只约束边长和轻微的弯曲,可以随便折叠、飘动。
  • 被鼠标甩、挤得网格翻面或拉得太长时,会临时加大形状保持,几步之内理顺回原形。
  • 节点质量默认 0.02 千克,一块七十多个节点的果冻和一个普通角色差不多重,撞上去会被撞凹、推开。
  • 网格间距是节点之间的大致距离。角色很大时会自动放宽,节点数控制在四百个左右,间距越小越细腻、也越费时。

「创建吊桥 [名字] 从 x y 到 x y,下垂 [ ],分段 [ ]」建一座两端钉住、中间垂下来的绳桥,角色能站上去走,会把它压弯;桥不会被人压得伸长,走到桥头能直接走上岸。两端钉住的绳子都一样,只有把拉伸柔度调大的绳子才会被拉长。吊桥只和会动的物体碰撞:掉上去的箱子会把它压弯,岸和池底碰不到它,桥头不会卡进岸里;角色是踩在上面走的,从下面能跳穿上去。

软体和绳的「碰撞对象」参数控制这一点:all 什么都撞(默认),dynamic 只撞动态物体。

「创建绳 [名字] 从 x y 到 x y,分段 [ ]」建一根绳子;用「软体 [名字] 的节点区域 … 固定到世界」把一端钉住, 它就挂在那里,物体撞上去会晃。

物理太重时#

一帧里物理的计算时间有预算,大约是这一帧时长的六成。场景太重、一帧里追不上时,物理少走几步,整体放慢, 画面帧率保持稳定;时钟选「按帧」时不受这个限制,结果保持可复现。

出错时#

物理计算中出现错误时,出错的那一步会撤回,世界继续运行,不会停住。同一个错误只记一次,可以用 「物理最近错误」积木或调试面板的「引擎」页查看。

数量上限#

项目 上限
物理世界 8 个
每个世界的物体 默认 1024 个,可在世界属性里调到 2048
每个物体的碰撞块 512 块
关节 4096 个
每个世界的液体点与软体节点 合计 10000 个

相关#

  • 引擎 —— 物体、装配编辑器、碰撞页和舞台叠加层
  • 光照 —— 引擎组的另一个扩展
  • 帧间隔 —— 作品帧率和时间