VRChat UdonのEventsをいじって試行錯誤してみた備忘録~InteractやOnPickupなど~

VR
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^-^*)

この記事はVRChat Udonをいじってみたからそれについての記事です。

Event系の命令を試行錯誤していじってみました。

前回の記事はこちら。

VRコントローラーのトリガー押して発動するギミック作りたいだけなら↓の記事のやり方でだいたいできるかも。

●PRスペース●
■PR■

現在、TPSシステム系アセットが50%オフで買える Unityパブリッシャーセール をやってるみたいです(2025/09/12 23:59まで)。

Unity パブリッシャーセール 50%オフ

クーポンコード FANTACODESTUDIOS を使うと、↓のロープスイングシステムがタダで貰えます(決済時にクーポンコード入力適用で0円に)。

unity ロープスイングシステム

無料アセットだけでも貰っておくと良いかも。

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

参考にした先輩のページ

とても参考になりました。

ありがとうございます(*^-^*)

Events
An experimental compiler for compiling C# to Udon assembly - MerlinVR/UdonSharp

VRChat UdonのEventノードの公式ページはこちら。

Event Nodes | VRChat Creation
This is a list of Udon Nodes that are considered "Events".

OnplayerTriggerEnter 床に乗ると非表示にする

青い検知床にUdon Behaviorを追加して、VRCChair3をpublic valiablesとして読み込んでおく。

オブジェクトをUdon GraphにD&Dすると変数として読み込めます。

基本的に「床に乗る」とか「タッチする」とかのトリガーになるオブジェクトにUdon Behaviorを追加しておけばいいかな。

あとは変数としてオブジェクトを読み込んでおけば、トリガーオンオフで非表示したりできる。

SetActiveでオンオフしたら簡単にできた。

青い床に乗ると消える。

InputJump ジャンプボタンを押すと非表示にする

Jumpボタンはデフォルトだとスペースキーになってます。

これでスペースキーを押したら消えた!

…しかし一方通行なのでこれだと非表示から表示に切り替えることができない…。

Get activeselfを噛ませてBranchで分岐させたら、スペースキーを押している時だけ消えた

消すオブジェクトのアクティブ状態をGetactiveSelfで取得して、Branchで分岐させてみたらスペースを押している時だけ消えるようになった。

一応キー入力は検知しているわけだし、これはこれで使い道がありそうかな?

インスタンスを繋いでなかっただけだった(~_~;)これ忘れがちなので注意!

VRCChair32からSetActiveのinstanceに繋がないとダメ。↓は接続し忘れていた。

正しくはこう↓

InputUse Useボタンを押すと非表示にする

InputUseに変えただけです。

VRコントローラーの人差し指のトリガーの部分みたいです。

InputGrab Grabボタンを押すと非表示にする

これもEventsをInputGrabに変えただけ。

VRコントローラーの握る部分のボタンです。

InputDrop これは何かとセット?

これなんだろう。

一応組んでみたけどDropボタンってのが分からなかった。不明。

↓のOnPickUpとOnDropはセットで使えるっぽいから、何か他のやつとセットなのかもしれない。

OnPickUp 持ったら表示非表示

今度はキューブを追加して、Udon Behaviorを追加する。

VRCChair3-2を表示非表示する。

一回持ったら非表示、もう一回持ったら表示…のループ。

離したら非表示…とかにしたいけどできるのかな?

ん、これもしかしてOnDropってこれとセットなのかな?

OnDropと組み合わせたらいけた!これはセットで使うと良いっぽい

これで持ったら非表示、離したら表示、って感じにできた。

Interact オブジェクトに触れてトリガー引いたら表示非表示

これでいけた!

キューブをクリックすると表示非表示を切り替えられます。

これはドアの開閉とかのギミックによく使われてるやつかな?

とりあえずこれ覚えとくだけでも基本的なギミックは作れる気がする。

Interactでアニメーションを切り替える

前回の記事でもアニメーション切り替えは書いた。

アニメーションを二つ作って遷移で双方向に繋ぎ、bool変数を作って遷移条件を設定しておく。

これでタッチしたらアニメーション変更できた!

OnPlayerRespawn リスポーンしたら非表示にする

最初は表示されてるけど、穴に落ちてリスポーンしたら消えた!

OnPlayerParticleCollision パーティクルに触れたら非表示

パーティクルはアセットストアで無料配布されてるやつを使います。

Unity Particle Pack|unity asset store

しかしできなかった…。コリジョンの設定が必要な気がする。

こちらの先輩によると、パーティクルシステムにコリジョンの設定をすればいいらしい。

ありがとうございます(*^-^*)

パーティクルの接触判定を作成する
プレイヤーがパーティクルに接触するとプレイヤー名を表示するサンプルの解説 Udonスクリプト作成 サンプルのS…

日本語化してあるから一瞬戸惑ったけど多分これでいいっぽい。

これでいけた!

ノードはこんな感じ。

これまではchairにudon behaviorをつけてたけど、今回はparticleにudon behaviorをつけないと動作しなかった。

あと↓でやったらパーティクル自体が消えてしまった。

※setactiveにインスタンスが指定されてなかったからのようです(~_~;)指定しないとselfが指定されるので自壊する

正しくはこう。

これでパーティクルに当たった時にオフだったらオン、オンだったらオフにできた。

インスタンスを指定し忘れるのはついやっちゃうな(~_~;)

忘れないようにしないと。

OnPlayerCollisionEnter コライダーに触れたら非表示

新たにキューブを追加して、Udon Behaviorを追加する。

こんな感じにしてみたけど、OnPlayerCollisionEnterは静止してるオブジェクトだと動かないらしいです。

じゃあ思いっきり動かしてみるか…w

んーダメだな…なんでだろう。

Rigidbodyを追加するといいらしい

検索したらこちらの先輩が同じようなことをやっていて参考になった。

ありがとうございます(*^-^*)

壁や床の接触判定を作成する
プレイヤーが青い領域に侵入すると正面からCubeが飛んできて、プレイヤーに接触するとCubeが停止してコントロ…

とりあえずRigidbodyだけ追加してみたらいけた。

一瞬消えたのがお分かりいただけただろうか。

最初にぶつかった時も消えたけど、録画のFPSが低くて撮り逃したw

……でもアニメーションで動いてるオブジェクトに接触すればいいならOnPlayerTriggerでいいか…。

2023/12/15追記:SendCustomNetworkEventを使わないとローカル動作になるっぽいです

ローカルで動かすなら今回の命令だけでいいけど、そのインスタンスに入ってる他のプレイヤーにも動作を反映させたいならSendCustomNetworkEventを使わないといけないっぽいです。

例えばローカルだと、Interactでオブジェクトを動かしても他の人からは動いたことが見えないので、オブジェクトを投げ合ったりできません。

こちらに記事を書いたので参考にしてください。

あとUdon#についてもちょっといじったのでこちらも参考になるかもしれません。

おわりに

単純なギミックだけならこれだけで結構いけそう。

細かい条件はudon#とかいうやつで書いた方がいいのかな?そっちも見てみるか…。

まぁゲーム作りたいとかじゃなければ基本的な命令の組み合わせでもだいぶいけるかもしれない。

もう少しいじってみます(*^-^*)

タイトルとURLをコピーしました