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は以下のライフサイクルで実行されます。
- (PlayerScriptがプレイヤーに紐付けられて実行開始)
- PlayerScript全て
- (実行終了; プレイヤーが空間インスタンスから消滅、もしくは、別のPlayerScriptで上書きされる、もしくは、PlayerScriptを保持していたアイテムが消滅)
PlayerScriptはオーナーの仕組みとは独立して動作します。 1~3の途中で別のプレイヤーのデバイスに移動することはなく、メモリ上の変数が消滅することもありません。
なので、ItemScriptの$.stateに相当する物はPlayerScriptには存在せず、より通常のJavaScriptに近い形で記述できます。