====== 所有権とイベント関数の関係 ====== 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の同期 ===== {{vci:script:reference:eventfunction:subitem_transform_sync.png?direct&400|}} transformは**SubItemの所有権を持つクライアントの結果が、他のクライアントに同期**されます。\\ つまり、Luaスクリプトや接触によりSubItemのtransformに変化を与えても、\\ SubItemの所有権を持つクライアントのtransformの状態に上書きされる為、結果としては変化しません。\\ 処理の詳細は [[vci:component:sdk:subitem:owned|VCIアイテムとSubItemについて]] を参考にしてください。 ===== SubItemの所有権の移動について(Grab) ===== 所有権は**「SubItemをgrabした時(つかんだ時)」**にgrabした人に移動します。\\ *  **〇 最後にGrabした人が所有権を持つ**\\ *  × Grabしている間、所有権を持ち続ける\\ そのため**SubItemをGrabした状態のまま(他の人がつかんだ事により)所有権を失う事**はあります。 ===== SubItemの所有権が移るフロー ===== {{vci:script:reference:eventfunction:subitem-grab.png?direct&600|}} ==== 所有権が移るパターン一覧 ==== ^ 所有権を**得る**タイミング ^ 所有権を得る人 ^ | 所有権を持った人が退出 | スタジオ内で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の構造によっては同時に複数の所有権を必要とするものもあるため、盛り込まれた仕様です。\\ 詳細につきましては [[vci:component:sdk:subitem:groupid|GroupIDについて]] を参考にしてください。 ===== OnTriggerEnterフロー ===== {{vci:script:reference:eventfunction:ontriggerenter.png?direct&400|}} ※1\\ _ALL_ を含む関数については [[https://developer.virtualcast.jp/vci-docs/manual/networking/all_func.html|ALL関数]] を参考にしてください。\\