アバター小技
アバターに実装可能なギミックの作例を紹介しています。
自分だけに見えるカメラモニター
こんなのです。
このモニターは常に視界の左側に表示していて、
自分にだけ見えて他の人からは透明で見えないようになっています。
これは自分にしか見えないカメラ(以下、ローカルカメラ)とStandard Shaderの透過機能を使っています。
カメラの実装の仕方はUnityの標準と同じ方法なので以下を参照してもらいたいのですが
簡単にいうと
1. Cameraコンポーネントを付けたオブジェクトを用意する
2. RenderTextureを作成する
3. CameraのTargetTextureに先ほど作成したRenderTextureを設定する
4. PlaneもしくはQuadを作成し、先ほどのRenderTextureを設定したマテリアルを適用する
こんな感じの手順でできます。
VRChatの仕様上、このカメラはこの状態だと自分にしか映像が写らない(他人から見ると黒い画面)モニターになります。
今回はこのローカルカメラを使用します。
手順
これは上記の4で設定したマテリアルの設定項目です。
既に自分だけに見えるモニターとして設定されています。
1. マテリアルのShaderを①の部分からStandard Shaderにします。
2. ②の部分でTextureがCameraに設定したRenderTextureになっていることを確認する。
3. ③の部分のRendering Modeを「Fade」に変更します。
(FadeはGBやBBなど透過にすべき箇所を自動的に透過してくれます。)
マテリアルの特殊な設定はこれだけです。
次にカメラの設定項目です。
4. Clear Flags④をSolid Colorに、BackgroundをBlackにします。
(これでFadeによって透過するようになります。)
5. Culling Mask⑤をMirrorReflectionにします。
(これで自分だけ写るカメラになります。)
6. Target Texture⑥が2に設定したRenderTextureになっていることを確認する。
あとはローカルカメラとモニターをいい感じのところに置きます。
私が設定したものはカメラを自分のアバターの顔を写すように
モニターを視界の左側にくるように設定しました。
インスペクターではBodyやArmatureの外に出すことで
アバターのローカル座標に追従するようにしています。
上記画像のインスペクター内では
ローカルカメラ→MiniDisplayCamera
モニター→MiniDisplay
に対応しています。
アップロード時、「Cameras are removed from non-local avatars at runtime.」という警告がでるが気にしなくてよい。
配布
- https://twitter.com/phio_alchemist/status/1042035964170731522
同じ仕組み - https://phio.booth.pm/items/1124131 300円
同じアバターでの歩行モーションの切り替え
- https://twitter.com/zi_zi_neet/status/1003014655269171200
- https://twitter.com/zi_zi_neet/status/1003449930243981313
- HeightScaleNOMOVEを変更することでIdleモーションも変更できましたが、
CROUCHIDLEの状態には切り替わらないみたいなのでIdleは2種類にしか変更できないです。あとたぶん別のIdleモーションとブレンドされていました(要検証)
擬似ピックアップ(ワールド固定)
アバター内のオブジェクトを特定のローカル空間やワールド空間に固定する仕組み。
- fixed jointを利用した実装例(Agoyoyuu氏(@agoyoyuu))
- Constraintsでの実装例
- fixed jointの代わりにparent constraintを使用する。
- 物理演算でないため動きが安定する(振動しない)
- 対象を動的に変更できるため、数が増えても構造が複雑になりにくい
- 実装例
- https://twitter.com/hiyen119/status/1246700340189134849
- https://twitter.com/higrashi/status/1246271919491444736
- https://note.com/helio_icnmy/n/ne9c256b76ea8
- https://twitter.com/Clytie_VRChat/status/1245789080790503424
- https://twitter.com/bery_llin/status/1245981115501834240
- https://twitter.com/m_ryo/status/1262503066391080960
- VRC_ObjectDropper
- https://logilabo.booth.pm/items/1968729
- 自動セットアップをするエディタ拡張
EmoteSwitch(エモートスイッチ)
執筆者 : @gatosyocora
Emoteでオブジェクトを出したり、消したりできる技術です。
あるオブジェクトを出すEmoteを実行すると、消すEmoteを実行するまで残り続けます。
(この技術は海外の方に教えていただいたものを自分なりに最適化したものです。)
LegacyAnimationが使えなくなったことにより、旧バージョンは使えなくなりました。
現在はAnimatorを使った新バージョンを使用してください。
新バージョン
- 自動生成するエディタ拡張つきのタイプ: https://github.com/Xiexe/VRCInventorySystem
- 一つのエモートやハンドサインでON/OFFを切り替えるタイプ :
https://twitter.com/Kamiokande_D/status/1048460658885292032
- EmoteSwitchV2 : https://twitter.com/gatosyocora/status/1046338878301396993
- 大量に使うと負荷がかかるみたいなので非推奨です
旧バージョン
同系統の技術(VRC_ToggleProp): https://www.youtube.com/watch?v=5m8RZQd4JAw
Prefabを用意しました。参考にしてください↓
レガシーアニメーションを使用した旧バージョン
仕様・挙動
- Emoteを実行した際に同じワールドにいるプレイヤー実行者を見てて近くにいるプレイヤーとは対象オブジェクトのアクティブ/非アクティブの状態はほぼ同期する。(ごくまれに同期しないことがあった?)
- あとから同じワールドに入った人にはデフォルト(まだEmoteSwitchを使っていない)の状態で見えている。
- いろんなことができるのですが、一般的には武器やコライダーボードのセーフティとして使うといいかもです。
腕の動きに同期して動くサブアーム
アバターの腕を動かすとそれに同期して動くサブアームです
※SDK3を利用することでConstraintsを使用しより安定した挙動が実現可能
心音
アバターに心音を設定する方法です
Particle Triggers
ParticleSystemを用いた衝突時に発生するトリガーです
使用例:
- VR"Chat" System https://twitter.com/kazenainannna/status/1011939488203825152
- 最終更新:2020-09-28 12:36:08