LoginSignup
6
5

More than 3 years have passed since last update.

【GameMaker:Studio2】人生が変わる拡張機能「GMLive」の紹介

Last updated at Posted at 2020-05-16

現在、GameMaker Studio2日本語化プロジェクト に関わっているのですが、その Discord で「これは人生が変わる!」と話題に上がった「GMLive」のついての紹介となります。

GMLiveとは

GMLiveは、GameMaker StudioおよびGameMaker Studio 2(Mac IDEを含む)にライブコーディング/インタラクティブプログラミングを導入する拡張機能です。

これは選択したスクリプトやイベントが変更・保存したときに、再コンパイルして再起動する必要なく、ゲームの途中で再読み込みすることができます。(ホットリロード)

これにより、特にコンパイル時間の長いプロジェクトやプラットフォームでは、開発期間を大幅に短縮できます。

拡張機能はすべてのモジュールで動作します。ブラウザ、モバイルデバイス、またはコンソールでゲームを実行しながら、リモートでコードを更新することもできます。

GameMakerでホットリロードを実装するには、通常は Included Files にパラメータを逃して再読み込みする機能を実装する必要があるのですが、この拡張機能を使用すると、スクリプトやスプライトといったリソースもリロードできてしまう……という素晴らしいものです。……これは、試してみないと……!!

導入手順

ということで導入手順です。
まずは GMLiveの公式サイト に移動して、購入を行う必要があります。

GMLive_gml_by_YellowAfterlife.png

$29.95 (≒¥3,300くらい) とそれなりのお値段ですが、物は試しということで購入。
なお、支払いはクレジットカードとPaypalが使用可能です。

ダウンロード

購入をすると自動でダウンロード画面に遷移します。またメールアドレスにも同じURLが送られるので、そこから開くこともできます。

Download_GMLive_gml_by_YellowAfterlife_-_itch_io.png

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の公式ドキュメント には以下の手順でセットアップを行うように書かれています。

  1. GMLiveアセットをプロジェクトにインポートします。(itch.ioでは、.yympファイルをワークスペース領域にドラッグする必要があります)
  2. パッケージからアセット(Extension、Object、Included Files)をインポートします
  3. Macでは、Windows固有のexeおよびndllファイルのインポートを省略します。 プロジェクトの最初の部屋にobj_gmliveを配置します

ということで、まずは *.yymp ファイルをプロジェクトにドラッグ&ドロップします。
スクリーンショット_2020_05_16_9_10.png

するとインポート確認ダイアログが表示されるので、YESボタンを押してインポートします。
GMLiveTest_-_GameMaker_Studio_2_.png

次にインポートするファイル選択ダイアログが表示されるので、Add All ボタンをクリックして "Resources to Import" にインポート対象ファイルを移動させて、"import"ボタンをクリックします。
GMLiveTest_-_GameMaker_Studio_2_.png

すると、Objectに obj_gmlive、Included Filesの GMLiveフォルダ に GMLive 関連の実行ファイルとDLL、Extensionsに GMLive が追加されます。
GMLiveTest_-_GameMaker_Studio_2.png

(※なお、macOS環境では *.exe / *.ndll ファイルが不要となりますが、インポートしても問題なく動作します)

スタートアップ

プロジェクトの設定は公式ドキュメントには以下のように書かれています。

  1. Included Filesの gmlive-server.exe を右クリックし、[Open in Explorer]を選んでエクスプローラーを開きます(Macでは「Open in Finder」)
  2. Windowsでは、gmlive-server.exe をダブルクリックします。 Macでは、ディレクトリでターミナルを開き、neko gmlive-server.n を実行します。(詳細については、gmlive-server を参照してください) ゲームを再コンパイルするときは、実行したままにすることができます。新しいゲームインスタンスが接続するたびにプロジェクトディレクトリが再スキャンされます
  3. 目的のスクリプトとイベントにGMLive関数呼び出しを追加します。 イベントはGMLタイプのみ使用可能です(GMLブロックのDnDではありません)
  4. ゲームを実行します
  5. 「ライブ」スクリプト/イベントを変更して、ゲーム内の変化を確認します(すべてが正しく行われた場合)。 gmlive-serverのウィンドウがステータスの更新を報告します

ということでこの手順に従って実行していきます。

まずは GMLiveサーバーの実行から。
Included Filesの GMLive を右クリックしてコンテキストメニューを表示します。
GMLiveTest_-_GameMaker_Studio_2.png

macOS環境なので表示が異なっていますが、Windowsでも一番下の項目に「Open in Explorer」があるはず……

つぎに gmlive-server.exe をダブルクリックで実行。macOSの場合はターミナルから neko gmlive-server.n を実行します

neko.png

5100番ポートを使用してプロセス間通信するような感じです。
この画面を終了するとサーバーが停止してしまうので、起動したままにします。

次にテスト用のオブジェクトの作成。テスト用なので緑色の矩形を表示するだけのオブジェクトを obj_game として作りました。
GMLiveTest_-_GameMaker_Studio_2.png

次にイベントの作成。テスト用に Stepイベントを作成……
GMLiveTest_-_GameMaker_Studio_2.png

コードを以下のように記述します。

obj_gameのStepイベント
if(live_call()) return live_result;

x = 100;
y = 100;

このオブジェクト(obj_game)と obj_gmlive をルームに配置します。
GMLiveTest_-_GameMaker_Studio_2_.png

そして実行……。
reload.gif

……

……!?

スクリプトの修正がリアルタイムに反映……?

!!……!?

こ、これは……!?

surprise.png

これは人生変わる……!

あと未検証ですが、obj_gmlive は persistant なので、起動時のルームのみに配置すればよさそうな感じです。

ルームのリロードを行う方法

以下の動画で手順が紹介されています。

  1. 空のルームを作成 (rm_live) 。レイヤー情報はすべて削除
  2. 空のオブジェクトを作成 (obj_blank)
  3. ルームリロード用のスクリプトを作成 (scr_room_update)して以下のように記述する
scr_room_update
room_goto_live(argument0);

4. リロードしたいルームに各種オブジェクトと obj_gmlive を配置
5. obj_gmlive を開いて Createイベントに以下のコードを記述する

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); // リロードを行うルームを設定

これで実行すると、ルームでのオブジェクト配置を変更して保存すると、リアルタイムで位置が更新されます。
room_reload.gif

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5