ユーザ用ツール

サイト用ツール


vci:script:reference:eventfunction

VCIイベント関数


イベント関数とは、条件を満たした時に実行される関数です。
例えば「VCIに触った時に音を鳴らす」「VCIを掴んだ時にアニメーションをさせる」といったような挙動は、イベント関数を通じてそれぞれの処理が実行されます。
イベント関数はシステムによって関数名と関数の挙動が定義されています。


イベント関数一覧

イベント関数 説明
update() VCIを出したユーザーのクライアントのみで毎フレーム実行されます
updateAll() 所有権に関係なく全ユーザーで実行されるupdate()です
onUse(use) VCIを持っている状態でコントローラーをグリップした場合に実行されます。
onUnuse(use) VCIを持っている状態でコントローラーをグリップして離した場合に実行されます。
onTriggerEnter(item, hit) VCIと Colliderが接触した時に実行されます。
ColliderのIsTriggerにチェックされていれば有効)
onTriggerExit(item, hit) VCIと Colliderが接触した状態から離れた時に実行されます。
ColliderのIsTriggerにチェックされていれば有効)
onCollisionEnter(item, hit) VCIと Collider(+Rigidbody)が接触した時に実行されます。
onCollisionExit(item, hit) VCIと Collider(+Rigidbody)が接触した状態から離れた時に実行されます。
onGrab(target) VCIを掴んだ時(トリガーボタンを押す)に実行されます。
onUngrab(target) VCIを離した時(トリガーボタンを離す)に実行されます。

イベント関数の引数について

各イベント関数の引数には Subitemのgameobject名String型 で渡されます。
引数を使って SubItem = vci.assets.GetSubItem(target) 等を使う事により、掴んだり触ったりしたSubitemに対して、処理を行う事ができます。


Start関数が無い

