解説
今回はScriptAPIにおけるDynamicPropertyについて解説していきます。
DynamicPropertyとは
DynamicProperty(ダイプロ)はワールド、エンティティに設定できる変数です。JS内で定義した変数と違い、ワールドを開き直したり、/reloadしたりしてもデータが保持されます。
ただし、アドオンのUUIDを変更した場合はデータが失われます。
DynamicPropertyの使い方
ダイプロはワールドとエンティティで保存でき、データ型は文字列、数値、boolean、Vector3(座標)を使うことができます。
ワールドの場合
// <World>.setDynamicProperty("識別子", 値) - ワールドにダイナミックプロパティを設定する
// <World>.getDynamicProperty("識別子") - ワールドのダイナミックプロパティを取得する
// 設定
world.setDynamicProperty("test", "Hello World");
world.setDynamicProperty("number", 100);
world.setDynamicProperty("boolean", true);
world.setDynamicProperty("vector3", {x:0,y:0,z:0});
// 取得
const test1 = world.getDynamicProperty("test"); // "Hello World"
// 削除
world.setDynamicProperty("test"); // undefined となる
エンティティの場合
// <Entity>.setDynamicProperty("識別子", 値) - エンティティにダイナミックプロパティを設定する
// <Entity>.getDynamicProperty("識別子") - エンティティのダイナミックプロパティを取得する
const player0 = world.getPlayers()[0];
const player1 = world.getPlayers()[1];
// 設定
player0.setDynamicProperty("test", "プレイヤー0です");
player1.setDynamicProperty("test", "プレイヤー1です");
// 取得
const player0Test = player0.getDynamicProperty("test"); // "プレイヤー0です"
const player1Test = player1.getDYnamicProperty("test"); // "プレイヤー1です"
// 削除
player.setDynamicProperty("test"); // undefined となる
また複雑なデータは、配列やオブジェクトを文字列に変換して保存する方法もあります。
変換には、JSON.stringify()とJSON.parse()を使います。
// 配列 → 文字列 に変換して保存
let myArray = ["Steve","alex","saba2gou"];
world.setDynamicProperty("myArray",JSON.stringify(myArray));
// 文字列 → 配列 に変換して取得
myArray = JSON.parse(world.getDynamicProperty("myArray"));
サンプルコード:プレイヤーごとのメモ機能
import { world } from"@minecraft/server";
world.beforeEvents.chatSend.subscribe(ev => {
const player = ev.sender;
// メッセージを空白で区切りで配列にする
const msgs = ev.message.split(" ");
if (msgs[0] === "!memo") {
// チャットの送信をキャンセル
ev.cancel = true;
switch(msgs[1]) {
// メモの保存
case "set":
if (msgs[2]) {
player.setDynamicProperty("memo", msgs[2]);
player.sendMessage(`メモを保存しました : ${msgs[2]}`);
} else {
player.sendMessage("テキストがありません");
}
break;
// メモの表示
case "show":
const memo = player.getDynamicProperty("memo");
if (memo === undefined) {
player.sendMessage("メモが保存されていません");
} else {
player.sendMessage(`${player.name} のメモ : ${memo}`);
}
break;
// それ以外の場合
default:
player.sendMessage("そのコマンドはありません");
}
}
});
参考URL
公式リファレンス
minecraft/server Module | Microsoft Learn
ディスコードサーバー
Script API 開発初心者コミュニティ
参考にしたサイト
マイクラの泉
コメント
まじで、タイムリーな記事でした。神ですね。ありがとうございます。追記: メモのscriptのおかげでより深く理解できました!
getDaynamicPropertyでvector3のプロパティを取り出したいのですがどうすればいいのですか?
そのまま取り出せるはずです。
// ダイプロに設定
world.setDynamicProperty(‘location’, { x: 0, y: 0, z: 0 });
// ダイプロから取得
const location = world.getDynamicProperty(‘location’);
world.sendMessage(`${location.x} ${location.y} ${location.z}`);
ありがとうございます!
できました