MayaのMELを使おう!基礎編第3回~変数と配列~
こんにちは!G2 Studiosで3Dアニメーターをやっている嶽本(タケモト)です!
MayaのMELの基礎講座第3回です。
▼第1回・第2回はこちら
変数 ~変数ってなに?~
変数の説明
変数は他の言語でも使われるものですが、MELでの変数は扱いがかなり簡単なので安心してください。
変数とは、何かを出し入れできる箱に名前を付けて置いておくようなものです。
書き方は「$test」のように、「$」と任意の文字列(※)を組み合わせて書きます。
※文字列:複数の並んだ文字のこと。「文字」は1文字のみのことを指す
例, abcdefg ← 文字列 / a ← 文字
言語に初めて触れる方はピンとこないですよね?
まずは書いてみましょうか。
{
$test;
}
中かっこで囲んでいるのは後で説明します。
これを実行しても、何も起きませんよね。まぁ箱を作っただけで中身も何もありませんから。
では変数という箱に何か入れてみましょう。
{
$test = 56;
}
この「=」は、前段でやったように左右が等しいという意味ではありません。
「右側を左側に入れる」という意味で使われます。ややこしいですがプログラム言語はだいたいそうなっているので、覚えてください。
これは、「$testという変数に56という文字を入れた」ということになります。
これを実行しても何も起きません。まだ箱に物を入れただけで、なにも命令していないので。
変数の中身を表示する命令を出してみましょう。
{
$test = 56;
print $test;
}
$testの中に56という値を入れて、$testを表示したら56という値が出てきました。
変数は途中で中身を入れ替えることができます。やってみましょう。
{
$test = 56;
print $test;
$test = 108;
print $test;
}
この例では、最初の56という値を一度表示した後に中身を108に入れ替えて、再度表示しました。
結果が並んでて見づらいですが、$testを2回表示したら結果が変わりましたね。
変数の型
これまで変数に数字も文字列も適当にぶち込んできましたが、この変数に何が入るのか、
本当は先に宣言しておく必要があります。今までのものはMayaが親切で勝手に分類してくれていたのです。
しかし、思ったのと違う扱いをされることもあるので、普通はこの変数に何が入るのか、最初に指定しておきます。
Mayaで使う変数の型は4つあり、それぞれ文字列、整数、小数、ベクトルを扱います。
string:文字列
int:整数
float:小数
vector:ベクトル
さっそく作ってみましょう。そしてprintする変数をいろいろ変えてみましょう。
{
string $moji = "test";
int $seisu = 100;
float $syosu = 25.8;
vector $bekutoru = <<0.5 , 2.8 , 1.1>>;
print $moji;
}
ベクトルは使い方が数学的になってくるので、とりあえず忘れて大丈夫です。
変数の型の宣言は最初に作るときだけで、2回目以降は書いてはいけません。
一度作った変数の型は変更できないので、別の型の変数が必要なら別名の変数を新たに作ってください。
型宣言は新規作成のようなものなので、同じ変数名で型宣言を2回するとエラーがでます。
{
string $moji;
int $moji;
}
ログにエラーが出ましたね。
「Line 3.15」は、3行目の15文字目がおかしいと言っています。
エラーの原因がここにあるとは限りませんが、この近辺を探してみるといいでしょう。
変数同士で計算してみよう
変数は数字同士なら、上でやったように全て計算できます。(printの+-*/%を入れ替えてみましょう!)
{
int $kazu1 = 56;
float $kazu2 = 1.05;
print ($kazu1+$kazu2);
}
文字列は、足し算だけ可能です。文字列同士を連結します。
{
string $moji1 = "abc";
string $moji2 = "def";
print ($moji1+$moji2;)
}
//結果:abcdef
文字列と数字を足し算した場合は、文字列として扱われて連結します。
{
string $moji = "abc";
float $suji = 0.175;
print ($moji+$suji);
}
//結果:abc0.175
変数同士で計算した結果を変数に入れて表示してみよう!(ちょっとややこしいかも)
{
int $suji1 = 5;
float $suji2 = 0.175;
$suji2 = $suji1*$suji2;
print $suji2;
}
//結果:0.875
整数変数$suji1に5を入れ、 小数変数$suji2に0.175を入れ、途中で$suji2に$suji1*$suji2の結果を入れました。
注意!ブロックの考え方(有効範囲を{}で限定する)
お待たせしました、今までずっと説明なしにMELを{}で囲んでいた意味を説明します。
まず、今まで適当な名前で変数を作っていましたが、変数はMayaも使っているので
もとからある変数名とかぶってしまう可能性があります。
また、自分の作った変数は通常はMayaを閉じるまで生き残っているため、作業をすればするほど変数名がかぶる可能性が高まります。かぶったらエラーです。
トライ&エラーで何度も試すのに、変数名をいちいち変えるのは面倒ですよね。
そこで、こちらの「{}」!この中かっこで囲んだ部分をMayaでは「ブロック」といいます。
{}で囲んだ部分はこの中でだけ有効になるので、この中でいくら変数を作っても外にはなんの影響もないのです!
例えるならローカルルールが地元でだけ通じる感じ。
{
string $moji = "test";
}
print $moji;
このように、ブロックの中で変数を作ってもブロックが終わったら無くなっています。
ブロックの中は安全です。ブロックの外に出るのは、もう少し理解を深めてからにしましょう。
配列 ~配列ってなに?~
配列の説明
正確には、配列型変数といいます。
変数はひとつの要素しか持つことができませんが、配列はたくさん持つことができます。
上の方で、変数は箱、と例えましたが、配列は箱に仕切りをいくらでも作れるイメージです。
※配列が何個入るのか、他の言語では最初に指定する場合がありますがMELでは不要です。あとからいくらでも増やせます。
変数:□
配列:□□□□~~~~□□□□
こんな感じ。そして、書き方はこんな感じ。↓
string $moji[];
変数名の後ろに「[]」がつくのが配列の宣言です。これも他の変数と名前がかぶってはいけません。
これに、宣言と同時に文字等を入れるにはこうです。↓
{
string $moji[] = {"abc","def","ghi","jkl","mno"};
}
カンマ「,」で要素を区切ります。ここでは5つの要素を入れました。
各要素は文字列なので””で囲んでいますね。
あとから中身を入れ替えるには、ひとつずつ指定するしかありません。このように。↓
{
string $moji[];
$moji[2] = a;
}
配列の中身を表示してみましょう。書き方が2パターンあります。
{
string $moji[] = {"a","b","c"};
print $moji;
}
printのところで変数名の後に[]を書いていませんが、宣言したあとは$moji[]のように書いてはいけません。
一度宣言した配列は、$mojiだけでその配列全体を指します。
さて、結果はどうだったでしょうか。
a
b
c
こんな感じになったでしょうか。
配列全体を結果に出すと、このようにひとつずつ改行されて表示されます。
では、配列の中からひとつだけ取り出す書き方です。
{
string $moji[] = {"a","b","c"};
print $moji[1];
}
//結果:b
これが、要素をひとつだけ指定する書き方です。aが表示されると思いましたか?
プログラムではよくあることですが、順番は0番から数え始めます。
上の例でいうと、aが0番目、bが1番目、cが2番目になります。これはそういうものなので慣れていきましょう。
配列を作って中身を後からいじってみよう!
まずは普通に配列を作成して全体を表示。
{
int $suji[] = {10,6,7};
print $suji;
}
要素を取り出して計算結果を表示。
{
int $suji[] = {10,6,7};
print ($suji[0]*$suji[2]);
}
要素を取り出して計算した結果をまた配列に入れ、全体を表示。
{
int $suji[] = {10,6,7};
$suji[0] = ($suji[0]*$suji[2]);
print $suji;
}
いろいろできますね。
配列同士の連結や様々な操作は専用のコマンドが用意されているので、興味がありましたら調べてみてください。
ヘルプのドキュメントの索引でいうとArrayの項目が配列関連です。
今回はここまでです。
次回は基礎編最終回。処理の流れの制御について解説します。
▼G2 Studiosのクリエイター向けnoteはこちら
(ぜひマガジンをお気に入り登録して次回更新をお待ちください!)
▼更新情報はTwitterよりチェックしてください
▼G2 Studiosの採用情報はこちら