Language:

サイドバー

バーチャルキャスト公式Wiki

メニュー

デバイス

アプリケーション

アセット

配信

その他

リリース情報

デベロッパー向け


開発環境

GLB

vci:script:reference:eventfunction

VCIイベント関数

イベント関数とは、条件を満たした時に実行される関数です。

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

イベント関数はシステムによって関数名と関数の挙動が定義されています。


イベント関数一覧

下表において、VCI上のSubItemのことも便宜上VCIと表現しています。

イベント関数 説明 条件
update 毎フレーム実行 VCIを出したユーザーのみ
updateAll 全ユーザーで毎フレーム実行
onUse VCIを使った時に実行 所有権を持っている
onUnuse VCIを使うのをやめた時に実行
onTriggerEnter VCIとCollider接触した時に実行 ColliderIsTrigger:有効
onTriggerExit VCIとCollider離れた時に実行
onCollisionEnter VCIとCollider接触した時に実行 ColliderIsTrigger:無効
onCollisionExit VCIとCollider離れた時に実行
onGrab VCIをつかんだ時に実行
onUngrab VCIを離した時に実行

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

各イベント関数の引数には Subitemのgameobject名String型 で渡されます。
引数を使って SubItem = vci.assets.GetTransform(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

update()

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

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

サンプル

main.lua
function update()
end

updateAll

updateAll()

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

サンプル

main.lua
function updateAll()
end

onUse

onUse(use)

SubItemの所有権を持っている状態でSubItemを使った場合に実行されます。

※使用するにはつかめる事が前提のため、 Collider SubItemGrabbableが設定されていないと動作しません。

サンプル

UseされたSubItemの名前がConsoleに表示されます。

main.lua
function onUse(use)
     print("onUse : "..use)
     print("SubItemの "..use.." が使っている状態になりました。")
end

onUnuse

onUnuse(use)

VCIを持っている状態でVCIを使うのをやめた場合に実行されます。

※使用するにはつかめる事が前提のため、 Collider SubItemGrabbableが設定されていないと動作しません。

サンプル

UseされたSubItemの名前がConsoleに表示されます。

main.lua
function onUnuse(use)
     print("Unuse : "..use)
     print("SubItemの "..use.." が使っている状態から離れました。")
end

onTriggerEnter

onTriggerEnter(item, hit)

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

キャラクターの各パーツにもColliderは存在するため、キャラクターの接触判定を行うことも出来ます。

サンプル

SubItem同士が接触するとSubItemの名前のログが流れます。

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

onTriggerExit

onTriggerExit(item, hit)

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

onCollisionEnter(item, hit)

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

onCollisionExit(item, hit)

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(target)

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

サンプル

つかんだアイテムの現在地をConsoleに表示するサンプルです。

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

onUngrab

onUngrab(target)
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.GetTransform(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 · 最終更新: 2022/10/25 18:45 by pastatto

ページ用ツール