Windows環境からMac版を配布する方法

Windowsで作業このページはゲームを制作されている方向けです。Macをお持ちでないことを前提に書いています。

Windows版のRPGツクールMZでmacOS向けにデプロイメントすると、書き出されたGame.appそのままでは起動しません。圧縮ソフトの問題ではなく、書き出した時点で壊れています。

結論

専用ツールで解決できます

Windows上で、Macで正常に起動するzipを作成するツールを用意しました。ゲームフォルダをドラッグ&ドロップするだけです。Macは必要ありません。

mz_zipper for Windows をダウンロード

Windows用 / 無料 / インストール不要

ツールの使い方

Windowsで作業すべてWindows上で完結します。

1. ダウンロードして展開する

zipを展開すると、次のファイルが入っています。

mz_zipper_win.exe 本体 mz_zipper_win.py ソースコード README.txt 説明書 起動できない場合.html 同梱用の説明ページ

2. ゲームフォルダをドラッグ&ドロップする

ツクールMZでmacOS向けにデプロイメントしたフォルダを、mz_zipper_win.exeにドラッグ&ドロップします。

同じ場所に「フォルダ名.zip」ができます。元のフォルダは変更されません。

このとき、同梱されている起動できない場合.htmlGame.appと同じ階層に入れておくことをおすすめします(理由は後述します)。

配布したいフォルダ/ ├── Game.app └── 起動できない場合.html

3. できたzipをそのまま配布する

実行結果に表示される「シンボリックリンク : ○個」「実行ファイル : ○個」が0でなければ成功です。

完了しました(10秒) シンボリックリンク : 5 個 実行ファイル(755) : 15 個 通常ファイル(644) : 97 個

0個と表示された場合は、Mac用に書き出されたフォルダかご確認ください。

ウイルス対策ソフトの警告について

この.exeはPythonのプログラムを実行ファイルに変換したものです。この形式は、WindowsのSmartScreenやウイルス対策ソフトに誤検知されることがあります。ウイルスではありません。

「WindowsによってPCが保護されました」と表示された場合は、「詳細情報」→「実行」で起動できます。

気になる場合は、同梱のソースコード(mz_zipper_win.py)をご確認ください。テキストファイルなので中身がそのまま読めます。Python 3をインストールすれば、.exeを使わずにpy mz_zipper_win.pyで実行することもできます。外部ライブラリは一切使っていません。

ツールでは解決できないこと

macOSは、インターネットからダウンロードしたファイルに「隔離属性」を自動的に付けます。これはダウンロードのたびに付き直すため、配布する側で事前に取り除いておくことはできません。またツクールMZが書き出すアプリには、Appleの署名がありません。

そのため、ダウンロードした方の環境では次の操作が必要になります。

これはツール側では解決できません。同梱の起動できない場合.htmlを一緒に配布しておくと、問い合わせを減らせます。

ツールを使わない方法

Macでビルドされた正常なGame.appを入手し、その中にゲームのデータを入れて配布する方法もあります。手順はWindows環境でもRPG Maker MV/MZでmacOS版を簡単にデプロイする方法(Mirai氏)が詳しく、こちらもMacがなくても実行できます。

また、Mac環境をお持ちの方に、書き出しとzip化を依頼する方法もあります。

Windowsで圧縮ソフトを変えても解決しません。zip形式そのものは必要な情報を記録できますが、Windowsのディスクに置いた時点でその情報が消えているため、圧縮ツールには保存すべきものが残っていません。詳しくはなぜ壊れるのかをご覧ください。

あわせて直しておくとよい2点

上記の方法で配布する場合でも、次の2つの問題は残ります。どちらもWindowsのテキストエディタで直せます。Macは不要です。

Windowsで作業

1. package.json の名前を変える

Game.app/Contents/Resources/app.nw/package.jsonを開くと、名前がrmmz-gameになっています。

{ "name": "rmmz-game", <- 全ゲーム共通の初期値 "main": "index.html", ... }