Unity(C#)の「Start」や「Awake」に相当するイベント関数はVCIスクリプトには実装されていません。
しかし、関数の外に記述した部分はVCIを出した時の1度しか実行されないので、関数の外に処理を書くことで実質的にStart関数のように扱う事が可能です。

main.lua
-- ここがstart関数のように機能します
print("VCIを出した時のみ実行")
 
function myFunction()
     --VCI呼び出し時に実行されず、他の関数から呼び出す必要があります
     print("onUse()から実行される")
end
 
function onUse()
     print("Useボタンを押した時に自分で定義した myFunction() を呼び出す")
     myFunction()
end

update

VCIを出したユーザーのクライアントのみで毎フレーム実行されます。
他のクライアントでは実行されないので、結果を同期させる際には注意する必要があります。

ただし、updateによる処理であってもオブジェクトのトランスフォームなどはバーチャルキャストの機能によって同期します。
詳しくは VCIアイテムとSubItemについて を参照してください。

main.lua
function update()
end

updateAll

所有権に関係なく全ユーザーで毎フレーム実行されるupdate()です。
詳しくは VCIアイテムとSubItemについて を参照してください。

main.lua
function updateAll()
end

onUse

VCIを持っている状態でコントローラーをグリップした場合に実行されます。
下記サンプルはUseされたSubItemの名前がConsoleに表示されます。

※使用するには掴める事が前提のため、 Collider SubItem(VCISDK)Grabbableが設定されていないと動作しません。

main.lua
function onUse(use)
     print("onUse : "..use)
     print("SubItemの "..use.." がグリップ状態になりました。")
end

onUnuse

VCIを持っている状態でコントローラーをグリップして離した場合に実行されます。
下記サンプルはUseされたSubItemの名前がConsoleに表示されます。

※使用するには掴める事が前提のため、 Collider SubItem(VCISDK)Grabbableが設定されていないと動作しません。

main.lua
function onUnuse(use)
     print("Unuse : "..use)
     print("SubItemの "..use.." がグリップ状態から離れました。")
end

onTriggerEnter

VCIとColliderが接触した時に実行されます。
onTriggerEnterはVCIのSubItemにアタッチされた ColliderIs Triggerが有効だと実行されます。
SubItemに物理挙動を持たせたくないが、接触しているかどうかの判定は行いたい時に使います。

下記サンプルはSubItem同士が接触するとSubItemの名前のログが流れます。

main.lua
function onTriggerEnter(item, hit)
    print("Trigger Enter")
    print(string.format("%s <= %s", item, hit))
end

onTriggerExit

VCIとColliderが接触した状態から離れた時に実行されます。
onTriggerExitはVCIのSubItemにアタッチされた ColliderIs Triggerが有効だと実行されます。
SubItemに物理挙動を持たせたくないが、接触しているかどうかの判定は行いたい時に使います。

下記サンプルはSubItem同士が接触するとSubItemの名前のログが流れます。

main.lua
function onTriggerExit(item, hit)
    print("Trigger Exit")
    print(string.format("%s <= %s", item, hit))
end

onCollisionEnter

VCIとCollider(+Rigidbody)が接触した時に実行されます。
onCollisionEnterはVCIのSubItemにアタッチされた ColliderIs Triggerが無効だと実行されます。
SubItemに物理挙動を持たせた上で接触判定を行いたい時に使用します。

下記サンプルはSubItem同士が接触するとSubItemの名前のログが流れます。

main.lua
function onCollisionEnter(item, hit)
    print("Collision Enter")
    print(string.format("%s <= %s", item, hit))
end

onCollisionExit

VCIとCollider(+Rigidbody)が接触した状態から離れた時に実行されます。
onCollisionExitはVCIのSubItemにアタッチされた ColliderIs Triggerが無効だと実行されます。
SubItemに物理挙動を持たせた上で接触判定を行いたい時に使用します。

下記サンプルはSubItem同士が接触した状態から離れるとSubItemの名前のログが流れます。

main.lua
function onCollisionExit(item, hit)
    print("Collision Exit")
    print(string.format("%s <= %s", item, hit))
end

onGrab

onGrabはVCIを掴んだ時に実行されます。
onGrab(target)の引数にはSubItemの名前が格納されます。

下記サンプルは掴んだアイテムの現在地をConsoleに表示するサンプルです。

main.lua
function onGrab(target)
    print("onGrab : "..target)
    local item = vci.assets.GetSubItem(target)
    print(item.GetPosition())
end

onUngrab

onUngrabはVCIを掴んでる状態から離した時に実行されます。
onGrab(target)の引数にはSubItemの名前が格納されます。

下記サンプルはSubItemを離した時に、(0,0,0)の位置に移動させるサンプルです。
アイテムを移動させた場合はSetVelocity(Vector3.zero)でアイテムに加わってる力を0にすると挙動が安定します。

main.lua
function onUngrab(target)
    print("onUngrab : "..target)
    local item = vci.assets.GetSubItem(target)
    item.SetLocalPosition(Vector3.zero)
    item.SetVelocity(Vector3.zero)
end

onGrabとonUngrabの仕様について

  • onGrabとonUngrabはペアで処理されます。
  • onGrab()の条件:所有権がある状態でGrabした場合に実行されます。(※1)
  • onUngrab()の条件:Grab状態からUngrab状態になる or 所有権が無くなった場合に実行されます。(※2)

※1.所有権が無い状態でGrabしてもonGrab()は実行されません。Grabした状態で所有権を得たらonGrab()を通ります。
※2.Grab状態であっても、所有権が無くなった段階でonUngrab()が実行されます。

処理の例

2人で同じVCIを掴んだ場合

1.VCIを先に掴んでる人が居る。
 → 先:Grab + 所有権有り → onGrab()実行済み
2.後から別の人が同じVCIを掴む。
 → 先:Grab + 所有権無し → onUngrab()が実行される
 → 後:Grab + 所有権有り → onGrab()が実行される

vci/script/reference/eventfunction.txt · 最終更新: 2019/09/11 16:53 by navana

ページ用ツール