現在、GameMaker Studio2日本語化プロジェクト に関わっているのですが、その Discord で「これは人生が変わる!」と話題に上がった「GMLive」のついての紹介となります。
GMLiveとは
GMLiveは、GameMaker StudioおよびGameMaker Studio 2(Mac IDEを含む)にライブコーディング/インタラクティブプログラミングを導入する拡張機能です。
これは選択したスクリプトやイベントが変更・保存したときに、再コンパイルして再起動する必要なく、ゲームの途中で再読み込みすることができます。(ホットリロード)
これにより、特にコンパイル時間の長いプロジェクトやプラットフォームでは、開発期間を大幅に短縮できます。
拡張機能はすべてのモジュールで動作します。ブラウザ、モバイルデバイス、またはコンソールでゲームを実行しながら、リモートでコードを更新することもできます。
GameMakerでホットリロードを実装するには、通常は Included Files
にパラメータを逃して再読み込みする機能を実装する必要があるのですが、この拡張機能を使用すると、スクリプトやスプライトといったリソースもリロードできてしまう……という素晴らしいものです。……これは、試してみないと……!!
導入手順
ということで導入手順です。
まずは GMLiveの公式サイト に移動して、購入を行う必要があります。
$29.95 (≒¥3,300くらい) とそれなりのお値段ですが、物は試しということで購入。
なお、支払いはクレジットカードとPaypalが使用可能です。
ダウンロード
購入をすると自動でダウンロード画面に遷移します。またメールアドレスにも同じURLが送られるので、そこから開くこともできます。
GameMaker Studio 2であれば、赤線で囲んだいずれかのファイルをダウンロードします。
- GMLiveForGMS2_and_catch_error.yymp: "catch_error" という拡張機能を使っている場合
- GMLiveForGMS2_pre_2_2_4.yymp:GameMaker Studio2 v2.2.4以下を使用している場合 (v2.1.5まで利用可能)
- GMLiveForGMS2.yymp: 上記に該当しない場合
現時点 (2020/5/16) の最新バージョンは "v2.2.5" なので最新版を使用していれば、GMLiveForGMS2.yymp
で問題ないです。
初期セットアップ
GMLiveの公式ドキュメント には以下の手順でセットアップを行うように書かれています。
- GMLiveアセットをプロジェクトにインポートします。(itch.ioでは、.yympファイルをワークスペース領域にドラッグする必要があります)
- パッケージからアセット(Extension、Object、Included Files)をインポートします
- Macでは、Windows固有のexeおよびndllファイルのインポートを省略します。
プロジェクトの最初の部屋にobj_gmliveを配置します
ということで、まずは *.yymp ファイルをプロジェクトにドラッグ&ドロップします。
するとインポート確認ダイアログが表示されるので、YESボタンを押してインポートします。
次にインポートするファイル選択ダイアログが表示されるので、Add All
ボタンをクリックして "Resources to Import" にインポート対象ファイルを移動させて、"import"ボタンをクリックします。
すると、Objectに obj_gmlive
、Included Filesの GMLiveフォルダ
に GMLive 関連の実行ファイルとDLL、Extensionsに GMLive
が追加されます。
(※なお、macOS環境では *.exe / *.ndll ファイルが不要となりますが、インポートしても問題なく動作します)
スタートアップ
プロジェクトの設定は公式ドキュメントには以下のように書かれています。
- Included Filesの
gmlive-server.exe
を右クリックし、[Open in Explorer]を選んでエクスプローラーを開きます(Macでは「Open in Finder」) - Windowsでは、
gmlive-server.exe
をダブルクリックします。
Macでは、ディレクトリでターミナルを開き、neko gmlive-server.n
を実行します。(詳細については、gmlive-server を参照してください)
ゲームを再コンパイルするときは、実行したままにすることができます。新しいゲームインスタンスが接続するたびにプロジェクトディレクトリが再スキャンされます - 目的のスクリプトとイベントにGMLive関数呼び出しを追加します。
イベントはGMLタイプのみ使用可能です(GMLブロックのDnDではありません) - ゲームを実行します
- 「ライブ」スクリプト/イベントを変更して、ゲーム内の変化を確認します(すべてが正しく行われた場合)。 gmlive-serverのウィンドウがステータスの更新を報告します
ということでこの手順に従って実行していきます。
まずは GMLiveサーバーの実行から。
Included Filesの GMLive を右クリックしてコンテキストメニューを表示します。
macOS環境なので表示が異なっていますが、Windowsでも一番下の項目に「Open in Explorer」があるはず……
つぎに gmlive-server.exe
をダブルクリックで実行。macOSの場合はターミナルから neko gmlive-server.n
を実行します
5100番ポートを使用してプロセス間通信するような感じです。
この画面を終了するとサーバーが停止してしまうので、起動したままにします。
次にテスト用のオブジェクトの作成。テスト用なので緑色の矩形を表示するだけのオブジェクトを obj_game
として作りました。
コードを以下のように記述します。
if(live_call()) return live_result;
x = 100;
y = 100;
このオブジェクト(obj_game)と obj_gmlive
をルームに配置します。
……
……!?
スクリプトの修正がリアルタイムに反映……?
!!……!?
こ、これは……!?
これは人生変わる……!
あと未検証ですが、obj_gmlive
は persistant なので、起動時のルームのみに配置すればよさそうな感じです。
ルームのリロードを行う方法
以下の動画で手順が紹介されています。
- Using room reloading in GMLive
- https://www.youtube.com/watch?v=_35-xnHQE54&feature=emb_logo
- 空のルームを作成 (rm_live) 。レイヤー情報はすべて削除
- 空のオブジェクトを作成 (obj_blank)
- ルームリロード用のスクリプトを作成 (scr_room_update)して以下のように記述する
room_goto_live(argument0);
4. リロードしたいルームに各種オブジェクトと obj_gmlive
を配置
5. obj_gmlive
を開いて Createイベントに以下のコードを記述する
/// @description Don't forget to place this object in the first room!
if (instance_number(obj_gmlive) > 1) {
var first = instance_find(obj_gmlive, 0);
if (id != first) { instance_destroy(); exit; }
}
#macro live_enabled 1
// a workaround for a GM bug where extension doesn't initialize in debug mode:
if (!variable_global_exists("g_live_log_script")) live_preinit();
// change IP/port here if you connect to remote gmlive-server:
live_init(1, "http://localhost:5100", "");
// ------------------------------------
// 以下を追加
live_blank_object = obj_blank;
live_blank_room = rm_live;
live_room_updated = scr_room_update;
room_set_live(room1, true); // リロードを行うルームを設定