マイクラ統合版Script APIでscripteventからフォームを表示する方法|main.jsの書き方と画面遷移の実装例

JavaScript

マインクラフト統合版のScript APIでは、scripteventコマンドをきっかけにしてプレイヤーへフォームを表示したり、ボタン選択後に別のフォームへ移動させたりする仕組みを作ることができます。

この記事では、main.jsへ記述する基本的な構文から、scripteventの受け取り方、フォーム表示、ボタンを押した後に次のフォームを表示する方法まで、実際に使える形で解説します。

マイクラ統合版Script APIでscripteventを利用する流れ

統合版のScript APIでは、ゲーム内コマンドのscripteventを利用すると、JavaScript側でイベントを受け取って処理を実行できます。

基本的な流れは「プレイヤーがscripteventコマンドを実行する」→「main.jsでイベントを取得する」→「フォームを表示する」という形になります。

例えば、以下のようなコマンドを実行します。

/scriptevent sample:menu

このイベントIDをmain.js側で監視し、対象のプレイヤーにフォームを表示します。

main.jsでscripteventを取得する基本構文

まずはScript APIでscripteventを受け取る処理を書きます。Minecraft統合版ではsystem.afterEvents.scriptEventReceiveを利用します。

基本的なコード例は以下のようになります。

import { system } from "@minecraft/server";
import { ActionFormData } from "@minecraft/server-ui";

system.afterEvents.scriptEventReceive.subscribe((event) => {
    if (event.id === "sample:menu") {
        const player = event.sourceEntity;
        if (player) {
            showMainForm(player);
        }
    }
});

event.idにはscripteventで指定したIDが入ります。そのため、コマンド側とJavaScript側で同じIDを指定する必要があります。

また、フォームを表示するには対象となるプレイヤーの情報が必要になるため、event.sourceEntityから実行者を取得します。

ActionFormDataで最初のフォームを表示する方法

プレイヤーへ選択肢を表示する場合は、@minecraft/server-uiのActionFormDataを利用します。

例えばメニュー画面を作成する場合は、以下のような関数を用意します。

function showMainForm(player) {
    const form = new ActionFormData()
        .title("メインメニュー")
        .body("操作を選択してください")
        .button("次のフォームを開く")
        .button("閉じる");

    form.show(player).then(response => {
        if (response.canceled) return;

        if (response.selection === 0) {
            showSecondForm(player);
        }
    });
}

button()で作成したボタンは上から順番に番号が割り当てられます。最初のボタンはselectionが0、2番目のボタンはselectionが1になります。

ボタンを押した後に別のフォームを表示する方法

フォームのボタン選択後に別画面を表示したい場合は、選択結果を確認して別のフォーム表示関数を呼び出します。

例えば、最初のフォームで「次へ」を押した場合に詳細メニューを表示する場合は以下のように書けます。

function showSecondForm(player) {
    const form = new ActionFormData()
        .title("詳細メニュー")
        .body("次の操作を選択してください")
        .button("設定")
        .button("戻る");

    form.show(player).then(response => {
        if (response.canceled) return;

        if (response.selection === 0) {
            player.sendMessage("設定を選択しました");
        }
    });
}

このようにフォームごとに関数を分けることで、メニューが増えても管理しやすい構造になります。

scripteventでフォームを呼び出す際の注意点

scripteventを利用してフォームを表示する場合、いくつか注意するポイントがあります。

  • ビヘイビアパックのscriptモジュール設定が正しいか確認する
  • @minecraft/server-uiを依存関係へ追加する
  • scripteventのIDをコマンドとJavaScriptで一致させる
  • フォーム表示対象がプレイヤーであることを確認する

特にevent.sourceEntityが存在しない場合、フォーム表示処理を実行するとエラーになる可能性があります。

また、フォームはプレイヤー操作が必要なため、サーバー全体イベントなどから直接表示する場合は対象プレイヤーを指定する処理が必要です。

実際に使えるメニュー型アドオンの構成例

scripteventとフォームを組み合わせると、ワールド内に管理メニューやショップ画面、テレポートメニューなどを作成できます。

例えば「/scriptevent shop:open」と入力するとショップ画面が開き、商品ボタンを押すと購入確認フォームへ移動する、といった仕組みも同じ考え方で実装できます。

大規模なアドオンを作る場合は、フォームごとにファイルや関数を分割するとコードの管理がしやすくなります。

まとめ

マイクラ統合版Script APIでは、scripteventを利用することでコマンドをきっかけにフォームを表示できます。

基本的にはscriptEventReceiveでイベントを取得し、ActionFormDataでフォームを作成、buttonの選択結果によって次のフォーム関数を呼び出す構成にすると分かりやすく管理できます。

最初は1つのフォームから作成し、動作確認しながらメニューを追加していくことで、複雑なアドオンでも扱いやすいScript API構成を作ることができます。

コメント

タイトルとURLをコピーしました