所有権とイベント関数の関係

このページは過去の情報となります。
新しいスクリプトリファレンスはこちらになります。

VCIの所有権には VCI全体の所有権SubItemの所有権2種類が存在します。
このページでは下記について説明します。

VCIの所有権とイベント関数の関係

VCIの所有権はVCI全体の所有権と、VCI内のSubItemの所有権の2つがあります。
それぞれのイベント関数を処理する時に、判定に使われる所有権は異なります。

イベント VCI所有権:あり VCI所有権:なし
update 実行される 実行されない
updateAll 実行される

※1
SubItemの所有権の有無は処理に影響を与えませんが、
update関数でSubItemのtransformを動かす場合は、動かしたいSubItemの所有権が必要です。
(スクリプトで変更しても、SubItemの所有権を持ったクライアントからtransformが上書きされる為)

SubItemの所有権とイベント関数の関係

イベント 所有権:有 所有権:なし
onGrab つかんだ時に実行 つかんだ後、所有権を得た時に実行 ※1
onUngrab 離した時に実行 所有権を失った時に実行(つかんだ状態でも)
onUse Useボタンを押した時 実行されない
onUnuse Useボタンを離した時 所有権を失った時に実行 ※2
onTriggerEnter/Exit 実行される 実行されない ※3
onCollisionEnter/Exit 実行される 実行されない ※3

※1
ネットワークの遅延があります。
「一瞬だけつかむ」というセンシティブな操作の場合、うまく実行されない可能性があります。

※2
所有権を失った事によりonUnuseが実行されるので、スクリプトは所有権を失った状態で実行されます。
また、Useボタンを押し続けてる状態でも、SubItemの所有権を失った場合はonUnuseは実行されます。

※3
所有権のないSubItemは Kinematic = true になります。

SubItemの所有権とtransformの同期

transformはSubItemの所有権を持つクライアントの結果が、他のクライアントに同期されます。
つまり、Luaスクリプトや接触によりSubItemのtransformに変化を与えても、
SubItemの所有権を持つクライアントのtransformの状態に上書きされる為、結果としては変化しません。

処理の詳細は VCIアイテムとSubItemについて を参考にしてください。

SubItemの所有権の移動について(Grab)

所有権は「SubItemをgrabした時(つかんだ時)」にgrabした人に移動します。

そのためSubItemをGrabした状態のまま(他の人がつかんだ事により)所有権を失う事はあります。

SubItemの所有権が移るフロー

所有権が移るパターン一覧

所有権を得るタイミング 所有権を得る人
所有権を持った人が退出 スタジオ内で1番最初に入室している人がSubItemの所有権を得る
VCI出現時 VCIを出現させた人(Grabする前から)
無人の公開スタジオ入室時 入室した人が放置されたアイテムのSubItem所有権を得る
所有権を失うタイミング 所有権を失う人
スタジオ退出時(公開スタジオも同様) スタジオを退出した人
SubItemを所有権を持ってない人がSubItemをgrabした時 grabされたSubItemの所有権を持っていた人

※1
原理上誰も所有権を持ってないSubItemが存在するパターンはありません。
(無人の公開スタジオを除く)

※2
持ち主不在にする方法が存在していた場合、それはバグとなります。
そのように思われる挙動を発見した場合、状況・手順などを報告していただきますようお願いいたします。

SubItemのグループIDについて

SubItemにはグループIDというものがあり、Grabした時に同じグループIDのSubItem全ての所有者を得る事ができます。
ただし、グループIDが0(設定されてない)同士のSubItemの場合、別々のグループIDとして認識されます。
VCIの構造によっては同時に複数の所有権を必要とするものもあるため、盛り込まれた仕様です。
詳細につきましては GroupIDについて を参考にしてください。

OnTriggerEnterフロー

※1
_ALL_ を含む関数については ALL関数 を参考にしてください。