MaxScriptを書こう ~その4

2021年9月3日

関数を作ってみる

これまで使ってきたfloorやceilなど、ある機能を実行してくれるものを「関数」と呼びました。これらの3dsmaxにもともと用意されているものを「ビルトイン関数」と呼びましたが、この関数は自分で作ることもできます。

今回は、前回スクリプトエディタに書いて実行した操作を関数にしてみましょう。まず前回書いたものを思い出しましょう。前回ファイルに保存してある人はそれを開いても良いです。

$.pos.x = floor $.pos.x
$.pos.y = floor $.pos.y
$.pos.z = floor $.pos.z

$.posのx, y, zをそれぞれfloorに通して再代入しています。これを関数にしてみます。

関数は以下のような形式で書きます。

function 関数名 引数名 = (
    関数の処理
)

ここではadjustPosという名前の関数にしてみましょう。関数の名前はなんでも構いませんが、なるべくどんな機能かわかるようなわかりやすい名前を付けた方が良いです。

function adjustPos = (
    $.pos.x = floor $.pos.x
    $.pos.y = floor $.pos.y
    $.pos.z = floor $.pos.z
)

関数の書き方に則って、中の処理の部分に操作を実行するスクリプトをそのまま書いただけです。この関数には引数が必要ないので省略しています。このように引数は一つも無いという状態も可能です。

書けたらCtrl+Eで評価してみましょう。タイプミスなどがなければ画面は次のようになるはずです。わかりやすいように球体はマウスでドラッグして適当な位置へ移動させておいてください。

評価を実行したあとに$.posを確認しても、値は丸められていません。つまり関数は、それを評価しただけでは実行されない、ということです。

スクリプトエディタに関数を書いて評価すると、リスナーにはadjustPos()のように関数名のあとに()のついた文字列が表示されます。これで関数はスタンバイされました。以降、3dsmaxを終了するまで、今作ったadjustPosという関数はビルトイン関数と同じように使用することができます。やってみましょう。

リスナーを開いて以下を実行してみてください。実行前に球体の位置を適当に動かして$.posを表示させてから実行しましょう。引数のない関数の実行は次のように書きます。

adjustPos()

実行され、座標のx, y, zすべてが整数になりました。ただ、関数にせずに3行分を実行したときにはx, y, zすべての実行結果がリスナーに出力されましたが、関数にしたところ最後に実行されたz座標の値のみがリスナーに出力されるという違いがあります。

複数の行にまたがるスクリプトはスクリプトエディタを使わないと実行できませんが、その処理を関数にしてしまえばリスナーからも実行できるようになります。

また、関数だけを書いたスクリプトファイルを用意しておき、「スクリプト→スクリプトを起動」から実行すると、その関数が評価されて以降ビルトイン関数と同じように使えるようになります。

次回はこの関数をカスタマイズして、引数を受け取って操作を行うようにしてみましょう。

今回のまとめ

  1. 処理をまとめて関数にすると便利に使いまわすことができる
  2. スクリプトエディタに関数を書いて評価するとビルトイン関数のように使うことができるようになる
  3. 関数は評価しただけでは実行されない
  4. 自分で作った関数は3dsmaxを終了すると消えてしまい、再度使うにはあらためて評価する必要がある

前:MaxScriptを書こう ~その3

次:MaxScriptを書こう ~その5