表达式
表达式基础
表达式是一小段脚本,在每一帧算出一个属性的值:跟随另一个图层、抖动、循环,或让两个设置保持同步。表达式用的是 After Effects 的表达式语言,你在 After Effects 里会的大多数写法这里都能用。
添加表达式
属性或效果控件里旁边带 Σ 按钮的属性,都可以加表达式。
选中图层,找到要加表达式的属性。
点它的 Σ 按钮,或按住 Alt(Mac 上是 ⌥)点它的秒表。属性下方打开表达式输入框,初始内容是
value,即属性自己的值。编写表达式。最后一行的值就是结果,它要与属性相符:数字、像
[x, y]这样的数组、颜色或文本。点预览。表达式在当前帧运行一次;写错时,输入框下方给出出错的行和列。
点应用。只有当前这段文字预览成功后才能应用;预览之后项目又有改动的话,请再预览一次。
- 表达式生效后,属性显示表达式在当前帧给出的值,Σ 按钮会亮起。
- 启用可以关闭表达式而不删掉它(要再预览、应用才算数);删除则删掉它。
- 转换为关键帧按表达式的值在图层的每一帧设一个关键帧,并关闭表达式,与 After Effects 相同。
把一个属性关联到另一个
属性关联器替你写表达式,相当于 After Effects 的关联器(pick whip):让一个属性跟随另一个属性。
打开要跟随的那个属性的表达式。
拖动关联器(表达式旁边的关联按钮),放到它要跟随的属性上:属性、效果控件或时间轴里的都可以。也可以先点关联器,再点那个属性;按 Esc 取消。
关联立即生效,算一步,可以撤销;输入框里显示它写好的表达式。

- 它跟随的属性:这里是滑块控制的滑块。
- 关联器。
- 它写好的表达式,可以像别的表达式一样修改。
- 表达式读取了几个别的属性。
- 它在这一帧给出的值。
- 关联器按名称写出另一个图层和效果;有两个同名时改用 id。
- 大小不同的属性会自动对上:单个数字关联到位置时两个值都用它,位置关联到单个数字时取它的第一个值。
- 属性不能关联到自己,也不能关联到值的种类用不上的属性;这时编辑器会提示,什么也不写。
读取别的图层和属性
表达式能读取项目里的任何属性,写法与 After Effects 相同:
thisComp.layer("Ball").transform.position- 本合成里名为 Ball 的图层的位置
thisComp.layer(1)- 本合成最上面的图层:图层从最上面的 1 开始编号
thisLayer- 表达式所在的图层。它的名称也可以单独用:
position就是它的位置。 comp("Title").layer("Logo")- 另一个合成里的图层,按名称
effect("Slider Control")("Slider")- 本图层某个效果的一个设置,按效果名和设置名
- 名称在表达式每次运行时查找。把图层或合成改名时,表达式里写着它名字的地方会一起改成新名字。表达式运行时才拼出的名字(例如
"Ball " + i)不会改:那个表达式会失效,直到你改好它,问题会报出这个问题。 - 编号跟着图层顺序走:上下移动图层后,
thisComp.layer(1)指的就换了一个图层。 - 表达式能用的全部名称都在表达式参考 (在新标签页打开)里,从属性自己的值和关键帧 (在新标签页打开)到向量运算 (在新标签页打开)和随机数与噪波 (在新标签页打开)。
表达式控件
表达式控件是只保存一个值供表达式读取、不改变画面的效果。把它放在图层上,再把几个属性都关联到它,一个滑块、角度盘或颜色就能同时驱动它们。在效果和预设的表达式控制类别里添加:
- 滑块控制 (在新标签页打开)
- 角度控制 (在新标签页打开)
- 复选框控制 (在新标签页打开)
- 颜色控制 (在新标签页打开)
- 点控制 (在新标签页打开)
- 图层控制 (在新标签页打开)
- 下拉菜单控制 (在新标签页打开)
- 面部跟踪点 (在新标签页打开)
按控件的名称和设置的名称读取它,比如 effect("Slider Control")("Slider"),或用关联器关联到它。每种控件给出什么,见表达式参考 (在新标签页打开)。
表达式出错时
预览能在写进项目之前发现大多数错误:拼写错误、不存在的名称、结果的种类不对。输入框下方的提示给出行和列。
表达式也可能在项目改动之后才出错,比如它点名的图层被删掉,或者表达式在运行时拼出名字、而那个图层改了名。这时问题会列出它和它所在的属性。

- 这一帧有几个问题。
- 哪里出了什么错,以及表达式自己的报错。
- 在此期间,这个属性用不带表达式的值。
- 问题解决之前不能导出。
- 出错的表达式不会让项目的其他部分坏掉:只有这个属性退回到不带表达式的值。
- 改好表达式,再预览、应用一次,或者删掉它;这一帧算得出来时,问题就消失了。
依赖与循环
- 输入框下方显示表达式读取了几个别的属性;每一帧编辑器都先把它们算出来。
- 两个属性互相读取,不管是直接的还是经过别的属性,就形成循环。编辑器能从文字里看出的循环,在预览时就被拒绝;只在运行时才出现的循环,会连同其中的属性链一起报出。
- 读取属性自己的值(
value、valueAtTime)不算依赖:它得到的是表达式之前的值,所以表达式可以建立在自己的关键帧上。
须知
- 表达式与编辑器和网络隔离运行:读不到文件、时钟和页面;同一帧在查看器里、在导出里、在任何电脑上得到的值都一样。
- 每个表达式每一帧都在自己的沙箱里运行一次,所以表达式非常多的合成预览会慢一些。
- 名称遵循 Adobe 的 After Effects 表达式语言 (外部网站,在新标签页打开);不支持的部分 (在新标签页打开)列在参考里。
- Agent 也能提出表达式,和它的其他改动一样以草稿的形式交给你审核。