日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年3月6日金曜日

変数 (2)

melスクリプトをはじめたばかりのころに、「変数」の動作を確認するために、数行のスクリプトを書いては消してを繰り返していた。
その時に同じ変数名を繰り返して使うと、warningが出続けて困った。
変数名を変えるかMayaを再起動するまで一度宣言した変数はそのまま残り続けた。

たとえば、
$test =19;
print $test;
を実行したあと、それをすべて削除し、今度は、

$test = "toy";
print $test;
と入力して実行すると、

// Warning: $test = "toy"; //
// Warning: Line 1.17 : Converting string "toy" to an int value of 0. //
// Result: 0 //
と表示される。

$test = 2.5;
print $test;
を実行すると2.5ではなく、
2
と表示される。


メッセージに表示されている通り、$testのタイプが「int」でしか使えなくなっている。

これは一番最初に実行したスクリプトにある
$test =19;
により、変数のタイプが自動的に決まったからだが、
そのスクリプトを削除してもMayaを再起動するまでその変数名$testは、intタイプで固定されてしまう。

これには随分悩まされたが、現時点では見ることができなくなったサイト(後に復活)
Mel Scripting by Janne Ojalaで謎が解決した。

このページ、スコーピングのところにはっきりと書いてあった。
グローバル変数が1度宣言されると、Mayaが再スタートされない限りは、削除したり種類(type)を
再指定するための方法はありません

ちなみにスコーピングとは日本では通常「スコープ」とよばれており、
「有効範囲」とか、「視野」という意味があり、元々望遠鏡(テレスコープ)や顕微鏡(マイクロスコープ)などの「スコープ」と同じであり、ギリシャ語の「ねらい、射的、目標」を意味するSkoposを語源とする。
それを解決するには、基本的に変数はローカル変数として使うということだ。

変数をローカル変数として使うには、プロシージャを使う。
プロシージャの { から } で囲まれた部分で宣言された変数はローカル変数になる。
例:
global proc test3()
{
$int = 2
}


プロシージャ外部で宣言された変数はグローバル変数になる。
ちなみに、プロシージャー内部でそのグローバル変数を参照するには、
そのプロシージャ内で、グローバル変数の変数宣言をする必要がある。
int $x1;
global proc test3()
{
global int $x1; ← 外部変数 $x1 を test3() 内で使う変数宣言
$x1 = 1; ← 外部変数の $x1
}

ためしに簡単なスクリプトを試すためであっても、最後に実行するために
プロシージャを実行するコマンド(プロシージャ名)を入力実行する必要がある。

上記の例では、
test()
がそれであり、上記のプロシージャをスクリプトエディタから実行後、
test()をタイプして実行する。


プロシージャには、もちろんローカルプロシージャーも存在するがこのページでは触れていない。
記述方法は、globalをつけないだけ。
ただ、グローバルプロシージャと同じように有効なのか、ほかに問題を抱えないかという点については
まだ検証していない。

※あとからわかったことだが、プロシージャを使わなくても、
{ }で囲んでやれば、ローカル変数として扱われる。
ただ単に数行のスクリプトをテストしたいだけならこのほうがいいだろう。

2 件のコメント:

  1. melについて検索するとこちらのブログが一番ためになります。ありがとうございます。

    返信削除

  2. なんらかのお役に立てたのがわかるのはこのブログを書いていて一番うれしいことです。
    コメント、ありがとうございます!

    返信削除