【Minecraft BE Addon講座#14】ScriptingAPIとは？/サーバーとクライアントの違い

本ページは **アドオン講座#14、「スクリプト編、ScriptingAPIとは？/サーバーとクライアントの違い」** です。
目次や、この講座については[#1の記事](https://qiita.com/pencilya/items/7b7e68265151f42a51ac)をご覧ください。

# スクリプト編で理解してほしいこと！

:::note alert
2022年4月19日のアップデート、[Minecraft 1.18.30(Bedrock)](https://feedback.minecraft.net/hc/en-us/articles/5520890863245)（ベータ版では2022年1月27日の[Minecraft Beta 1.18.20.21](https://feedback.minecraft.net/hc/en-us/articles/4423151445901)）をもって **ScriptingAPIは削除されました。**
本Addon講座#14、#15で解説されているScriptingAPIは、これ以降のバージョンで使用できません。
スクリプトの実行は、代わりにGameTestFrameworkが担っていくようです。
:::

:::note warn
ScriptingAPIは執筆現在、Minecraft Bedrock Edition for Windows10(通称：win10版)でしか動作しません。（でした）
条件を満たさない場合、iOS版、Android版などでは実行できないのでご注意ください。
この制限について、またこの制限の対策について、詳しくは#14｢サーバーとクライアントの違い｣をご覧ください。
:::



スクリプト編はこのアドオン講座の他の応用編と異なり、`.json`ファイルではなく、Javascriptを使用することもあり、**レベルとしては応用編の中でも発展寄り**になります。
しかし、Javascriptに少しでも触れたことがある方にとってはスクリプト編の方が簡単に感じるかもしれません。

スクリプト編は2ページからなり、**前半#14はスクリプトの書き方(記法)と仕組みの理解**について扱い、**後半#15ではどのように使うのか実際にアドオンを作って**みます。

このスクリプト編では、Javascriptを使うことで、**`.json`などの限られた機能だけではできなかった検知や、それを利用したシステムの製作ができるようになる**ことを目的としています。

* (前提#3~#4)基礎編
* (前提#8)ファンクション編復習、コマンドの実行主の理解
* (#14)`ScriptingAPI`とは？
* (#14)サーバーとクライアントの違い
* (#15)[実践]キルカウントを作ってみよう

# `ScriptingAPI`とは？
アドオン講座も#14と、だいぶ大きな数字になってきましたが、ここまでで解説してきた内容や使用した機能は、ファンクション編を除き、全て既にマイクラ側に実装されているものを利用する形で成り立っているものでした。
`ScriptingAPI`は、Java版で根付いた「ユーザー製作のコンテンツでMinecraftを盛り上げる！」という文化をBEにも取り入れようと、試験的に追加されたModに近い要素です。
`.json`の書き換えレベルではなく、`MoLang`という限られた使用しかできない独自言語でもなく、`Javascript`という世界的によく使われているプログラミング言語を取り入れたこともあり、拡張性を高めようという気概が感じられます。

しかし、`ScriptingAPI`には、その拡張性のために二つの条件が付けられました。

* **「試験的」設定**を有効にしたワールドであること。
* **Windows10版**であること。

この二つの条件を満たさなければ、`ScriptingAPI`を実行することはできません[^1]。
**特にWin10版のみという制限は、クロスプラットフォームマルチプレイを売りにしている(と勝手に思っている)BEにとってはあまりに大きすぎる制限で、BEでAddonを作っているクリエイターにもあまり広まらず、という結果になってしまいました[^2]。**

[^1]: できることが増えた分、処理が重くなる可能性があるため、という理由らしいです。
[^2]: それだったらJavaでいいやん！ってなってしまうのです。Java版の拡張性には全く及ばないので…。

マイナス面ばかりの話になってしまいましたが、その代償の分、できることも多いです。
特に、次回紹介するキル検知は、基本スクリプトでしか行うことができません[^3]。
また、プレイヤーの場合、プレイヤーを指名してセレクタを使えるので、`@p`で起きやすい「判定が吸われて…」といったことが一切起きません。
詳しい機能については、[次回#15](https://qiita.com/pencilya/items/686682f51477b7a01775)で触れていきます。

[^3]: コンポネとアニコンを組み合わせればできないこともなかった気がしますが、現実的じゃないくらいに大変で、制限も多いです。

まだまだ説明が続きます。今日は座学の日です(笑)。

# サーバーとクライアントの違い
`ScriptingAPI`には、 **サーバー(server)**と**クライアント(client)** の二種類があります。
[ファイルフォルダ構成(#3)](https://qiita.com/pencilya/items/a2b6debdf3e0a860688c)でも紹介した通り、それぞれ`scripts/server`と`scripts/client`を使用します。

サーバー(server)は**ワールドを開いているプレイヤー(の端末)のみが実行**します。
ワールド全体のことを書く感じですね。

クライアント(client)は**ワールドに参加しているプレイヤー全員が実行**します。
それぞれが実行することを書く感じですね。

具体的には**Listenできるevent(=検知できる条件)が違います**。
これ以上はドキュメントを読んでもらった方が早いです。

https://bedrock.dev/docs/stable/Scripting

開発していく上での違いはこんな感じですが、**完成したアドオンを使っていく上ではこの違いはものすごく重要**になってきます。

**サーバーだけならwin10版じゃない人もワールドに入ることができる**のです！！

**サーバーはワールド主の端末のみがスクリプトを実行する**ので、**ワールド主がwin10版であれば**、アドオンの他の要素と同じように**クロスプラットフォームでマルチプレイをすることができます！！**

表にまとめるとこんな感じ。

| ＜サーバーのみ＞ | win10版 | win10以外のBE |
|:-:|:-:|:-:|
| **ワールド主(ホスト)**  | ○  | ×  |
| **参加者(ゲスト)**  | ○  | ○  |

| ＜クライアント使用＞ | win10版 | win10以外のBE |
|:-:|:-:|:-:|
| **ワールド主(ホスト)**  | ○  | ×  |
| **参加者(ゲスト)**  | ○  | ×  |

win10以外のBEには、iOS、Android、Switchなど、BEのほとんどが当てはまるので、クライアントを使用してしまうとそのアドオンを使えるユーザーはかなり限られてしまいます。

そのため、クライアントについてはほとんど解説しません[^4]。
構文はサーバーとほとんど変わらないので、異なる点のみ解説しようと思います。

[^4]: なぜなら私がほとんど使ったことがないから…

`ScriptingAPI`についての説明はこれで以上です！
[次回#15](https://qiita.com/pencilya/items/686682f51477b7a01775)では、`ScriptingAPI`のサーバーの方を使って、実際にキルカウントアドオンを作ってみます！