声明:我写的【AE 表达式】文章都是原创,包括文字和图片请不要以任何形式进行转载。
在 After Effects 中,表达式复用是比较麻烦的,因为表达式的作用域是当前属性,因此无法在其它位置引用,After Effects 用户指南中关于“保存和重用表达式”是需要复制然后粘贴到要使用的位置,当然,其中也提到“可以使用正常的 JavaScript 函数语法在表达式中定义自己的函数”,但是这样定义以后还是需要复制粘贴,依然只能在当前属性中复用。
https://helpx.adobe.com/cn/after-effects/using/expression-basics.html#save_and_reuse_expressions要复用函数,就应该像网站前端引用 js 文件一样,所有网页共用一个 JavaScript 文件,当你修改函数的时候,所有引用自然生效。在 AE 中也是可以这样做的!
我们先来看看在表达式中使用自定义函数:
在源文本上自定义函数,如果不引用的话,会作为字符串输出。
运行以后才可以输出值。
下面我们的任务就是要复用 hello() 这个函数。
首先,用记事本把函数代码粘贴进去;
// 自定义函数实例
function hello(){
return "Hi there!"
}
文本文档 .txt 文件可以直接导入到 AE 中,但是在引用时只能作为文本引用,如果要让函数运行,则需要使用 eval() 方法运行代码。
eval(footage("myFunctions.jsx").sourceText);
hello()
还可以将 .txt 文件扩展名修改为 .jsx,这是 Adobe 专门的脚本文件类型,如果配合 IDE 来编写可以更加方便一些。
当然,也可以在 jsx 文件中写更多的函数然后调用。
以对象方式来复用函数可以使用 .sourceData 属性调用,内容可以直接作为代码运行,这样可以省去 eval() 方法,并且可以在类中定义非函数属性。
没有定义类名的需要在引用时定义类名,如果定义了类名,可以直接引用类名。
// 对象实例
// 定义类名的对象
myClass = {
foo:"foo", // 属性
bar:function bar(){
return "bar"
}, // bar()
hello:function (){
return "Hi there!"
} // hello()
}
// 定义类名以后可以直接引用
footage("myClass.jsx").sourceData
myClass.foo
类名建议在 jsx 文件里定义,因为引用时不容易出错,而且在引用时还可以覆盖定义。
多数情况,我更喜欢使用对象定义的方式,毕竟 eval() 在 JavaScript 中也不是值得推荐的方法。
eval()