【統合版】ScriptAPI #6 ダイナミックプロパティ(データ保存)

スポンサーリンク

解説

今回はScriptAPIにおけるDynamicPropertyについて解説していきます。

DynamicPropertyとは

DynamicProperty(ダイプロ)はワールドエンティティに設定できる変数です。JS内で定義した変数と違い、ワールドを開き直したり、/reloadしたりしてもデータが保持されます。

ただし、アドオンのUUIDを変更した場合はデータが失われます。

DynamicPropertyの使い方

ダイプロはワールドエンティティで保存でき、データ型は文字列数値booleanVector3(座標)を使うことができます。

ワールドの場合

// <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"));

サンプルコード:プレイヤーごとのメモ機能

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-05-004445.png
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 開発初心者コミュニティ

参考にしたサイト
マイクラの泉

備忘録ブログ
さば2号のgametest(scriptAPI)備忘録

※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

  1. まじで、タイムリーな記事でした。神ですね。ありがとうございます。追記: メモのscriptのおかげでより深く理解できました!

  2. getDaynamicPropertyでvector3のプロパティを取り出したいのですがどうすればいいのですか?

    • そのまま取り出せるはずです。

      // ダイプロに設定
      world.setDynamicProperty(‘location’, { x: 0, y: 0, z: 0 });

      // ダイプロから取得
      const location = world.getDynamicProperty(‘location’);

      world.sendMessage(`${location.x} ${location.y} ${location.z}`);

      • ありがとうございます!
        できました

コメント通報