見出し画像

sdk3のudonでミラーをオンオフする(ついでに同期させる)

この記事はミラーをオンするの続きになります
https://note.com/kakutyu50/n/nc8bbe6cfc1c2

この記事で解説するのは上のサムネのudonです.
サムネみたらわかる人はそれ以上の収穫はないと思います

前回「useしたら」→「鏡をオンする」udonを解説しましたが
このままでは出した鏡は出しっぱなしです困りました.
鏡がオンの状態で「useしたら」→「鏡をオフ」してほしいです.
そこで今回は「useしたら」→「鏡のオンオフを確認」→
(オフなら)→「オンにする」 (オンなら)→「オフにする」udonを作っていきます.

ミラーのオンとオフをつくる

まず,「オンにする」と「オフにする」動作を作りましょう.
前回同様"SetActive"を使います.CreateNodeしたらUnityEngine→GameObject→SetActiveです.
そしたら変数を+→GameObjectで作りpublicにして鏡を設定して,変数のノードを出してSetActiveにつなぎます.
valueのチェックをつけた「オンにする」"SetActive"と
つけてない「オフにする」"SetActive"の2つを用意しましょう.
"SetActive"への変数の設定は1つのノードから複数矢印を引っ張ってもできますし,2つ変数のノードを出してそれぞれつないでも大丈夫です.

スクリーンショット 2020-12-12 170246


"Custom Event"で名前を付ける

つづいて,"Custom Event"ノードを使い「オンにする」「オフにする」動作に名前を付けます。
オンオフだけなら名前を付けなくてもよいのですが、名前を付けた動作は、その名前を使って繰り返し使えるようになり便利です。
また、名前を付けた動作は後述の方法で各プレイヤーで同期して実行することもできます。

CreateNodeからSpecial→Event Customの順に選択し"EventCustom"ノードを2つ用意します."Custom Event"は「その名前をよんだら」に当たるノードです.任意の名前を付けることができ,後述の「名前をよぶ」ノードで名前を呼ぶことで"Custom Event"から始まる処理を実行できるようになります.
用意した"Custom Event"からそれぞれの"SetActive"に矢印をつなぎ"Custom Event"ノードの空欄に名前をつけます.半角英数推奨で,_で始まる名前はだめです.大文字小文字を区別します.
「オンにする」ほうは EnableMirror 「オフにする」ほうをDisableMirrorにしました.

スクリーンショット 2020-12-12 172043

さて,「オンにする」と「オフにする」の準備はできました
これで、鏡がオンの時はDisableMirrorをオフの時はEnableMirrorを実行すれば鏡のオンオフが実現できますね。

条件分岐

鏡がオンかオフかによって処理が分かれるような,条件で処理が分かれるものはudonでは"branch"ノードを使って実装します.
CreateNodeしたらSpecial→Branchの順に選択します.
"Branch"はつないだ条件がTrue(オン)だと上のTrueのほうにつないだ矢印に進み,False(オフ)だと下のFalseのほうにつないだ矢印に進みます.

判定条件は黒丸につなぎます今回は鏡のオンオフを判定して欲しいので"Branch"の黒丸に「鏡の状態」をつないでオンのほうに「オフにする」処理をオフのほうに「オンにする」処理をつなげばいいわけです.
 
「オンにする」処理「オフにする」処理はさきほど名前を付けたので,それぞれ「名前を呼ぶ」ノードをつないで実行できます.「名前をよぶ」ノードは"SendCustomEvent"です.

CreateNodeしたらUdonBehaviour→UdonBehaviour.SendCustomEventの順に選択します.2つ出して"Branch"のTrueとFalseとそれぞれ矢印をつなぎ"SendCustomEvent"のeventName欄に先ほどつけた「オンにする」「オフにする」処理の名前をトグルから選択します
(画像が古いので手入力してますが、トグル選択式に変更になりました)

ついでに"Interact"ノードも出して"Branch"の前に矢印でつないでおきましょうCreateNodeしたらEvent→Interactでしたね.

スクリーンショット 2020-12-12 175548

これで use→条件分岐→オンorオフができました、つづいて黒丸につなぐ鏡状態を確認するノードをつなぎます。

ゲームオブジェクトがオンかオフかを確認する

「鏡の状態」を確認する部分を作りましょう
オブジェクトの状態がオンかオフかを確認するノードは”GameObject.Get activeSelf”です.CreateNodeしたらUnityEngine→GameObject→get activeSelfの順に選択します.
"Get activeSelf"も"SetActive"と同様に「どのオブジェクトの状態を確認するのか」を指定してあげる必要があるので,GameObject変数を作成して鏡を設定し"Get activeSelf"の青丸につないで指定します.
今回は"鏡を設定したGameObject変数"は既に作ってあるのでつなぐだけで大丈夫です。

そしたら"Get activeSelf"の黒丸と"Branch"の黒丸をつなぎます.
これで「鏡の状態」が"Branch"につながりました.

スクリーンショット 2020-12-12 180300

ここまでで鏡をオンオフするudonは完成です このままコンパイルしてアップロードすれば鏡がオンオフできるはずです.

useのメッセージを変える

スクリーンショット 2020-12-12 185612

useと表示されるメッセージをかがみ(ろーかる)にかえましょう ​
udonbehaviourのInteractionTextに表示したい名前を設定します。


スクリーンショット 2021-06-20 160253

オンオフの同期

ここまで解説してきたudonはすべてローカルで動作しています.
ここからはオンオフを同期する方法を書きます.
Udonで同期する方法の一つに"SendCustomNetworkEvent"ノードがあります.これは"SendCustomEvent"の同期版です.このノードをつかうと「名前を呼ぶ」処理を自分だけでなく全員で行うことができます.
先ほど作った鏡をオンオフするudonの"SendCustomEvent"を"SendCustomNetworkEvent"に差し替えます.ノードの削除は右クリックからdeleteでできます.CreateNodeからUdonBehavior→UdonBehaviour.SendCustomNetworkEventの順に選択します.先ほど同様BranchのTrueとFalseにそれぞれつなぎオンにする処理とオフにする処理の名前を入力します.
"SendCustomNetworkEvent"はtargetで名前を呼ぶ処理を同期する相手を選べます.全員で同期して処理してほしいのでAllにします.

スクリーンショット 2020-12-12 190946

これでだれかがキューブをuseすれば全員で鏡がオンオフされるようになりました.


スクリーンショット 2020-12-12 190826

質問・不具合・おすすめのアバター・おいしいごはん屋さん等なにかあればかくちゅ(kakutyun) twitter@kakutyu_vrc まで連絡ください

おやすみ

この記事が気に入ったらサポートをしてみませんか?