对于所有其他顶级 MEL 代码而言,在程序外部定义的变量均是可见的(能够访问和更改)。
在程序内部定义的变量仅在该程序内可见。这些变量称为局部变量。例如:
float $counter
程序的局部变量与全局变量分离,并与其他程序中的变量分离。局部变量将覆盖该程序内同名的全局变量。
所有这些变量均允许写入程序,且无需担心选择的变量名称是否会与 Maya 或其他程序冲突。
使用全局关键字,可以使程序内的变量全局可见。
如果要在某个程序中创建并保持变量,并且还在该程序的外部使用该变量,则可以将其声明为全局变量。例如:
global float $counter;
$counter 变量可由顶级中的、以及其他将 $counter 声明为全局变量的程序中的任何 MEL 代码读取或更改。此外,如果全局 $counter 变量已存在,则该程序将使用它,而不是创建新变量。
eval 命令将在顶级 MEL 范围中执行。因此,它可识别全局变量,但不会识别在程序内部定义的变量(局部变量)。
通常,这是一个很好的编程实践,可以尽量避免使用全局变量。这样,调用程序时,几乎不可能出现不需要的副作用。
全局变量的使用示例
以下是一些使用全局变量的代码示例。
示例 1
以下代码在 myProcedure 程序中使用 $globalText 全局变量。globalText 全局变量已在程序的外部定义:
global string $globalText; global proc myProcedure() { global string $globalText; print($globalText); }
示例 2
在该示例中,MEL 将生成一个可用来创建更多子窗口的窗口。$chosenOne 全局变量将跟踪用户选择的子窗口。在每个新创建的子窗口内,均有一个 chooseMe 按钮。单击该按钮,可以将该特定窗口设定为 $chosenOne。在主、父对象窗口中单击“删除选择的窗口”时,将删除 $chosenOne。
在以下图像中,window4 是 $chosenOne,它将在您单击“删除选择的窗口”时删除。
代码如下所示:
global proc int pressMe(string $thisOne) { global string $chosenOne; print ("was " + $chosenOne + " "); $chosenOne = $thisOne; print ("nowIs " + $chosenOne + " "); return 1; } ; global proc int satWindow(){ string $temp = `window -width 150`; button -label "Choose Me" -command ("pressMe " + $temp); showWindow; return 1; } global proc int baseWindow() { global string $chosenOne; window -width 150; columnLayout -adjustableColumn true; button -label "Make another Window" -command "satWindow"; button -label "Delete Chosen Window" -command "deleteUI -window $chosenOne"; showWindow; return 1; } baseWindow()