はじめに
マイクラ統合版にはAPIスクリプトと呼ばれる拡張機能が存在します。簡単に言えば、プログラミングを使ってゲームシステムをカスタマイズする機能のことですね。本サイトでは何度も取り上げています。APIScriptに関する詳細はこちらをご覧ください。
さて、APIScriptでスクリプトを書いていると、プレイヤーがワールドに入った最初の瞬間だけ何かをしたいと思うことがあります。本記事では、この問題に対する解決策を提示します。
本題
以下は、プレイヤーがワールドに入ったことを検知し、特定の関数を発火させる例です。
server.world.afterEvents.playerSpawn.subscribe(ev =>{
if (ev.initialSpawn){
server.system.runTimeout(function(){
//ここにスクリプトを記述
},40);
}
});
このスクリプトで重要な点は、意図的に遅延を起こしているところです。systemクラスのrunTimeout関数は関数(function)と整数値を引数として、マインクラフト上でその整数値のティック分、関数の実行を遅らせることができる関数です(注:1ティック=20分の1秒)。
また、ev.initialSpawnはプレイヤーのスポーンが初回であった場合にtrueを、そうでなければfalseを返します。即ち、ゲームオーバーになってリスポーンした場合、この関数は実行されないわけですね。
具体例
以下は、プレイヤーがワールドに入ったことを検知し、その場合にUIを表示する例です。
import * as server from "@minecraft/server";
server.world.afterEvents.playerSpawn.subscribe(ev =>{
if (ev.initialSpawn){
server.system.runTimeout(function(){
for (const player of server.world.getAllPlayers()){
show_form(player);
}
},40);
}
});
APIScript上でUIを表示する方法については、こちらの記事をご参照ください。本スクリプトでは、何らかの形でUIを表示するよう定義づけられた関数「show_form()」を前提とします。
この関数は、playerを引数としますが、関数の発火に至るまでのプロセスで、スポーンしたプレイヤーを取得していません。従って、for文とgetAllPlayers()関数ででplayerを取得しています。
おしまい
このようにして、APIScriptを用いてワールドに入ったことを検知して何らかの処理を行うことが可能になります。worldクラスの各種プロパティは大変便利ですので、是非ご活用ください。
こちらの記事もどうぞ: