我正在编写一个 AE 表达式,它将根据效果在同一图层上的关键帧值吐出一个数字。也就是说,如果它是 1,值是 100,如果是 2,值是 101,如果是 3、99,依此类推。这是我的工作:
x = effect("Mouth")("Slider");
if (x == 7 || x == 11 || x == 16) {
103
} else if (x == 6 || x == 10 || x == 15 || x == 25 || x == 26){
102
} else if (x == 5 || x == 9 || x == 12 || x == 14 || x == 19 || x == 24 || x == 27 || x == 28){
101
} else {
100
}
肯定有更优雅的方法吗?我试过写它
if (x == 7 || 11 || 16)
但是告诉After Effects X绝对等于"这个"或"那个"只是让它假设它也等于"一切"。唉。
这有点奇怪(可以说是优雅的?),但如果你只是在寻找更紧凑的东西,你可以做:
x = effect("Mouth")("Slider");
if (",7,11,16,".indexOf(","+x+",") != -1) {
103
} else if (",6,10,15,25,26,".indexOf(","+x+",") != -1) {
102
} else if (",5,9,12,14,19,24,27,28,".indexOf(","+x+",") != -1) {
101
} else {
100
}
但不要忘记两端的逗号!
我想过使用 ECMA 的 array.indexOf(x),但它在 AE 的 JS 表达式中不受支持。[编辑:错误地写了"偏移"]
以下是您可以使用的另外两种方法。您可以进一步压缩此代码,但为了可读性,我将其分散开来。
对于较短的列表,您可以使用开关/机箱,并让多个选项执行相同的代码。这样:
thingToTest = effect("Mouth")("Slider");
switch (thingToTest) {
case 7:
case 11:
case 16:
result = 103;
break;
case 6:
case 10:
case 15:
case 25:
case 26:
result = 102;
break;
case 5:
case 9:
case 12:
case 14:
case 19:
case 24:
case 27:
case 28:
result = 101;
break;
default:
result = 100;
break;
}
问题是,如果你有很多可能的结果需要检查,这可能会变得非常笨拙。在这种情况下,我会将每个结果案例的值设置为一个数组并循环遍历它们。
thingToTest = effect("Mouth")("Slider");
mySet1 = [7, 11, 16];
mySet2 = [6, 10, 15, 25, 26];
mySet3 = [5, 9, 12, 14, 19, 24, 27, 28];
result = 100; // Default
foundIt = 0;
for (i = 0; i < mySet1.length; i++) {
if (mySet1[i] == thingToTest) {
result = 103;
foundIt = 1;
break;
}
}
if(foundIt) {
for (i = 0; i < mySet2.length; i++) {
if (mySet2[i] == thingToTest) {
result = 102;
foundIt = 1;
break;
}
}
}
if(foundIt) {
for (i = 0; i < mySet3.length; i++) {
if (mySet3[i] == thingToTest) {
result = 101;
foundIt = 1;
break;
}
}
}
result;
如果已找到匹配项,则通过将连续组放在条件语句中,不遍历这些数组,可以略微提高性能。为了提高效率,首先针对最长数字列表的内容进行测试是有意义的,因为它更有可能包含匹配项。
这些解决方案可能不那么紧凑,但绝对可扩展。