注目キーワード

【マイクラ統合版】自作アイテムに特殊効果を付与できる、カスタムコンポーネントとは? – ScriptAPIとCustomComponentの概要

はじめに

先日、以下の記事を投稿しました:

上記で説明してように、マインクラフトではオリジナルアイテムを制作できることが広く知られています。実際に自分好みのアイテムや武器などを作って遊んでいらっしゃる方も少なくないでしょう。

ただ、アイテムというのはただ存在すればいいというものではありません。ただテクスチャーを貼っただけのアイテムは、プレイヤーにとって何ら新鮮味がないですよね。できることなら、そのアイテムに特殊効果を持たせて、唯一無二のアイデンティティを確立させたいものです。例えば・・・

Character
攻撃したときに毒を付与したい!
Character
食べると暗視の効果がつく食べ物を作りたい!

という具合。

それができて初めて、作ったアドオンに個性が生まれるのです。「焔の剣」という名前なのに何の効果もない剣とか、何も面白みがないですよね?

ということで、本記事では、オリジナルアイテムに特殊効果を付与する方法についてお話していきます。上記の記事が前提となる旨、予めご了承ください。

前提

とはいえ、以前(ver1.21.20より前)はアイテムに特殊効果を付与することなど何ら難しいことではありませんでした。言わずもがな、アイテムの定義ファイル内でeventsを定義するだけでよかったからです。しかし、「ホリデークリエイターの特徴」の削除はアドオン環境を大きく一変させました。詳細はこちらの記事で説明しています:

このアップデートを機に、アイテムへの特殊効果の付与にはScriptAPIの一要素である、CustomComponent(カスタムコンポーネント)の使用が必須となってしまいました。これによって大きく制作難易度が上昇したのは言うまでもありません。

本記事では、このアップデートに対応し、カスタムコンポーネントを使用した方法について説明していきます。

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

カスタムコンポーネント(CustomComponent)とは、端的に言えば自分で定義するアイテム・ブロックのコンポーネント(構成要素)のことです。アイテムの定義時に、jsonファイル内で”minecraft:food”や”minecraft:max_stack_size”のように様々なコンポーネントを使用しますよね? 

このコンポーネントを自作し、その効果についてScriptAPIを用いて決定する一連の過程・システムのことをカスタムコンポーネントと呼称します。

Character
要は自分でアイテム・ブロックの性能をカスタマイズできる機能のことです

本題

まず、アドオンの構成は以下。ScriptAPIを用いるため、scriptsフォルダとmain.jsが必須となります。

アドオン・アイテムの定義

アドオンそのものの作成方法や、「何もしないアイテム」の定義方法については、本題ではないのでここでは割愛します。それらの詳細については、こちらの記事で詳しく解説しております。

Character
「何もしないアイテム」が前提となります

また、ScriptAPIを使う都合上、ビヘイビアパックのmanifest.json内で、moduleとしてscripts/main.jsの定義が必須です。古い記事を参考にしてアイテムを定義している場合、manifest.json内で同記述が存在しない可能性があるので注意しましょう。manifest.jsonの内容自体は上の記事でコピペできます。

Character
{
“type”: “script”,
“language”: “javascript”,
“uuid”: “f1942413-eee9-4f18-a275-a408b915ddab”,
“entry”: “scripts/main.js”,
“version”: [0, 1, 0]
},
みたいな記述があればOKです

カスタムコンポーネントの付与

まず、アイテムにカスタムコンポーネントを付与する必要があります。具体的には、ビヘイビアパックのアイテムを定義するjsonファイル内で、”components”内に

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

といったコンポーネントを追加しなければなりません。このうち、”custom:test”はカスタムコンポーネントのidであり、これは(名前空間):(id名)の形式であればどんな名前でも問題ありません。ご自身で分かりやすい名前をつけてください。

Character
このidは後で使います

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

アイテムにカスタムコンポーネントの付与が出来たら、次にそのカスタムコンポーネントの機能を定義する必要があります。ここで、ScriptAPIが活躍します。

ビヘイビアパックのフォルダを開き、scriptsというフォルダを作成します。その中にmain.js というファイルを作成し、適当なテキストエディタ(VSCodeがおススメ)でこれを開きましょう。

ここでは、Javascriptというプログラミング言語を用いてゲームシステムを制御していくことになります。ScriptAPIの概要やその使い方については以下の記事で詳細に説明しています:

さて、このjsファイル内に以下をコピー&ペーストしてみましょう:

import * as server from "@minecraft/server";

server.world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.itemComponentRegistry.registerCustomComponent('custom:test', {
    onConsume(arg){
      const player = arg.source;
      player.runCommand("effect @s strength 5 1 true");
    }
  });
});
Copied!

このスクリプトは、先ほど付与した「custom:test」というカスタムコンポーネントの性能を定義するもので、「このコンポーネントのついた食べ物を食べると、strengthのエフェクトがつく」ことを意味しています。おそらくこれが最小構成だと思います。

これについて、3つほど補足します。

コンポーネントid

まず、スクリプト中にある「custom:test」ですが、これは先ほど設定したカスタムコンポーネントのidである必要があります。オリジナルのidを設定した場合は、それと同じものをここに入れましょう。

コマンド実行

続いて、スクリプト中の「runCommand」はコマンドを実行する関数です。今回は「effect @s strength 5 1 true」というコマンドを実行することによってプレイヤーにstrengthのエフェクトを付与することにしています。ここをアレンジすることによって、好きなエフェクト・イベントを実行・付与することが可能になります。

onConsume

今回は、「アイテムを食べたとき」をトリガーするためにonConsumeを用いていますが、ここをonUseに変更することによって、「アイテムを使った時」をトリガーすることもできます。好みに合わせて変更してみてください。なお、右クリックの検知そのものは下の記事で解説しています。

同様に、このスクリプトを少し変えてonHitEntityを用いることで、「特殊効果付きの武器」も作ることができます:

server.world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.itemComponentRegistry.registerCustomComponent('custom:test', {
    onHitEntity(arg){
      const player = arg.attackingEntity;
      const entity = arg.hitEntity;
      player.runCommand("effect @s strength 5 1 true"); // 攻撃したプレイヤーにstrengthを付与
      entity.runCommand("effect @s poison 5 1 true"); // 攻撃されたエンティティにpoisonを付与
    }
  });
});
Copied!

その他、詳細な事項についてはマイクロソフトの公式ドキュメントが詳しいです。

このようにして、コンポーネントそのものを自作し、アイテムに個性を持たせられるわけですね。

おしまい

本記事では、従来のeventsの代替となる、カスタムコンポーネント(CustomComponent)を用いて自作アイテムに特殊効果を持たせる方法について解説しました。(events時代と比して)やることが少々複雑になったとはいえ、ScriptAPIというプログラミングを用いたアプローチに変更になったという点で、柔軟性や拡張性が向上したのは事実です。

Character
だいぶ遊びの幅が広がりました

次回は、ブロックのカスタムコンポーネントについても触れていきたいと思います。自作ブロックの作り方はこちら:

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