この名前は、プレイヤーのMac上でキャッシュの保存先を決めるのに使われます。初期値のままだと世界中のツクールMZ製ゲームがひとつのフォルダを共有してしまい、プレイヤーが別のゲームを遊んでいるだけで、あなたのゲームが起動しなくなることがあります。

ゲーム固有の名前(半角英数字とハイフン)に変更してください。

{ "name": "mygame-title", <- ご自身のゲーム固有の名前に "main": "index.html", ... }

セーブデータには影響しません。ツクールMZのセーブは、ゲームフォルダ内のsaveフォルダに保存されるためです。

Windowsで作業

2. Info.plist から2つの項目を削除する

Game.app/Contents/Info.plistはテキストファイル(XML形式)です。この中に、NW.jsがもともと持っている「自分はブラウザである」という宣言が残っています。

そのままだとプレイヤーのMacで、HTMLファイルや画像のアイコンがゲームのものに変わったり、ダブルクリックでゲームが起動してしまうことがあります。

テキストエディタで開き、次の2箇所を削除してください。それぞれ<key>の行から、対応する</array>の行までが1セットです。

この2つのキーと、その中身をまるごと削除する <key>CFBundleDocumentTypes</key> <array> ... (HTMLや画像など15種類の宣言) </array> <key>CFBundleURLTypes</key> <array> ... (http / https / file の宣言) </array>

削除してもゲームの動作には影響しません。編集の際は、必ずバックアップを取ってから作業してください。

Apple シリコン(M1以降)のMacについて

ツクールMZが同梱しているNW.jsは、Intel Mac用(x86_64)としてビルドされています。ツクールMZ本体が最新版であっても、同梱されるNW.jsは更新されません。実際にデプロイメントしたGame.appを調べると、次のようになっています。

アーキテクチャ : x86_64 <- Intel用 NW.js : 88.0.4324.96 <- Chromium 88 相当(2021年2月頃)

NW.jsがApple シリコンに公式対応したのは v0.77.0(2023年6月、Chromium 114) からです。ツクールMZが同梱しているものは、それより2年以上前のバージョンにあたります。

配布上、何が起きるか

Apple シリコンのMacでは、Rosetta 2という変換機能を通して動作します。動作自体に問題はありませんが、次の点にご留意ください。

「Rosettaのインストールを求められたが大丈夫か」と問い合わせを受けることがあります。正常な動作ですとお答えいただければ問題ありません。

NW.jsの差し替えについて(上級者向け)

nwjs.ioから新しいバージョンを入手して差し替えれば、Apple シリコンでネイティブ動作させることもできます。ただしおすすめはしません

NW.jsのバージョンが大きく変わると、ChromiumやNode.jsのバージョンも変わります。プラグインが動作しなくなったり、これまで動いていた処理が変わったりする可能性があり、Macで動作確認できる環境がないまま差し替えるのは危険です。

差し替える場合も、Windows上で作業したあとは、必ず上記のツールでzip化してください。ダウンロードしたNW.jsをWindowsで展開した時点で、同じように壊れているためです。

プレイヤーから不具合を報告されたら

Macをお持ちでないと現象を確認できないため、報告内容から原因を判断することになります。下の表をご覧ください。

プレイヤーからの報告 原因 あなたがすべきこと
アプリケーション“Game.app”を開けません、と出る Windowsで書き出したため、実行権限とリンクが失われている 対処法のページを案内する
(プレイヤー側で修復できます)

次回配布からツールで予防
“Game.app”は壊れているため開けません、と出る ダウンロード時に付く隔離属性 対処法のページを案内する
(配布側では対処できません)
nwjsが予期しない理由で終了しました、と出る 他のツクールMZ製ゲームのキャッシュと衝突している 対処法のページを案内する

次回配布からpackage.jsonの名前変更で予防
Rosettaのインストールを求められた 同梱のNW.jsがIntel用のため(正常な動作です) 指示に従って導入するようご案内する

