“右クリック可能なブロック”を実現する、「カスタムコンポーネント」とは何なのか? – ScriptAPIでさらに楽しむアドオン制作

はじめに

さて、前回オリジナルブロックの制作方法について解説しました。

これで多くの種類のブロックを制作可能になったと言っても過言ではありません。しかし、それでもなおできないことがあります。その一つが、「右クリック時の効果を追加する」ということ。

Character
要するに”静的な”ブロックは作れても”動的な”ブロックは作れない、という問題ですね

しかし、こうした問題は「カスタムコンポーネント」と呼ばれる機能を用いることで解決します。

カスタムコンポーネントとは?

カスタムコンポーネントとは、自分でブロックにオリジナルの要素(コンポーネント)を追加し、その機能についてScriptAPIというプログラミングシステムを用いてカスタマイズできる機能を指します。これを使えば、例えば「右クリックしたとき」をトリガーしたうえで、任意のコマンドを実行するとか、アイテムのテキスチャーを変えるといったことができるわけですね。

  • 後述しますが、「右クリック」以外もトリガーできます

おそらく百聞は一見に如かずだと思います。まずはこちらをご覧ください:

Character
右クリックすることでブロックのテクスチャーが変わっていることが分かると思います

なお、普通のアイテムのカスタムコンポーネントについてはこちらで詳しく解説しています:

  • 本記事ではブロックのカスタムコンポーネントについて解説します

スクリプト

ブロックのカスタムコンポーネントを扱う上で、そもそも普通のブロックを既に作成済みであることが前提となります。まだ普通のブロックを作成していない場合、まずはこちらの記事をご覧ください:

  • ご自身の作成したカスタムブロックをご用意ください

さて、まずはブロックにカスタムコンポーネントを定義しなければなりません。ビヘイビアパック内でブロックを定義しているjsonファイルを開き、components内に以下を追加しましょう:

Copied!
        "minecraft:custom_components" : [
            "test:custom"
        ],

「test:custom」がここでのカスタムコンポーネントの名前です。この通りの名前を付ける必要はなく、好きな名前を設定しても良いのですが、「(名前空間):(名前)」という形式である必要がある点には注意しましょう。

  • このカスタムコンポーネントの名前は後で使います

カスタムコンポーネントの挙動の定義

さて、カスタムコンポーネントそのものの設定が終わったら、次にこのコンポーネントを持つブロックがどのような性質を持つか?を定義する必要があります。これは、ブロックのjsonファイル内でできることではありません。

ここで必要になるのが、「ScriptAPI」です。これは、JavaScriptというプログラミング言語を用いてマインクラフトのゲームに干渉・カスタマイズすることができる機能であり、以下ではScriptAPIを用いて具体的にこのコンポーネントの挙動を定義していくことになります。

Character
やることは複雑ですが、できることは増えます

なお、ScriptAPIの使用にあたっては環境構築が必須です。まだ環境構築を終えていない場合には、先にこちらの記事をご覧になることをおススメします:

  • main.jsなどがあり、スクリプトを書ける環境であればOKです

さて、まずはmain.jsを開き、以下のようにスクリプトを書いてみましょう:

Copied!
server.world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.blockComponentRegistry.registerCustomComponent('test:custom', {
    onPlayerInteract(arg){
      const player = arg.player; // プレイヤーを取得
      const block = arg.block; // ブロックを取得
      player.sendMessage(player.name + "は" + block.typeId + "を触りました"); // 挙動を定義
    }
  });
});

なお、「test:custom」の部分は、先ほど定義したカスタムコンポーネントの名前です。ご自身の環境に合わせて変更してください。

さて、このスクリプトはこのコンポーネントを右クリックしたときの挙動を定義しています。実際にこのスクリプトを書いて保存し、ゲーム内の挙動を確認してみましょう。おそらくこのコンポーネントの付いたブロックを右クリックしたとき、次のように表示されるはずです:

このようなメッセージが出れば成功です。変数playerとblockはそれぞれスクリプトのように定義されるので、これらを用いてご自身で色々試してみると良いと思います。

Character
それぞれの名前を得たい場合、player.id、block.typeIdでOKです

応用

今回は、onPlayerInteractを用いたので「右クリックしたとき」をトリガーできましたが、この部分を変えることで「何をトリガーして実行するか」を定義することができます。主なものを列挙すると次のようになるでしょうか:

インターフェース条件
onPlayerBreak破壊したとき
onPlace設置したとき
onTick毎ティック実行

他にも色々あります。詳細は公式ドキュメントが詳しいので、そちらも参照してください。

試しにブロックを起点として毎ティックコマンドを実行する例を置いておきます:

Copied!
server.world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.blockComponentRegistry.registerCustomComponent('test:custom', {
    onTick(arg){
      const block = arg.block;
      block.dimension.runCommand("say hello");
    }
  });
});
Character
arg.dimension.runCommand(“~~”) も使えます

おしまい

ということで、本記事ではブロックのカスタムコンポーネントについて解説しました。これによって「右クリックしたとき」、「破壊したとき」といった様々な事象をトリガーして、それに応じて様々な関数を実行することが可能になります。これによってマインクラフトがさらに楽しくなるので、是非お試しください。

冒頭にあったような、「右クリックしてブロックのテクスチャーを切り替える」こともこれを応用すれば可能になります。詳細は次回の記事で解説予定ですので、少々お待ちください。

最新情報をチェックしよう!