PlayerScript

PlayerScriptはプレイヤー内で動作するスクリプトです。 分散実行されるItemScriptと異なり、特定のプレイヤーのデバイスで実行されることが保証されています。 そのため、デバイスのスクリーンに対するオーバーレイUI (PlayerLocalUI)、デバイスやコントローラーの生の入力値、アバターの移動制御などにリアルタイムでアクセスできます。

PlayerScriptの特徴的な使い方の一つは、毎フレームの細やかなアバターの動作制御です。

プレイヤーの落下を速くするPlayerScript

_.onFrame(dt => {
    if (_.getAvatarMovementFlags() & 0x0001 !== 0) {
        const pos = _.getPosition();
        pos.y -= dt;
        _.setPosition(pos);
    }
});

もうひとつはHUDの拡張をPlayerLocalUIで行うことです。 PlayerLocalObjectReferenceListなどを用いることで、そのデバイス上でのみ表示されるUIを作ることができます。

このように、PlayerScriptはデバイスやアバターと密接に紐付く制御を得意としているため、_.isVrなどデバイス種別判定の手段も用意されています。

PlayerScriptの設定と実行順序

ItemScriptからsetPlayerScript APIを呼び出すことで、アイテムに紐付いたPlayerScriptが対象のプレイヤーに紐付き、実行が開始されます。 ひとりのプレイヤーに同時に紐付くPlayerScriptは最大一つまでです。以前実行中のPlayerScriptがあった場合、実行が終了され、その後新しいPlayerScriptが実行開始されます。 このとき、メモリ上の変数などは引き継がれず、新しいスクリプトとして動作します。

PlayerScriptは以下のライフサイクルで実行されます。

  1. (PlayerScriptがプレイヤーに紐付けられて実行開始)
  2. PlayerScript全て
  3. (実行終了; プレイヤーが空間インスタンスから消滅、もしくは、別のPlayerScriptで上書きされる、もしくは、PlayerScriptを保持していたアイテムが消滅)

PlayerScriptはオーナーの仕組みとは独立して動作します。 1~3の途中で別のプレイヤーのデバイスに移動することはなく、メモリ上の変数が消滅することもありません。

なので、ItemScriptの$.stateに相当する物はPlayerScriptには存在せず、より通常のJavaScriptに近い形で記述できます。