Apple シリコンについて
ファイルのアイコンが勝手に変わった Info.plistの宣言が残っている トップページを案内する

次回配布からInfo.plistの修正で予防

いずれもプレイヤーの方に手間をかけさせてしまいます。配布ページに対処法のページへのリンクを添えておくと、問い合わせを減らせます。

なぜ壊れるのか

技術的な背景です。読み飛ばしていただいても、配布には支障ありません。

Windowsが保持できない2つの情報について

Game.appの中身は、単なるファイルの集まりではありません。macOSが実行するために必要な情報が2つ含まれており、そのどちらもWindowsのファイルシステムであるNTFSには保存できません。ツクールMZがMac用のテンプレートをWindowsのディスク上に展開した時点で、この2つは失われます。

1. シンボリックリンクが、ただのテキストファイルに化ける

macOSのフレームワークは、実体をVersions/の下に置き、その上の階層からシンボリックリンクで参照する構造です。Windowsを経由すると、このリンクが「リンク先のパスを書いただけの数十バイトのファイル」に置き換わります。

壊れている状態(Windows経由)

-rw-rw-r--  24  Helpers
-rw-rw-r--  34  Internet Plug-Ins
-rw-rw-r--  26  Libraries
-rw-rw-r--  31  nwjs Framework
-rw-rw-r--  26  Resources
-rw-rw-r--  28  XPCServices

正常な状態

lrwxr-xr-x  Helpers -> Versions/Current/…
lrwxr-xr-x  Internet Plug-Ins -> …
lrwxr-xr-x  Libraries -> Versions/Current/…
lrwxr-xr-x  nwjs Framework -> …
lrwxr-xr-x  Resources -> Versions/Current/…
lrwxr-xr-x  XPCServices -> …

先頭がlならリンク、-なら通常ファイルです。壊れている側の24〜34バイトという中途半端なサイズは、パスの文字列そのものです。壊れるのは計7箇所あります。

2. 実行権限がすべて失われる

macOSでは、実行できるファイルに「実行権限(実行ビット)」が必要です。Windowsにはこの概念自体が存在しないため、ディスクに置いた瞬間に情報の保存先がなく、消えます。

壊れている状態(Windows経由)

-rw-rw-r--  Contents/MacOS/nwjs

実行権限つきのファイル: 0個

正常な状態

-rwxr-xr-x  Contents/MacOS/nwjs

実行権限つきのファイル: 16個

ゲーム本体であるContents/MacOS/nwjsが実行できないため、「アプリケーション“Game.app”を開けません」と表示されます。

Mac環境で作業できる場合の手順

Mac環境をお持ちの方に依頼する場合、あるいはご自身でMacを使える場合の手順です。

Macで作業

zip化には ditto を使う

Finderの「圧縮」でも通常は問題ありませんが、確実なのはdittoです。

ditto -c -k --rsrc --sequesterRsrc --keepParent "ゲームフォルダ" "ゲームフォルダ.zip"

ElectronやNW.js製アプリを配布する際の定番の方法で、Appleの公証(notarization)手順でもdittoが指定されています。リソースフォークとシンボリックリンク、実行権限を保持したまま固められます。

なお、圧縮元のフォルダがすでに壊れていては意味がありません。Windowsマシンを経由したフォルダや、GoogleドライブやDropboxなどで同期したフォルダは、その時点で情報が失われていることがあります。

Info.plistの編集をMacで行う場合

APP="Game.appのパス" plutil -remove CFBundleDocumentTypes "$APP/Contents/Info.plist" plutil -remove CFBundleURLTypes "$APP/Contents/Info.plist" # Info.plistを変更したので署名を付け直す codesign --force --deep --sign - "$APP"

署名について

ツクールMZが書き出すアプリにはDeveloper IDによる署名も公証もありません。そのため、どの方法で配布しても、ダウンロードした方は初回のみ右クリック>「開く」が必要になります。これは圧縮方法では解決できませんので、配布時に一言添えておくと親切です。

参考資料