首掛けスマホを掴んで取り出し(PB)、戻す(contact)
自分用のアバター改変備忘録です。要所の解説等省いてます。
よろしく
PBとcontact両方使った理由
・誤作動を防ぐため取り出しはPB
・利便性向上のため戻すのはcontact
としています。
やりたいこと
これ↓
タイトル通り。ただし、スマホのオブジェクトを2つ用意して表示/非表示をしているだけ。
オブジェクト1つでやりたい方は以下も参考にしてください。
使用したアバター
うささきさん
■首掛けスマホの導入(掴める)
今回使用した首掛けアイテムはこちら
首掛け紐とスマホが分かれたオブジェクトになっていて
Dynamic bone設定済みなのでボーンも入っている(最高)
導入
・ヒエラルキーに持ってきて、アバター内に移動する所まではいつも通り
・うささきさんにデフォルトで入っているphone(うさphone)をコピーして
首掛けの位置に持ってくる(大きさも調整)
・元の子供スマホは要らないので非表示(削除でも可)
ブザーも非表示にした
・コピーしたうさphone(首掛けphone)をネックストラップボーンにあるphone直下に移動
・首掛けphoneを選択してコンポーネントを追加でParent Constraintを追加。※この設定要らないかも
ソースにphoneのボーンを設定
・armature直下にあるbase以下をそのままアバターのneck直下へ移動
各PBの導入、設定
・VRChat SDKを使ってネックストラップのDynamic boneをPBへ変換
VRChat SDK ⇒ Utilities ⇒ Convert DynamicBones To PhysBones
baseに設定されていたDynamicBonesがPBに変換されるので
パラメータを調整
・首掛けphoneにPBを設定
うささきさんのver1.3はavatar dynamicsのオブジェクトをまとめて管理できる様にすべてarmature外に出ているので追加分(変換を除く)は同じ所で作成します。
PB用に空のオブジェクトを作成(phone_PB)
・VRC Phys Boneのコンポーネントを追加
・Root Transfotmにphoneのボーンを設定
・Ignore Transformsのサイズを1
要素0にbuzzer_endを設定
・Optionsのパラメーターに掴んだとき使用するパラメーターとして
phone_ONを入力
・その他いい感じに設定(丸投げ)
colliderの設置、設定
ネックストラップが動いた時に身体を貫通しないようにコライダーを設定します。
・コライダー用に空のオブジェクトを作成
・VRC Phys Bone Colliderのコンポーネントを追加
・Root TransformにChestのボーンを選択
・身体の中にコライダーを設置
・Inside Bounds(コライダー外に出ない設定)のチェックをOFF
※配置と設定値は画像参照
PBにもcolliderの設定が必要
ネックストラップと首掛けphoneのPBにもColliderの設定をします。
・各PBのコンポーネントにコライダーの設定があるので、先ほど作成したcolliderのオブジェクトを設定
・Collisionの半径は0より大きく設定しないとPBの当たり判定がなくなるので注意(コライダーにも当たらない)
■取り出したスマホを戻す(Contact)
ネックストラップの先に手持ちスマホを当てた時、首掛けに戻るよう受信と送信のcontactを設定します。
・contact用に2つ空のオブジェクトを作成
1つはphone_OFF_receiver(受信用)
1つはphone_OFF_sender(送信用)
receiverの設定
・作成したphone_OFF_receiverを選択しVRC Contact Receiverのコンポーネントを追加
・Root Transformに首掛けPhoneのオブジェクトを設定
・Shapeの設定で当たり判定の大きさと場所を設定
・Filteringの設定
Allow Self:自分で反応させる
Allow Others:他人が反応させる
Local Only:ローカル環境でのみ反応する
・Collision Tagsをadd。今回はカスタムタグを作成、magu_phoneを入力
・Receiverのパラメーターをphone_OFFに設定(FXレイヤーで使用するパラメーター名)
判定の大きさ、位置、各パラメーターはこんな感じ
※判定の位置はボーンで掴む位置より少し上に調整。掴んだ瞬間contactが反応して戻る誤作動を回避。
senderの設定
・作成したphone_OFF_senderを選択しVRC Contact Receiverのコンポーネントを追加
・Root Transformに手持ちPhoneのオブジェクトを設定
・Shapeの設定で当たり判定の大きさと場所を設定
・Collision Tagsにreceiverと同じタグ(magu_phone)を設定
判定の大きさ、位置、各パラメーターはこんな感じ(見づらい)
■アニメーション作成
ON/OFFするアニメーションを作成
・スマホを取り出すアニメーションON
各説明は以下
app:今回は関係なし
phone_OFF_receiver:受信用のcontactオブジェクト
phone_OFF_sender:送信用のcontactオブジェクト
phone_PB:首掛けphoneのPBオブジェクト
phone(1):首掛けphone
phone:手持ちphone
・スマホを戻すアニメーションOFF
■各FXレイヤーの設定
いつものレイヤー追加
・FXLayerにてレイヤータブから新規作成(magu_phone)
歯車からウェイトを1に設定
・パラメータータブでBool型を2つ作成
1つはphone_ON_IsGrabbed
首掛けphoneのPBに設定したパラメーターに_IsGrabbedをつけたもの
PBを掴んだ時にこのパラメーターがtrueになる
1つはphone_OFF
contact receiverで設定したパラメーター
同じcollision tagsの送信と受信の当たり判定がぶつかった時にtrue
・ON/OFFのアニメーションを作ったレイヤー(magu_phone)にドラッグ&ドロップ
・右クリック⇒遷移にてOFF⇒ON、ON⇒OFFの矢印を引く
・ON/OFFの各インスペクターでWrite Defaultsのチェックを外す
・遷移した矢印を選択してパラメーターを設定
右手のレイヤー追加
今のままだとスマホを持っている間も左指がぐにょぐにょ動くので、固定します。
・さっき追加したFXLayerのファイルと同じディレクトリにGestureLayer_usasakiがあるので選択
・レイヤータブにて新規追加して設定
ウェイト:1
マスク:vrc_Hand Left
ブレンド:オーバーライド
・パラメーターにFXレイヤーに追加したのと同じものを作成(Bool型)
phone_OFF
phone_ON_IsGrabbed
・先ほどアニメーションをD&Dした場所で右クリック⇒ステートの作成⇒空でステートを2つ作成。
・お互いに遷移(矢印)を設定
インスペクターにて名前を付ける
1つはDefault
1つはPhone
・Defaultの設定
Motion:_Emptyを選択
Write Defaults:チェックなし
・ビヘイビアを追加からVRC Animator Tracking Controlを選択し設定
・Phoneの設定
Motion:C_hold_phoneを選択
Write Defaults:チェックなし
・ビヘイビアを追加からVRC Animator Tracking Controlを選択し設定
・各遷移(矢印)の設定
■アップロード
これにて完了です。お疲れさまでした。
あとは実際にVRCで試して各種調整してください