バーチャル3Dクリエイター神部まゆみです(*^-^*)
この記事はVRChat Udonをいじってみたからそれについての記事です。
Event系の命令を試行錯誤していじってみました。
前回の記事はこちら。
VRコントローラーのトリガー押して発動するギミック作りたいだけなら↓の記事のやり方でだいたいできるかも。
参考にした先輩のページ
とても参考になりました。
ありがとうございます(*^-^*)

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

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
しかしできなかった…。コリジョンの設定が必要な気がする。
こちらの先輩によると、パーティクルシステムにコリジョンの設定をすればいいらしい。
ありがとうございます(*^-^*)




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


これでいけた!


ノードはこんな感じ。


これまではchairにudon behaviorをつけてたけど、今回はparticleにudon behaviorをつけないと動作しなかった。
あと↓でやったらパーティクル自体が消えてしまった。


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


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


インスタンスを指定し忘れるのはついやっちゃうな(~_~;)
忘れないようにしないと。
OnPlayerCollisionEnter コライダーに触れたら非表示
新たにキューブを追加して、Udon Behaviorを追加する。


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


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


んーダメだな…なんでだろう。
Rigidbodyを追加するといいらしい
検索したらこちらの先輩が同じようなことをやっていて参考になった。
ありがとうございます(*^-^*)




とりあえずRigidbodyだけ追加してみたらいけた。
一瞬消えたのがお分かりいただけただろうか。


最初にぶつかった時も消えたけど、録画のFPSが低くて撮り逃したw
……でもアニメーションで動いてるオブジェクトに接触すればいいならOnPlayerTriggerでいいか…。
2023/12/15追記:SendCustomNetworkEventを使わないとローカル動作になるっぽいです
ローカルで動かすなら今回の命令だけでいいけど、そのインスタンスに入ってる他のプレイヤーにも動作を反映させたいならSendCustomNetworkEventを使わないといけないっぽいです。
例えばローカルだと、Interactでオブジェクトを動かしても他の人からは動いたことが見えないので、オブジェクトを投げ合ったりできません。
こちらに記事を書いたので参考にしてください。
あとUdon#についてもちょっといじったのでこちらも参考になるかもしれません。
おわりに
単純なギミックだけならこれだけで結構いけそう。
細かい条件はudon#とかいうやつで書いた方がいいのかな?そっちも見てみるか…。
まぁゲーム作りたいとかじゃなければ基本的な命令の組み合わせでもだいぶいけるかもしれない。
もう少しいじってみます(*^-^*)