Mayaで自作ツール配布に専用インストーラを使う方法

#初めに

この記事は　[Maya Advent Calendar 2019](https://qiita.com/advent-calendar/2019/maya)　の8日目の記事になります。

はじめまして、
[株式会社GUNCY'S](https://www.guncys.com/)の代表の野澤と申します。
日頃、twitterやQiitaで有益な情報をもらってばっかりで大変お世話になっているので、たまには自分も恩返しがてら一ネタ投稿したいと思います。
もしかしたらそんなの誰でも知ってるよってい話かもしれませんが、悪しからず。
その前に、弊社GUNCY'Sの紹介を簡単にさせて頂きます。弊社は、3DCGを中心にデジタルコンテンツ全般のゼロイチを作る現場のお手伝いをするために2015年に設立された少数精鋭の（自称）軍師集団です(笑
設立以来非常にバラエティに富んだプロジェクトラインナップを経験させて頂き大変感謝しております。

先日、弊社でフルスクラッチで開発しているWebGLを紹介させてもらいました。来年はもしかしたら次の展開があるかもです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【拡散希望】Shotgunに3Dのビューワーが無くて不便だったからちょっと作ってみた(笑)こういうツールってもしかしたら需要があったりするのかしら？<br>使いたい！っていう人がいたらRTお願いします！1000RT以上いったらOSSで公開しちゃうよ！そんなに行かないか(笑) <a href="https://twitter.com/hashtag/Autodesk?src=hash&amp;ref_src=twsrc%5Etfw">#Autodesk</a> <a href="https://twitter.com/hashtag/shotgun?src=hash&amp;ref_src=twsrc%5Etfw">#shotgun</a> <a href="https://twitter.com/hashtag/WebGL?src=hash&amp;ref_src=twsrc%5Etfw">#WebGL</a> <a href="https://t.co/dZPzyIKkit">pic.twitter.com/dZPzyIKkit</a></p>&mdash; Tetsuya Nozawa (@lphing) <a href="https://twitter.com/lphing/status/1185103477975834624?ref_src=twsrc%5Etfw">October 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


さて、前置きはこのぐらいにして、今回紹介させて頂く話は、Mayaで自作ツールを配布するときに知っておくとちょっと便利なテクニックです。
意外とツールの配布とかってややこしかったりしますよね。

#なぜそれが必要になったか

以前からMayaのツールを開発して協力会社等に配布する際に、ツールのセットアップ方法を指示するドキュメントを用意したりが割と手間でした。
しかもツールが動かないっていう報告がパラパラ来たり、その都度ビデオチャットで動作確認したりと。

ツールをローカルに配置するときに、[Mayaの環境変数](https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2016/JPN/Maya/files/GUID-228CCA33-4AFE-4380-8C3D-18D23F7EAC72-htm.html)を知ってるとそんなに難しくないんですが、すでに社内ツールなどでMaya.envなどで設定されてしまっていたり色々な原因でなかなかスムーズにいかないことが多いです。

#もっといい方法がないか調べてみた

そんなこんなで、これらのメンドクサイことから解放されたい一心で何かいい方法が他にないか調べてみたら、この記事がヒットしました。
[Distributing plug-ins/files on Maya (and 3ds Max)](https://around-the-corner.typepad.com/adn/2013/04/distributing-plug-insfiles-on-maya-and-3ds-max.html)
Autodeskの公式の方が書かれてるブログですね。
英語の記事ですが、要約するとツールを配布する際に、ApplicationPackageというものを作ってxmlファイルに必要な情報を書いて所定の場所に置くとMaya（3dsmaxも）が認識してくれるらしいと。
Autodeskが運営している`Autodesk Exchange Store`で頒布するツールもこの方式に則ているらしいと。
たしかにそういえば、よく使っている`Maya Bonus Tool`もそんな感じだったなと思い出しました。
ちょっとこれは便利かもと思い色々と調べてみることにしました。

#ApplicationPackageの作り方

ApplicationPackageとしてMayaや3dsMaxに自分のツールを認識させるには、
下記のフォルダ内に自作ツールをフォルダに分けて配置します。
（このフォルダは、管理者権限がないと書き込みが出来ないので注意が必要です。）

`C:\ProgramData\Autodesk\ApplicationPlugins`

試しに、myToolフォルダを作ってみた。

<img width="625" alt="2019-12-06_20h13_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/ede95eec-5007-b404-0454-621621a1b8eb.png">

なかみは、PackageContents.xmlというxml形式のファイルとContentsというフォルダになります。

PackageContents.xmlの中身は、サンプルがネットにいくつか落ちてますので、参考にしましょう。
試しに今回はこんな感じにしました。
シンプルなmelスクリプトmyTool.melを含んでいます。

myTool.melの中身
```
global proc myTool(){
   print "hello";
}
```

```
<?xml version="1.0" encoding="utf-8"?>
<ApplicationPackage SchemaVersion="1.0"
    ProductType="Application"
    AutodeskProduct="Maya"
    Name="myTool"
    Description="hoge"
    AppVersion="1.0.0"
    ProductCode="*"
    >

    <!-- Prevent to load in earlier version than Maya 2014 -->
	 <RuntimeRequirements SupportPath="./Contents/docs" OS="win64" Platform="Maya" SeriesMin="2014"  />
    <Components>
        <RuntimeRequirements SupportPath="./Contents/docs" OS="win64" Platform="Maya" SeriesMin="2014" SeriesMax="2019"/>
		<ComponentEntry ModuleName="./Contents/scripts/myTool.mel" />
	</Components>
</ApplicationPackage>

```

この辺の詳しい話は、[あんどうさんのこの記事](https://fereria.github.io/reincarnation_tech/50_Tool/MayaScriptLauncher/99_history/history_20190413/)がとても分かりやすいので参考にしてください。
スクリプトは、`Contents/scripts`フォルダの中に下図の様に置いてます。
<img width="359" alt="2019-12-06_20h20_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/020647ca-fde7-3ea9-17b3-a5f186cab2e3.png">

ここまで準備が出来たらMayaを立ち上げるとMayaの中でこの`myTool.mel`を認識した状態で使用可能になります。
PackageContentsの話は長くなるので割愛して、本題のオリジナルインストーラを作ってみるところです。

#オリジナルインストーラを作ってみる

さて、今回の記事の本題はここからです。
ここに上記のようにファイルを置くことさえ出来ればツールの配布が簡単になることが分かったので、今度はインストーラを作ることにしましょう。
インストーラがあるだけで大したことないツールも、もっともらしく感じさせることが出来るのでとても重要です(笑
といっても自分はインストーラなんて作ったことなかったので、何か便利なものがないか調べてみることにしました。
インストーラを作るソフトは色々ありますが、その中でも特に使いやすそうなinno Setupというソフトを紹介します。

[オープンソースのインストーラー作成ソフト](https://forest.watch.impress.co.jp/library/software/innosetup/)

#inno Setupの簡単な使い方

inno Setupをインストールしたら、早速自分のツールを所定の位置に配置させるインストーラを作ってみましょう。

FileからNewを選択するとInno Setup Script Wizardが立ち上がります。
<img width="372" alt="2019-12-06_21h52_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/f6a19cfe-118c-fc6c-16b8-ba583fb3b7ad.png">

Create a new empty script fileにチェックを入れておくといいでしょう。
何も書かれていない空のファイルが作られましたのでそのままSave Asします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/09a7e8f3-3b8d-1d23-eba1-6298cf4922c3.png)

次に、下記のようにツールのdefine情報を記入します。
ツール名の宣言みたいなものですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/e1dd09d8-3785-8956-d868-feb7aa34f94f.png)

次に自分のアプリのAppIDを決めます。これは必ずユニークなIDになる必要があるので、innoSetupのGenerate GUIDを活用しましょう

`AppId={`までテキストを入力したら、メニューのToolsからGenerate GUIDを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/b9ddd984-f3dc-977b-c0a0-138bd69418f2.png)
そうすると自動的にIDを生成してくれます。

その下は、図のように上段で宣言したテキストを適宜使用してそれぞれの項目に記載される情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/bdc11f29-97c3-45bf-98f0-aff022a0326a.png)

この辺りはわざわざ記載しなくても特に問題ないと思います。

#さらに細かい設定を加える

図のようにさらに細かい設定を加えてみました。内容についてはコメントを読んで頂ければわかると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/96c56f68-3368-bf4d-567c-a9eeecc874fe.png)

[こちら](https://juraku-software.net/inno-setup-scripts-template/)のページにinno Setupのスクリプトテンプレートが記載されていて分かりやすかったです。


下記のようなフォルダ構成にしています。
![2019-12-08_13h57_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/7debbda5-d447-a220-87b1-37d6fc08bfc4.png)

それぞれ目的に合わせて好きな画像やテキストを用意します。

#言語設定とファイルを追加する

さらに、今度はインストーラの言語設定と実際にインストールさせるファイルについて記述します。
下図の通り、`Source:`のファイルを`DestDir`に配置するという事です。`Flags`も適宜調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/32eaa8c0-426d-d640-2b26-45decf772734.png)

ここまで出来たら、ビルドしてみましょう。
ビルドは非常に簡単でinno Setupのメニューの`Build > Compile`を実行して待っているだけです。
ビルドに成功していると、outputフォルダにexeファイルが作られています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/6d2a81ba-21ea-2de6-f02c-04f843fb3eb4.png)


