After Effects:如果变量等于一组数字的一部分,则返回值



我正在编写一个 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;

如果已找到匹配项,则通过将连续组放在条件语句中,不遍历这些数组,可以略微提高性能。为了提高效率,首先针对最长数字列表的内容进行测试是有意义的,因为它更有可能包含匹配项。

这些解决方案可能不那么紧凑,但绝对可扩展。

最新更新