使用表达式时,您有时会看到意外的属性值。以下主题描述一些引起混乱的常见原因。
编辑表达式并单击“创建”(Create)按钮之后,请始终检查“脚本编辑器”(Script Editor)中是否出现错误消息。如果改变以前成功运行的表达式、且出现语法错误,则 Maya 将在播放动画时执行上一个成功运行的表达式。这可能会导致您认为编辑更改已生效。
回放之后出现的值
回放场景时,表达式将使用为属性值进行的上一个设置来执行。这有时会产生意外结果。
示例
Ball.tx = $distance; $distance = time;
对于该示例,假定已将动画的开始帧设定为帧 0。
第一个语句将 Ball.tx 设定为变量 $distance。第二个语句将 $distance 设定为时间值。
播放动画时,球将使用时间增量沿 X 轴移动。球的 X 轴位置为 4 栅格单位(例如,当动画时间等于 4 秒时)。
回放动画时,沿 X 轴的球的位置不会按照您的预期返回到 0。表达式在时间等于 4 时,其上一个执行已将 $distance 变量设定为 4。因此回放会将 Ball.tx 设定为 4,然后将 $distance 的值设定为 0(即:回放时的时间值)。
如果再次回放,则沿 X 轴的球的位置将按照您的预期返回到 0。这是因为回放时,表达式的上一个执行会将 $distance 设定为 0,所以该表达式会立即将 Ball.tx 正确设定为 0。
若要修复该问题,请反转语句的顺序并编译表达式:
$distance = time; Ball.tx = $distance;
播放并回放表达式之后,第一个语句将会执行,并将时间指定给 $distance。下一个语句会将 $distance 值(即:第一语句设定的时间值)指定给 Ball.tx。由于第一个语句在回放之后将 $distance 设定为 0 ,因此 Ball 将返回到所需的 translateX 位置。
增量操作
如果在设置动画期间增加属性或变量,则可能会对其行为感到非常困惑。
示例
Ball.ty = 0; Ball.ty = Ball.ty + 1;
球的 translateY 位置沿 Y 轴停留在第 1 个单位处。播放动画时,球的 translateY 位置不会按每一帧增加 1。
示例
Ball.ty = Ball.ty + 1;
播放动画时,球的 translateY 位置将按每一帧增加 1。回放动画时,translateY 将再次增加 1。
再次播放动画时,translateY 位置将按每一帧增加 1。如果回放动画或拖动当前时间指示器,则 translateY 位置将继续沿 Y 轴向上移动。该属性从不会返回其原始位置。
若要在每次回放时将球返回到开始位置,则必须将属性初始化为开始值。例如,可以使用以下表达式:
Ball.ty = Ball.ty + 1; if (frame == 1) Ball.translateY = 0;
这会在回放到帧 1 时,使球返回到为 0 的 Y 位置。但是,拖动当前时间指示器时,球不会返回到为 0 的 Y 位置。
仅当播放帧 1 播放时,if 语句才会将 translateY 的值重置为 0。帧 1 是回放动画时播放的默认帧。如果已将动画设定为在不同的帧中开始,则需在 if 语句中使用不同的帧编号。