このページは過去の情報となります。
新しいスクリプトリファレンスはこちらになります。
イベント関数とは、条件を満たした時に実行される関数です。
例えば「VCIに触った時に音を鳴らす」「VCIをつかんだ時にアニメーションをさせる」といったような挙動は、イベント関数を通じてそれぞれの処理が実行されます。
イベント関数はシステムによって関数名と関数の挙動が定義されています。
下表において、VCI上のSubItemのことも便宜上VCIと表現しています。
イベント関数 | 説明 | 条件 |
---|---|---|
update | 毎フレーム実行 | VCIを出したユーザーのみ |
updateAll | 全ユーザーで毎フレーム実行 | |
onUse | VCIを使った時に実行 | 所有権を持っている |
onUnuse | VCIを使うのをやめた時に実行 | |
onTriggerEnter | VCIとColliderが接触した時に実行 | 所有権を持っている ColliderのIsTrigger:有効 |
onTriggerExit | VCIとColliderが離れた時に実行 | |
onCollisionEnter | VCIとColliderが接触した時に実行 | 所有権を持っている ColliderのIsTrigger:無効 |
onCollisionExit | VCIとColliderが離れた時に実行 | |
onGrab | VCIをつかんだ時に実行 | |
onUngrab | VCIを離した時に実行 |
各イベント関数の引数には Subitemのgameobject名 が String型 で渡されます。
引数を使って SubItem = vci.assets.GetTransform(target)
等を使う事により、つかんだり触ったりしたSubitemに対して、処理を行う事ができます。
Unityの Start
のような、アイテムロード時に最初に一度だけ実行されるイベント関数はありません。
しかし Lua はスクリプト言語ですので、 main.lua
のグローバルな場所に処理を記述すれば、そのタイミングで実行できます。
function func1() print("誰からも呼び出されていないのでこれは実行されない") end function func2() print("グローバルから呼び出されているので、アイテムをロードしたときに一度だけ実行される") end print("アイテムをロードしたときに一度だけ実行される") func2()
update()
VCIを出したユーザーのクライアントのみで毎フレーム実行されます。
他のクライアントでは実行されないので、結果を同期させる際には注意する必要があります。
ただし、updateによる処理であってもオブジェクトのトランスフォームなどはバーチャルキャストの機能によって同期します。
詳しくは VCIアイテムとSubItemについて を参照してください。
function update() end
updateAll()
所有権に関係なく全ユーザーで毎フレーム実行されるupdate()です。
詳しくは VCIアイテムとSubItemについて を参照してください。
function updateAll() end
onUse(use)
SubItemの所有権を持っている状態でSubItemを使った場合に実行されます。
※使用するにはつかめる事が前提のため、 Colliderと SubItemのGrabbableが設定されていないと動作しません。
UseされたSubItemの名前がConsoleに表示されます。
function onUse(use) print("onUse : "..use) print("SubItemの "..use.." が使っている状態になりました。") end
onUnuse(use)
VCIを持っている状態でVCIを使うのをやめた場合に実行されます。
※使用するにはつかめる事が前提のため、 Colliderと SubItemのGrabbableが設定されていないと動作しません。
UseされたSubItemの名前がConsoleに表示されます。
function onUnuse(use) print("Unuse : "..use) print("SubItemの "..use.." が使っている状態から離れました。") end
onTriggerEnter(item, hit)
VCIとColliderが接触した時に実行されます。
onTriggerEnterはVCIのSubItemにアタッチされた ColliderのIs Triggerが有効だと実行されます。
SubItemに物理挙動を持たせたくないが、接触しているかどうかの判定は行いたい時に使います。
キャラクターの各パーツにもColliderは存在するため、キャラクターの接触判定を行うことも出来ます。
SubItem同士が接触するとSubItemの名前のログが流れます。
function onTriggerEnter(item, hit) print("Trigger Enter") print(string.format("%s <= %s", item, hit)) end
onTriggerExit(item, hit)
VCIとColliderが接触した状態から離れた時に実行されます。
onTriggerExitはVCIのSubItemにアタッチされた ColliderのIs Triggerが有効だと実行されます。
SubItemに物理挙動を持たせたくないが、接触しているかどうかの判定は行いたい時に使います。
SubItem同士が接触した状態から離れるとSubItemの名前のログが流れます。
function onTriggerExit(item, hit) print("Trigger Exit") print(string.format("%s <= %s", item, hit)) end
onCollisionEnter(item, hit)
VCIとCollider(+Rigidbody)が接触した時に実行されます。
onCollisionEnterはVCIのSubItemにアタッチされた ColliderのIs Triggerが無効だと実行されます。
SubItemに物理挙動を持たせた上で接触判定を行いたい時に使用します。
SubItem同士が接触するとSubItemの名前のログが流れます。
function onCollisionEnter(item, hit) print("Collision Enter") print(string.format("%s <= %s", item, hit)) end
onCollisionExit(item, hit)
VCIとCollider(+Rigidbody)が接触した状態から離れた時に実行されます。
onCollisionExitはVCIのSubItemにアタッチされた ColliderのIs Triggerが無効だと実行されます。
SubItemに物理挙動を持たせた上で接触判定を行いたい時に使用します。
SubItem同士が接触した状態から離れるとSubItemの名前のログが流れます。
function onCollisionExit(item, hit) print("Collision Exit") print(string.format("%s <= %s", item, hit)) end
onGrab(target)
onGrabはVCIをつかんだ時に実行されます。
onGrab(target)の引数にはSubItemの名前が格納されます。
つかんだアイテムの現在地をConsoleに表示するサンプルです。
function onGrab(target) print("onGrab : "..target) local item = vci.assets.GetTransform(target) print(item.GetPosition()) end
onUngrab(target)
onUngrabはVCIをつかんでる状態から離した時に実行されます。
onGrab(target)の引数にはSubItemの名前が格納されます。
下記サンプルはSubItemを離した時に、(0,0,0)の位置に移動させるサンプルです。
アイテムを移動させた場合はSetVelocity(Vector3.zero)
でアイテムに加わってる力を0にすると挙動が安定します。
function onUngrab(target) print("onUngrab : "..target) local item = vci.assets.GetTransform(target) item.SetLocalPosition(Vector3.zero) item.SetVelocity(Vector3.zero) end
※1.所有権が無い状態でGrabしてもonGrab()は実行されません。Grabした状態で所有権を得たらonGrab()を通ります。
※2.Grab状態であっても、所有権が無くなった段階でonUngrab()が実行されます。
2人で同じVCIをつかんだ場合
1.VCIを先につかんでる人が居る。
→ 先:Grab + 所有権有り → onGrab()実行済み
2.後から別の人が同じVCIをつかむ。
→ 先:Grab + 所有権無し → onUngrab()が実行される
→ 後:Grab + 所有権有り → onGrab()が実行される