#インストーラを実行してみる

では、早速インストーラを実行してみましょう

言語を選ぶ画面が出ます
![2019-12-08_14h07_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/2d9c4757-96ad-ec2e-7438-7aa1c6bc43ff.png)

セットアップウィザードの開始画面
![2019-12-08_14h07_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/3b8cb3d2-0f42-eecb-ad4b-f07959bc0796.png)
使用許諾契約書の同意画面
![2019-12-08_14h08_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/5f978380-fc58-4f71-ecb2-fa47a6b38e16.png)
インストール前の説明文画面
![2019-12-08_14h08_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/c439209f-5060-3cb3-5150-8f6ef30ebbe5.png)
インストール前の確認画面
![2019-12-08_14h08_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/6aa13bf3-6ac6-584f-279e-f93c9be1c9ac.png)
インストール後の説明文画面
![2019-12-08_14h08_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/9dc79123-b379-8754-1f56-3975d43fc6d4.png)
セットアップウィザード完了画面
![2019-12-08_14h08_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/700a1239-8368-cf19-89cf-9dc30920d85e.png)
よく見ると画像がはみ出ちゃったりしてますね。
[こちら](http://inno-setup.sidefeed.com/archives/000779.html)のページに詳しい画像サイズなど書いてあるので参考にしてください。

#インストールされたツールの挙動を確認する

さて、無事インストールが完了しましたので、ツールの挙動を確認してみましょう。
Mayaを起動し、`commandLine`の所に、`myTool`と打って実行してみました。このmyTool.melは`hello`とプリントするだけです(笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/0abd86a8-a910-da78-4950-8d6b27bdcfc5.png)
ちゃんと目的を達成できました。万歳～。

もしもツールが不要になったら、Windowsの`アプリと機能`の中を見ると`myTool`がありますのでアンインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66412/c3cd6745-758a-b3c1-998d-8161d382b773.png)

#まとめ

最後までお付き合いいただきありがとうございました。
Mayaや3dsMaxでツールを配布する時に、あまり難しいことを考えずにインストールさせるのにこんな方法もよかったら試してみて頂けると幸いです。