MAXScript の読みかた・書きかた

# 概要
- MAXScriptの読みかた・書きかた（構文）を中心に、その特徴を説明します。
- 解説に必要な「変数」についても、少しだけ触れます。

# 難易度
- 入門

# 閲覧想定ユーザー
- 3dsMaxの操作をある程度行えるデザイナー
- これからMAXScriptを始める方
- プログラミング経験がゼロの方

# 想定所要時間
- 30分

# 構文（お作法）
**構文とは、MAXScriptを構成する法則です。文の書き方、単語の並べ方のことです。**

**構文を間違えていると、MAXScriptが正しく動きません。**

**スクリプトファイルの中身を見ても内容が全く分からないケースのほとんどは、構文や単語の持つ意味を理解しないままに眺めているためです。**

すべての構文を理解するためには[リファレンス](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_46ECBAD7_35E9_43BD_8A8C_849772924805_htm)を読むしかありませんが、いきなりすべてを覚えてからコーディングに臨むのはハードルが高すぎるので、いくつかの記事に分けて説明します。

# MAXScriptは「式」で構成されている
MAXScriptには、目的とする処理を実行するための**式**が書かれています。
式には、条件分岐や数値計算など、さまざまな種類が存在します。

※式については、別の記事でくわしく説明予定です。


# 変数
**変数とは、計算中に数値などを入れておく箱のような概念です。**
変数に入れておくことで、後から内容物を取得することができます。MAXScriptに限らず、プログラミングでは必須の概念です。

※変数については、別の記事でくわしく説明予定です。

## 例
理解を深めるために、以下のコードを見てみましょう。

```
x = 1
print x
```

1行目で `x = 1` としています。これは **変数** `x` に **数値** `1` を代入する、といった命令になります。


2行目で `print x` と書いていますが、 `print` とは、スペースを空けて次に記載された対象をMAXScriptリスナーに表示する、という命令です。

この場合は `print` の横に `x` を記載しているため「変数 `x` の内容を表示する」といった命令になります。

このスクリプトを実行すると、MAXScriptリスナーに `1` が表示されます。

# リスナーの確認方法
**MAXScriptリスナーは、メニューバーの「スクリプト」→「MAXScript リスナー」を選択すると表示できます。**

![リスナー起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144790/08760cd4-a106-faed-1c5e-a94f786bd2f5.png)
△ 画像は英語版の3dsMax

MAXScript リスナー ウィンドウです。
先ほどのスクリプトを実行したので `1` が表示されています。
![リスナーウィンドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144790/277d9ca3-bdd6-b6d6-4fd0-bf8bfb7a4763.png)

※3dsMaxの環境によっては、最初から他のテキストが表示されている場合もあります。その場合は、ログの末尾に `1` が表示されているかご確認ください。
※スクリプト実行前に、ログを消去することをオススメします。

## 例
変数には数値以外、たとえばオブジェクトも代入できるため、このような使い方も可能です。

```
x = Teapot()
x.wirecolor = red
```

1行目では変数 `x` にティーポットを入れています。
このような記述方法をすることで、生成したティーポットをそのまま変数に代入することが可能です。

2行目では、変数 `x` に代入したオブジェクト、つまりティーポットのワイヤーカラーを `red` (赤色)に変更しています。

 

新規シーンにスクリプトを実行すると、以下の様に表示されるはずです。

![teapot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144790/2ca9d42a-5b44-a83e-e25c-e997c190b178.png)


# 処理される順番
**スクリプトを起動すると、1行目から最後の行まで、順番に1行ずつ処理されていきます。
1行ずつの処理は、左から右へ処理が進みます。**

それを確かめるために、下のコードを見ていきます。

```
x = 100
x = 10
print x
```

1行目では変数 `x` に `100` を代入、2行目で更に `10` を代入しています。
上から処理されるため、3行目の `print x` では最後に代入された `10` が表示されます。


# 大文字・小文字は関係ない
**MAXScriptで使われる変数名・関数名は、大文字・小文字の区別がされません。**


## 例


以下のコードを実行して、確かめましょう。

```
a = 10
b = 5
C = (A - b)

print c
```

このコードには、変数 `a` `b` `c` が存在しています。
小文字と大文字が混在していますが、どちらも同じものとして扱われます。

**ただし、同一のスクリプト内で大文字・小文字の規則を変えてしまうと、読みづらくなります。
できるだけ統一した方が良いでしょう。**

# スペースはいくつあっても同じ
**式の途中にスペースをいくつ使っても、同じ結果が返されます。**

たとえば、以下の 式 A~C はいずれも同じ結果を返します。
結果を確かめるために、実行してみましょう。

### 式 A

```
a = 10
print a
```

### 式 B

```
a=10
print a
```

### 式 C

```
a     =      10
print a
```

## NG例

**以下のような書き方はエラーが出るため、NGです。**

```
a = 1 0
print a
```

`10` という値を `1 0` のようにスペースで分断してしまうと、`10` が数値として認識されなくなります。
このコードを実行すると、構文エラーで処理が止まるはずです。

# 全角文字
**全角文字は、主にコメントや、GUIなどのボタンの名称やダイアログメッセージとして表示する場合に用います。**

変数名などにも利用できますが、推奨されません。（やろうと思えば絵文字も使えます）

※コメントについては、別の記事でくわしく説明予定です。

# 参考
- 公式リファレンス
 - [MAXScript の紹介](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_F039181A_C072_4469_A329_AE60FF7535E7_htm)
 - [MAXScript とは](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_41315287_B2FA_4496_BDB6_28F8D38D2213_htm)
 - [MAXScript の文法](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_46ECBAD7_35E9_43BD_8A8C_849772924805_htm)
 - [式](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_B93647B2_8BC7_4D83_BA90_0105DAB3591C_htm)