ItemScript

ItemScriptはアイテム内で動作するスクリプトです。 ItemScriptの最も基本的な使い方は、$.onXXXXでプレイヤーの行動や周囲の環境の変化を取得し、 それに対するアイテム自身の振る舞いを記述することです。

インタラクトすると音がなるItemScript

const sfx = $.audio("sfx1");

$.onInteract(() => {
  sfx.play();
});

また、$.onUpdate は特に変化が発生しなくても高頻度(通常は20FPS以上)で呼び出されます。

一定速度で移動するItemScript

$.onStart(() => {
  $.state.pos = $.getPosition();
});

$.onUpdate(dt => {
  const newPos = $.state.pos;
  newPos.x += dt;

  $.setPosition(newPos);
  $.state.pos = newPos;
});

これらの$.onXXXXに渡されている関数をコールバックと呼びます。

$.onXXXXは大まかに三種類に分けることができます。

  • プレイヤーのアクションや、外部の変化を取得するもの: onUse, onInteract, onCollide, onReceive など
  • 決まったタイミングで呼び出されるもの: onStart, onUpdate など
  • 時間のかかる処理の完了時に呼び出されるもの: onExternalCallEnd, onTextInput など

このように、アイテム単体でも自律的に振る舞う物体やNPCを記述することができます。

$.state

技術的理由により、ItemScriptはメモリー内の変数などの値を永続的に保持することができません。 ひとつのコールバックの実行中はメモリーが保持されることが保証されていますが、複数のコールバック呼び出しの間ではメモリーは消去されうると想定する必要があります。 このようなケースでは$.stateを使うことで状態を保持できます。

動かない例

let x = 0;
$.onUpdate(dt => {
    x += dt;
    $.setPosition(new Vector3(x, 0, 0));
});

動く例

$.onStart(() => {
    $.state.x = 0;
});

$.onUpdate(dt => {
    $.state.x = $.state.x + dt;
    $.setPosition(new Vector3($.state.x, 0, 0));
});

ItemScriptの設定と実行順序

ItemScriptはワールド設置アイテムかアイテムテンプレートに対して設定されます。 (つまり、同じアイテムテンプレートから生成されたアイテムで異なるItemScriptを実行することはできません。)

アイテムが空間インスタンス内に生成されたとき (ワールド設置アイテムの場合は空間インスタンスが生成された直後)から、 アイテムごとにItemScriptが独立して開始します。以下の順序で処理が実行されます。

  1. (アイテムの生成)
  2. onStart
  3. それ以外のコールバック (onUse, onUpdateなど)
  4. (アイテムの消滅)

ItemScriptの内部動作

ItemScriptもアイテムそのものと同様にオーナーで実行されます。 投機的実行を行うため、スクリプトそのものはアイテムが生成された後、全てのデバイスで読み込まれ評価されます。 コールバックが実行されるのはオーナーと、オーナーになる予定のデバイスのみです。