UnityScriptをコマンドラインでコンパイル

[Unityにおける、Booコンパイラ＆JavaScriptコンパイラの場所](http://qiita.com/JunSuzukiJapan@github/items/7eb69249c5667557ab6a)で、
UnityScriptのコンパイラらしきものの場所を調べた。

今回は、その使い方。

# 必須オプション

us.exe（UnityScriptコンパイラ）のオプションのリストをみてみよう。

```text:
 -b  -base:class                            Base class for the script module
     -debug[+-]                             Enable writing debug symbols.
     -debug-compiler[+-]                    Displays internal compiler information
 -d  -define:define                         Defines a symbol
     -disable-eval:disable-eval             Disables eval builtin.
     -ducky:ducky                           Option has been deprecated
 -x  -execute[+-]                           Execute resulting main method.
     -expando[+-]                           Enable expando mode.
     -help[+-]                              display this help and exit
 -i  -import:namespace                      Adds a 'import namespace' to the script module
 -m  -method:name                           Module's main method name
     -nowarn:code                           Suppress the warning code
 -o  -out:file                              Specifies the output file name
     -pragmas:set                           Enables a comma separated set of #pragma directives on every module
 -p  -print[+-]                             Print the resulting code (in boo). Do not generate an assembly.
 -r  -reference:assembly                    References the specified assembly
     -resource:file                         Embed a managed resource file
     -srcdir:srcdir                         Includes all *.js files from srcdir
 -t  -target:kind                           Specifies the target (kind is one of: exe, winexe, library)
     -verbose[+-]                           Enable verbose mode.
     -x-type-inference-rule-attribute:type  Enables custom type inference rules to be specified through the attribute type
```

この中で、以下の３つのオプションは必須になっている。指定しないと、ヘルプメッセージがでるだけで終わる。

  -b  -base:class                            Base class for the script module
  -m  -method:name                           Module's main method name
  -srcdir:srcdir                         Includes all *.js files from srcdir

そして、ソースファイルを個別に指定することはどうやら出来ないようだ。
-srcdirオプションで指定したフォルダに入っている*.jsファイルをすべてまとめてコンパイルする仕様のようである。

# サンプル

ためしにコンパイルしてみよう。

空のディレクトリで、Sample.jsという名前で以下の内容のファイルを作成する。

```javascript:Sample.js
#pragma strict

import UnityEngine;
import UnityEditor;

class SampleWindow extends EditorWindow {
    @MenuItem("Window/US Sample")
    static function SampleMenu(){
        Debug.Log("Hello, UnityScript Compiler.");
    }
}
```

同じディレクトリ上で、コンパイラを起動する。
オプションのうち、-methodオプションは一応指定しているが、この場合は意味は無い。
（-baseオプションもクラスを定義している場合は意味がない気がする…。）

```bash:Shell
$ mono /Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/unity/us.exe -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -b:UnityEditor.EditorWindow -m:nomainmethod -srcdir:.
```

そうすると、Sample.dllが作成されているはずである。
これを、UnityプロジェクトのPluginsフォルダあたりにコピーしてやると、
メニューに"US Sample"という項目が追加される。

![スクリーンショット 0025-08-18 16.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/20722/aa031e6c-3c98-3319-2503-6b54057ed27b.png "スクリーンショット 0025-08-18 16.23.23.png")

"US Sample"をクリックすると、ちゃんとコンソールにメッセージが表示される。


![スクリーンショット 0025-08-18 16.23.43.png](https://qiita-image-store.s3.amazonaws.com/0/20722/e6c0ef97-8489-7720-8581-3521029c1c13.png "スクリーンショット 0025-08-18 16.23.43.png")


# Hello, World!

>exeの作り方もわかったので追加。

空のディレクトリで、hello.jsという名前で以下のファイルを作成する。

```js:hello.js
#pragma strict

static function Main(){
    System.Console.WriteLine("Hello, World!");
}
```

コンパイルのコマンドは以下。

```bash:Shell
$ mono /Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/unity/us.exe -b:System.Object -m:Main -target:exe -srcdir:.
```

Main()関数はすでに存在している、とかワーニングがでるが、むしろMain()関数がないとexeファイルは作れなさそうなので無視する。

出来上がったhello.exeを実行すると、無事こんにちは世界できる。

```bash:Shell
$ mono hello.exe
```


# 蛇足

なぜ、必須のオプションがわかったかというと[ここ](https://github.com/bamboo/unityscript/blob/master/src/us/CommandLineOptions.boo)でソースをみたから…だったり。