DAZ Script開発環境の構築方法[DAZ Studio]

※本記事はBlogの方にも投稿しています。
http://lowpolysnow.com/wp/20181202/27/

---

## 概要
DAZ Studioにはスクリプト機能がありますが、エディタとデバッガしかついておらず、コード補完などのまともにプログラムが書ける環境がありません。
なにかいい方法は無いかと探していたところ、DAZのフォーラムで下記のトピックを見つけました。

> New to the scripting IDE...
> [https://www.daz3d.com/forums/discussion/95971/new-to-the-scripting-ide](https://www.daz3d.com/forums/discussion/95971/new-to-the-scripting-ide)

要はVisual StudioでTypeScriptとしてコードを書いて、それをDAZ Scriptに変換しDAZ Studioで読み込めるようにするというものです。
DAZ Scriptの開発用テンプレートプロジェクトのリンクも併記してありました。

> jag11/dazsdk-typed: TypeScript definitions &amp; tools for DAZ Studio Scripting
> https://github.com/jag11/dazsdk-typed](https://github.com/jag11/dazsdk-typed)

本稿では、このdazsdk-typedでDAZ Scriptを開発する環境の構築方法を説明します。

## 前提知識
### DAZ Scriptについて
名前からして独自の言語のようですが、QtScript4.5を拡張したECMAScript(3rdEdition)です。[^1]
そのため、JavaScriptと同じ文法で記述することが出来ます。

### TypeScriptについて

JavaScriptなどの動的型付け言語では開発時の難点として、IDEでコード補完が効かないなどの問題があります。さらにJavaScriptではクラスもありません。（特にDAZ Scriptに相当する、ECMAScript(3rdEdition)において）

そこでC++やJAVAと同等の開発効率を実現できるよう、TypeScriptというプログラミング言語がMicrosoftによって開発されました。[^2]
TypeScriptで書かれたコードは変換(トランスパイル)することで、JavaScriptのコードを出力することができます。
Visual Studio上でTypeScriptを用いて開発することで、C++やJAVAと同様、クラスの実装や、開発時のコード補完を実現することが出来ます。



## やりたいこと
DAZ ScriptをJavaScriptに見立てて、TypeScriptで効率的な開発しつつ、JavaScriptを出力し、それをDAZ ScriptとしてDAZ Studioに読み込ませます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/0a896b76-583c-2979-dec5-dee8bb5dfc1e.png)

## 開発環境構築手順
### Visual Studio 2017の準備
Visual Studio 2017へのTypeScriptの導入は、下記のサイトを参考にさせていただきました。

> Visual Studio 2017でTypeScript環境を構築する
> [http://takachan.hatenablog.com/entry/2018/03/09/002412](http://takachan.hatenablog.com/entry/2018/03/09/002412)

Visual Studioの準備は以上です。

### dazsdk-typedについて
次に、下記からdazsdk-typedをダウンロードします。

> jag11/dazsdk-typed: TypeScript definitions &amp; tools for DAZ Studio Scripting
> [https://github.com/jag11/dazsdk-typed](https://github.com/jag11/dazsdk-typed)

展開すると、下記３つのソリューションファイルが出力されます。

* DazScriptProjectTemplate　…　実際にDAZ Scriptを記述する本体。
* DazTypeScriptDefinitionGenerator　…　DazTypeScriptDefinitionGenerator.dllを作成するだけのプロジェクト。編集不要。
* dazsdk-typed　…　DAZ Scriptの型定義ファイル。これのおかげでDAZ Script記述中に、コード補完が有効になる。**プロジェクトの設定変更が必要。**

DazScriptProjectTemplate.slnをダブルクリックして開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/ea7cb658-57d1-99c5-1034-fbee9f775669.png)

### dazsdk-typedプロジェクトの設定変更
DazScriptProjectTemplateソリューションには、DazScriptProjectTemplateプロジェクトに加え、dazsdk-typedプロジェクトが参照されています。
dazsdk-typedプロジェクトを右クリックし、プロパティを開きます。
「TypeScript ビルド」の
　「全般」→「ECMAScriptバージョン」を「ECMAScript 3」に変更
　「全般」→「モジュールシステム」を「AMD」に変更
変更後、上書き保存します。

![1540572842780.png](https://qiita-image-store.s3.amazonaws.com/0/267708/9cc41fd7-0680-4c9b-1072-4b0e3d9810da.png)

### DazScriptProjectTemplateプロジェクトの編集
実際にDAZ Scriptを記述するプロジェクトです。
開いてみると、実態のないファイルが登録されており、テンプレートとしてお膳立てがしてあるので、以下のようにカスタマイズして使用します。

 * DazSDKフォルダの、dazsdk.d.ts、dazsdk.js、dazsdk.js.mapを削除する。
 * TSフォルダのSimpleMultiPassRender.tsを削除する。※dazsdk-typedは、もともとこのスクリプトを開発するために作ったテンプレートのようです。
 * DazSDKフォルダに、DazTypeScriptDefinitionGenerator\DazSDK\dazsdk.d.tsをコピーする。
 * DazScriptフォルダを作成する。
 * DazScriptProjectTemplateプロジェクトを右クリックし、プロパティを開く。「ビルドイベント」の「ビルド後のイベントのコマンドライン」にxcopyコマンドが書かれているので、このパスを変更する。<br/>
    `xcopy /Y ..\*.js ..\*.dsa　→　xcopy /Y ..\..\TS\*.js ..\..\DazScript\*.dsa`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/e48ed22e-873f-e151-535c-528ed6f0cdf4.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/b664a2d4-52a1-af33-780e-d2a785b64165.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/0d03a1a8-ec09-4d38-1ab7-fbb08a6d4379.png)

あとはTSフォルダにTypeScriptでスクリプトを書いていきます。
TypeScriptと言ってもJavaScriptそのままで大丈夫です。(TypeScriptのバージョンによっては、ECMAScript6のletやconstも使えます。)
dazsdk.d.tsファイルのおかげでDAZ Script用のコード補完を効かせながら書いていくことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/783a57fa-dc2d-db54-ae85-92b7ffdff2a0.png)

## ビルド
コードが書けたらビルドし、DAZ Scriptを出力します。
「DazScriptProjectTempleteソリューション」を右クリックし、「ソリューションのビルド」を実行します。
（プロジェクトのビルドではないので気をつけてください。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/db58aa67-3650-6e53-5df0-7c39ec6c1f26.png)

下記のようにTSフォルダ内のtsファイルがJavaScriptに変換され、DAZ Scriptフォルダにdsaファイル（DAZ Scriptファイル）が作成されます。
これをDAZ StudioのScript IDE画面で読み込ませれば、スクリプトの実行が可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/f82cc021-3fd2-028f-f2ce-9ae007c0e0c3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/ffbcca95-84e9-3702-7b86-ff1eed4f166d.png)

なお、DAZ Studioのスクリプト機能では、日本語は文字化けしてしまうので、注意してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267708/bd198f71-6056-7325-30de-cbe5451ca247.png)

DAZ Scriptの開発環境の構築方法は以上です。



[^1]: DAZ Scriptのリファレンス [Scripting - Documentation Center](http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/start)
[^2]: [TypeScript - Wikipedia](https://ja.wikipedia.org/wiki/TypeScript)