RPGツクールMV作品をTauriで動かしてみたよ

# TL;DR
- Tauriという、ツクールがWin/Mac/Linux版の実行ファイルを作るのに使っているNw.jsと似た仕組みのツールが出てきたよ。
- Tauriはブラウザエンジン(Chronium, Webkit)に相当する機能をアプリ内に入れなくていいから、容量が小さめで、最新のエンジンの恩恵を受けることができるよ。
- Tauriセットアップして初期アプリの中身をツクールに入れ替えたらコード書かずにそのまま動きました。
    - セーブデータの保存先を標準に合わせることはできそうだけど力尽きたので試してないよ。

# なんの話か
[RPGツクールMV](https://rpgmakerofficial.com/product/mv/)、[MZ](https://rpgmakerofficial.com/product/mz/)は、ゲームの描画エンジンとしてPixi.jsを採用した、HTML5ゲームエンジンです。標準ではnw.jsなるフレームワークで実行ファイルを作成していますが、以下の問題点を抱えています。

- ブラウザエンジンを同梱しているため、サイズが増える上、エンジンが古い。
- 最近は一見更新されているように見えるが、[不具合修正かエンジンの更新が主で、あまり開発が活発ではない](https://github.com/nwjs/nw.js/tags)

最近、片手間にツクールのプラグイン制作コミッションを受けるようになったのですが、使えるJavascript構文と使えない構文の境界がわかりにくく、同じツクールでも1.61かそれ未満かで変わって面倒臭かったので、プラグイン制作はともかく、自分で作るゲームぐらいどうにかならんか探しているうちに、Tauriのリリースニュースが目に入りました。

Tauriはnw.jsのように、HTML5のゲームを実行可能なアプリケーションを構築できるフレームワークです。まだあまりQiitaには記事がないみたいなので、詳しくはWebで探すのが良さそうですが、注目している特徴は以下の通りです。

- ブラウザエンジンを同梱せず、OSのエンジンを利用するため、以下の恩恵が得られる
    - 標準デプロイメントよりサイズが小さくなる
    - Windows Update等で基本的には勝手にアップデートされるため、性能向上やセキュリティ強化の恩恵を受けられる
        - 逆に言うとバージョンアップに影響される可能性がありますが、オプションで同梱させることもできます。
- 2022年6月にバージョン1.0がリリースされたところであり、注目度と開発頻度がnw.jsよりは高め。
- Nw.jsは動かないMac M1でも動作するらしい ( https://github.com/tauri-apps/tauri/issues/1320 )
    - 持ってないので試してませんが。
- 将来的にモバイルアプリのビルドにも対応する予定らしい。

なるほど、良さそうに見えます。元々、ツクールはモバイルブラウザでも動かせるようなゲームなので、RustでHallo Worldを書いたこともない私でもドキュメントの見よう見まねでなんとかなるでしょう(楽観)

# 参考文献
Nw.jsと同じく、マルチプラットフォームのデスクトップアプリを作るためのプラットフォームで有名処であるElectronでは既に先駆者がいらっしゃいます。Tauriで試す場合でも考え方は同じで、Nw.jsに依存した部分を置き換えつつ、うまく動かないところがあればコアスクリプトを修正してやることになります。

ただ、読みはしたのですが、この記事では**一切コードを書いていません**。動作確認だけで力尽きた為です。

https://qiita.com/RaTTiE/items/63f2e351a93f81bc8039

https://qiita.com/triacontane/items/a8610bff9778ca2aaa3e

# TauriでツクールMVプロジェクトを動かす
## 前提ツールのインストール
TauriはNode.jsで動くアプリケーションなので、Node.jsを入れる必要があります。Qiitaの海から手順を探してお使いのOS向けのものをインストールして下さい。

また、それとは別に、OSごとにビルドツールを、Windowsのみデフォルトでは入っていないブラウザエンジンをインストールする必要があります。

https://tauri.app/v1/guides/getting-started/prerequisites/

## まず普通にtauriアプリを起動してみる
全て入れ終わったら、npmコマンドを使って、まずはサンプルアプリを起動します。`npm create tauri-app` で、一番シンプルなバージョンをセットアップします。

```
npm create tauri-app
Need to install the following packages:
  create-tauri-app
Ok to proceed? (y)

✔ Project name · RPGMaker-tauri
✔ Choose your package manager · npm
? Choose your UI template ›
❯ vanilla
  vue
  vue-ts
  svelte
  svelte-ts
  react
  react-ts
  solid
  solid-ts
  next
  next-ts
```

インストールが終わった後は、`npm run tauri dev` で起動できます。
```
npm run tauri dev

> RPGMaker-tauri@0.0.0 tauri
> tauri "dev"

        Info Watching D:\workspace\RPGMaker-tauri\src-tauri for changes...
    Updating crates.io index
       Fetch [=====================>   ]  90.89%, (1626...
```

初回はいっぱいCompilingが走っていささか時間がかかります。無人島でも開拓しながら待ちましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85975/a3d179f4-cc91-75d9-f59b-78440ef7294d.png)

## ツクールMVのプロジェクトを入れていく
では、デフォルトの画面が出たところで、ツクールMVからWeb向けにデプロイメントして、createコマンドが作ったsrcフォルダの中身をまるっと入れ替えます。私の推理が正しければ起動しませんが、とりあえず`npm run tauri dev`してみましょう。

あれ、タイトル出ちゃった……おかしいな……。

https://twitter.com/tennana_tef/status/1564579442071986178

## 確認フェーズ
起動したものは仕方ないので、一通り動作確認して気になるところを見ていきます。とりあえず、タップ・キーボード操作はできるし音も鳴りましたが、何か……何かがあるに違いない。

### ウィンドウサイズ・タイトルを直す
上記スクリーンショットの通り、ツクールデフォルトの解像度とTauriのウィンドウサイズが合っていません。デフォルトのTauriのウィンドウはサイズ変更ができますので、とりあえず大きくしたら全部見えますが、ちょっと格好悪いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85975/8bd95b9e-d142-155f-e900-cc893f8671b9.png)

Tauriとしては、`src-tauri/tauri.conf.json`ファイルの最後の方にある、Windows向け設定を変更すれば一旦は反映されます。理想を言えば、ツクールからTauriに通知するか、Tauriからツクールの設定を読み込んで、ツクール側で指定したものに合わせたいところです。できそうですが試してません。

```
    "windows": [
      {
        "fullscreen": false,
        "height": 624,
        "resizable": false,
        "title": "テストプロジェクト",
        "width": 816
      }
    ]
```

### アイコンを変えたい
`src-tauri\icons` に入っている画像を差し替えるだけで簡単にアイコンを変えることができます。いろんな種類があるようですが、公式でサポートされたコマンドがあります。

https://tauri.app/v1/guides/features/icons

### 開発者ツールは使える?
`run tauri dev` ではF12キーから使えます。`run tauri build`(配布用)では使えません。従来のF8キーを使いたい場合、[トリアコンタンさんのElectronForMz.js](https://qiita.com/triacontane/items/a8610bff9778ca2aaa3e)のようなものを作る必要があるかと思いますが、困らなかったので試していません。

### セーブデータが外に保存されない
何もしていない状態ですと、ツクールはWebブラウザで動いていると判定するようで、セーブデータがローカルに保存されません。もちろん、セーブ&ロード自体はアプリを再起動しても使えるし、ドライブを移動してもロードできます。ブラウザのキャッシュとして保存されているものと思われます。

恐らく、やってみれば簡単に変更できる気はしているのですが、他の確認に夢中になっている間に力尽きました。~~好評だったらやります。~~

## ビルドしてみる
そういえば気になるビルドサイズを見ていませんでした。やってみましょう。怒られました。

```
>npm run tauri build

> RPGMaker-tauri@0.0.0 tauri
> tauri "build"

       Error You must change the bundle identifier in `tauri.conf.json > tauri > bundle > identifier`. The default value `com.tauri.dev` is not allowed as it must be unique across applications.
```

src-tauri\tauri.conf.json の32行目あたりにある識別子(identifier)を書き換えます。他のアプリケーションと被ってはいけないそうなので、サークル名-作品名とかでも良いと思われます。被ると何が起こるかは試していませんが、ツクール作品同士ならセーブデータが共有されてしまいそう。

```
      "icon": [
        "icons/32x32.png",
        "icons/128x128.png",
        "icons/128x128@2x.png",
        "icons/icon.icns",
        "icons/icon.ico"
      ],
-      "identifier": "com.tauri.dev",
+      "identifier": "net.tennana.qiita.mv.test",
      "longDescription": "",
```

直して再度ビルドしてみましょう。Buildingが長かったので止まったかと思いました。

```

   Compiling webview2-com v0.16.0
   Compiling tauri-runtime v0.10.2
   Compiling tauri-runtime-wry v0.10.2
   Building [=======================> ] 426/427: RPGMaker-tauri(bin)
(待つこと6分)
   Finished release [optimized] target(s) in 6m 28s
        Info Verifying wix package
 Downloading https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip
        Info validating hash
        Info extracting WIX
        Info Target: x64
     Running candle for "main.wxs"
     Running light to produce D:\GitWorkSpace\tauri-RMMX\src-tauri\target\release\bundle/msi/RPGMaker-tauri_0.0.0_x64_en-US.msi
    Finished 1 bundle at:
        D:\GitWorkSpace\tauri-RMMX\src-tauri\target\release\bundle/msi/RPGMaker-tauri_0.0.0_x64_en-US.msi
```

最後の `src-tauri\target\release\bundle\msi` に出力されているのは、なんとWindows版のインストーラーです(英語ですが)。ゲーム本体はreleaseフォルダに`RPGMaker-tauri.exe` が作られています。他にもいろんなファイルが作られてはいますが、取り急ぎ確認するのに必要なのはexeファイルだけです。他の場所に移しても単独で動作します。

ちなみに、2回目はもっと短くなりますが、私の環境ではインストーラーの生成に失敗するようになりました。パスの区切り文字がおかしいだけみたいなので、そのうち直るでしょう。

```
    Finished release [optimized] target(s) in 1m 24s
        Info Target: x64
     Running candle for "main.wxs"
     Running light to produce D:\GitWorkSpace\tauri-RMMX\src-tauri\target\release\bundle/msi/RPGMaker-tauri_0.0.0_x64_en-US.msi
       Error failed to bundle project: error running light.exe: error running light.exe: `failed to run C:\Users\tennana\AppData\Local\tauri/WixTools\light.exe`
```


### サイズ比較
ツクールのWebデプロイメント、Winデプロイメントと、TauriのWindows Buildを比べてみました。未使用ファイルを除外していないので大きめです。

| OS  | From  | Size                        |
|-----|-------|-----------------------------|
| Web | MV    | 389 MB (407,927,240 バイト) |
| Win | MV    | 473 MB (496,978,376 バイト) |
| Win | Tauri | 386 MB (405,543,936 バイト) |

Web版に比べてちょっと増えるぐらいかな、と考えていたのですが、ちょっと減りました。ツクールのWindowsデプロイメントとは、`locales`フォルダに各言語向けのファイルらしきものや、ブラウザエンジンそのものが含まれているので、それがなくなった分が差になっています。

なお、実際にはexeファイルだけだと動作しません。TauriがWindowsで使うWebView2というエンジンは、Windows 11なら最初からインストールされていますが、11未満ではダウンロードする必要があります。先のインストーラーなら、なかったらダウンロードしてくれる親切設計ですが、Windows 7がサポートされていないため、デフォルト設定からオプションを変える必要があります。
インストーラーの言語を差し替える方法も書かれているので、好きな文言に書き換えてしまえば良さそう。

https://tauri.app/v1/guides/building/windows/

また、デフォルトではTauriの全ての機能がアプリに含まれています。ツクールに向いた設定を見つけて設定してあげれば、もういくらか小さくなるかもしれませんが、簡単に試したところ2MBぐらいしか変わらなかったので、あまり気にしなくて良いかもしれません。

https://tauri.app/v1/guides/building/app-size


## 他のOS版もビルドしたい
現状のTauriでは、WindowsではWindows向けしかビルドできないようです。Githubチョットワカル感じであれば、Githubさんにビルドしてもらうためのレシピが公式に案内されています。

https://tauri.app/v1/guides/building/cross-platform

# 所感と夢
Electronのように起動スクリプトとか書かないといけないのかな、と身構えていましたが、別にそんなことはありませんでした。セーブデータ部分の手入れと、WebView2のインストールの関係で、インストーラーの言語ファイルを一度書いて使えるようにしてしまえば、使えそうに思います。
できれば、いわゆる動作が重いと言われるツクールプロジェクトでも一度動きを見ておきたいですが、仮に現在重かったとしてもブラウザの進歩の恩恵を受けやすいため、いずれ解消されるでしょう。

他OS向けのビルドができない点も、ロードマップ上は対応予定ですし、現在でもGithub Actionにやってもらう方法が確立しています。公式の提供するActionsを改造して、配布用に画像やJavscriptファイルを最適化してから実行ファイルを作るような処理を書いてみるのも楽しそうです(私は)。

Tauri自身の発展をツクールに取り込むのも面白そうです。Tauriにもプラグイン機構がありますし、現在でも例えば、アプリケーションの更新機能をTauriの仕様に従って実装することもできます。

https://tauri.app/v1/guides/distribution/updater

問題がないわけでもありません。例えば、タイトル画面が出るまでの時間は標準のnw.jsの方が早かったですし、Tauriそのものを活用しようにも、サポートされている言語がRustという~~正直よくわからん~~言語なので、Javascriptが分かる人ならElectronの方が手早く遊べる可能性があります。個人の感覚としてはElectronは動きが重たいイメージがあるので、どっちも軽快になってくれるといいなあ。


ま、私は万年エターナル野郎なので、夢の前に作品をツクるのが先なんですが。

…。

それでは、また互いの気が向いたときにお目にかかりましょう。