使用表达式时,您有时会看到意外的属性值。以下主题描述一些引起混乱的常见原因。        

重要信息                

编辑表达式并单击“创建”(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 语句中使用不同的帧编号。              

,