副題「constraintを使ったワールド固定 +SDK3.0でEXメニューでの物の出し入れ + VRC_StationでアバターにSit判定を入れる 応用」
この記事はVRChat Advent Calendar 2020(https://adventar.org/calendars/5102)の11日目の記事です.
【導入】
対象:
フルトラでいちゃいちゃしてる人たち見るけど、自分の相手がデスクトップモードだから諦めてるって人向けです.
以下の問題を解決することができます.
[メリット]
- VRと違って浮く事ができないデスクトップモードの人も膝にのせる事ができる
- 場所を選ばない(ワールドに横になる装置がなくても寝かせられる)
- 足にsit判定をつけた時と違って,自分が動いても相手の視界がブレない
逆にこんな弱点もあります
[デメリット]
え?それ以前に相手がいない?もしくは自分は膝枕されたい方だって?
愛っていうのは分け与える方から始まるものだよ!!!(訳:人を撫でるのだけでも楽しいぞ)
想定する力量:SDK3.0でアバターアップロードできる
[SUP]
記事の内容が難しいと思ったらより丁寧に解説してくれてる初心者向け改変サポートの本がフレンドのNazellさんから出てるからこっちをチェケラ!
勉強会Discordも存在するから,そっちで教えてもらうのもいいかも!?
https://nazell.booth.pm/items/2203578
では本題いくよー!
[TIPS]
ここに書いてある事をUnity上で全て詰め込んでからアップロードして動作確認するとどこがおかしいのか切り分けできなくなります.
いっこ変更したらアップロード→確認を繰り返して少しずつクリアしていきましょう.
【constraintを使ったワールド固定】
まずは自分の出した物体がワールドに固定できるようにしていきます!
左上のCreateからCreate Emptyを選択し,空のGameObjectを下記を参考に作ります.
(画像内の「Sit」だけ3DObject>Cubeで作成)
先ほど作った「World_C」オブジェクトのInspector上で[Add Componet]を押して,「Position Constraint」と「Rotation Constraint」を追加します.
それぞれのSourcesには「World_Point」をドラッグ&ドロップして設定しておきます.
「Pickup_C」オブジェクトには「Parent Constraint」をAdd Componentします.
Sourcesには「Pickup_Point」を設定します.
「Sit」キューブの位置を調整してから,「Pickup_Point」をArmatureの右Hand配下に入れます.
この後ワールド固定できるキューブを自由な場所で入れたり出したり,その場で固定したりできるようにしていきます.
[参考にした記事]
VRCでConstraintを使ったワールド固定&ピックアップ(Unity2018対応)|Beryllin|note
【SDK3.0でEXメニューでの物の出し入れ】
前の章で作成したキューブをEXメニューを用いて出し入れしたり,自由な場所で固定したりする仕組みを作っていきます.
予めキューブを手に持つアニメーションと,表示するアニメーションを作成しておきます.
ProjectのCreate>Animationから新しいAnimationファイルを作成し,「Pickup」と名付け,Pickup_C>Parent Constraint_Activeの項目をONにするアニメーションを作成します.
Keyを0:01にも追加し,LoopTimeにチェックを入れてください.
同じく新しいAnimationファイルを作成し,「Sit」と名付け,World_C>Game Object Is Activeの項目をONにするアニメーションを作成します.
先ほど作成したアニメーションをEXメニューで使う準備をします.
ProjectのVRCSDK>Examples3>Animation>Controllersから「vrc_AvaterV3HandsLayer」をコピーしてきます.
Animator画面から「Parameters」を選択し,[+]ボタンからInt項目を追加,それぞれ「ActiveSit」,「Pickupsit」と名付けます.
「Layers」を選択し,[+]ボタンから項目を追加,それぞれ「Sit」,「Pickup」と名付けます.
歯車アイコンからWeightを「1」に変更するのをお忘れなく.
また,それぞれONとOFF状態のStateを追加して(ブロックになっている部分)それぞれTransitionを繋ぎます(ブロックを繋ぐ矢印の部分).
ONのStateのMotionに先ほど作成した「Sit」アニメーションを設定します.
Transition部分のConditionsには,先ほどParametersで作成した項目が1の時と0の時の状態を設定します.
Pickupも同様に設定します.
ここからEXメニューに設定していきます.
ProjectのVRCSDK>Examples3>ExpressionsMenuから「DefaultExpressionParameters」と「DefaultExpressionMenu」をコピーしてきます.
それぞれパラメーターを追加します.
アバターを選択し,Expressionsに先ほど作成したファイルを指定します.
これでVRChatのEXメニューからキューブを出し入れしたり,位置の変更・固定ができるようになっているはず!
[参考にした記事]
[VRChat] Avatars3.0で物を出し入れする (EmoteSwitchみたいなもの) - がとーしょこらの技術録
【VRC_StationでアバターにSit判定を入れる】
では最後に出し入れできるようになったキューブにSit判定をつけていきましょう.
ProjectのVRCSDK>Examples3>Animation>Controllersから「vrc_AvaterV3SittingLayer」をコピーしてきます.
Stateに設定されているMotionを寝ているアニメーションに変更します.
今回はこちらのポーズ集を使用させてもらいました.
【約100種類 無料!】ポーズ詰め合わせ【Unity Animation】 - アンテナショップ【ねここや】 - BOOTH
最初に作成した「GameObject」に[Add Component]をクリックして「VRC Station」を追加します.
Animator Controllerに先ほどの「vrc_AvaterV3SittingLayer」を設定し,Player Enter Location,Player Exit Locationには「Location」を設定します.
これでキューブに寝そべるアニメーションのついたSit判定がつきました!
[参考にした記事]
fla (silent_bird) on Twitter: "アバター3.0にてVRC_Stationを使用しsit判定のある椅子を仕込む方法
VRC_Station - VRChat 技術メモ帳 - VRChat tech notes
【課題】
sitする位置によってビューポイントが変わったりしてるっぽい…?
あとconstraintのワールド固定は出した本人が動くとプルプルしちゃいますね…
改善できたら記事に追加しておきます。
【結び(その他宣伝)】
今回どのテーマで書くか悩みましたが,クリスマスに生かせるかなぁ?というものをチョイスしてみました.
他のテーマもどこかで発表していきたいですね…
VRChat Advent Calendar 2020次の日の記事はこちら!↓
blog.bootjp.me