Better AvatarPedestal - mimyquality/FukuroUdon GitHub Wiki

概要

通常アバターペデスタルはアバターサムネイルの板ポリが追加表示されます。
この Prefab を使うと、アバターサムネイルを表示させることなくアバターチェンジさせるスイッチが作れます。
あとはそのアバターの3Dモデルを追加してやれば、3Dモデルの見た目をしたアバターペデスタルが作れる、という寸法です。

[!WARNING] 他作アバターモデルを使用する場合は、ペデスタル化を含め、アバターの利用規約で許可された使い方か注意してください。

導入手順

導入手順

使い方

  1. Packages > Fukuro Udon > Samples > BetterAvatarPedestal フォルダーから BetterAvatarPedestal_sample プレハブを Hierarchy にD&Dします。

    image

  2. Hierarchy に置いたプレハブの中にある AvatarPedestal(scale0) オブジェクトの VRC Avatar PedestalBlueprint Id に、着替えさせたいアバターの Blueprint ID を記入してください。自身がアップロードしたアバターの Blueprint ID は、VRCSDK コントロールパネルの Content Manager タブからコピーできます。アバターの公開設定が public である必要があります。
    このオブジェクトは非アクティブのままにしておいてください。

    image

  3. プレハブ内にある AvatarModel オブジェクトの子としてアバターのモデルを追加してください。

    image

    アバターとしてアップロード出来るようセットアップされたアバターは、そのままではワールドプロジェクトに持ち込むことができません。アバタープロジェクトの方で一度 Manual Bake したり、VRC Avatar Descriptor 始めとするワールドプロジェクトでは使えないコンポーネントを全てそぎ落としてから、ワールドプロジェクトに持ち込みましょう。

  4. アバターモデルに合わせて、BetterAvatarPedestal_sample オブジェクトにある Capsule Collider の大きさを調整してください。
    不要であれば、台座モデル (VRC_pedestal_udon オブジェクト) は削除してアバターモデルだけにする事も出来ます。

[!TIP] ペデスタルのインタラクト判定のアウトライン(水色のアレ)をモデルの輪郭に合わせたい場合、以下を満たす必要があります。

  • モデルが Mesh Renderer である (SkinnedMesh Renderer でない)
  • モデルの Batching Static がオフになっている

軽量化にもなるため、展示するモデルには以下のツールなどを使い、Mesh Renderer 化することをオススメします。
https://booth.pm/ja/items/1433818

つまり、どうしてもボーンやブレンドシェイプアニメーションを入れたい場合、アウトラインはコライダー形状で妥協する事になります。

VRChat 内の操作

このギミックはワンクッション置くために、アバターペデスタルをインタラクトするとメニューが表示され、メニューから Yes をインタラクトすることでアバターに着替えるようになっています。
Prefab 内の DialogBox オブジェクトがメニュー本体なので、必要に応じていったんアクティブにして位置調整してから、また非アクティブにしておいてください。

image

高度な使い方

アバターギミックからワールドへの転用を少しでも楽にするための補助ギミックを用意しています。
制約上 VRC Avatar Parameter Driver 等の再現が困難なため、シンプルな機構のものに限られます。

Animator Parameter Sync もあります。

Dynamics Parameter Transfer

Animator の付いたオブジェクトに付けると、子孫オブジェクトにある全ての Physbone と Contact Receiver を走査し、それぞれの状態をパラメーターとして Animator に渡します。Animator Controller とパラメーター名、型が一致するように名付けに注意してください。
アバターのものと違いパラメーター名を決める項目が無いため、オブジェクト名で代替しています。原則1オブジェクト1コンポーネントとして名付けるようにしてください。
また、Contact Receiver には仕様上 Contact Receiver Infomation を追加で付ける必要があります。このコンポーネントの [Setup Contacts in Children] ボタンを実行することで、子孫オブジェクトにある全ての Contact Receiver に Contact Receiver Infomation コンポーネントを追加してくれます。

  • Physbone
    • {オブジェクト名}_IsGrabbed [Bool] : この Physbone が掴まれている間 true
    • {オブジェクト名}_IsPosed [Bool] : この Physbone が固定されている間 true
    • {オブジェクト名}_Angle [Float] : この Physbone の曲げ角。0°~180° が 0.0~1.0 に換算されます
    • {オブジェクト名}_Stretch [Float] : この Physbone の伸び量。最大値に対する割合として 0.0~1.0 に換算されます
    • {オブジェクト名}_Squish [Float] : この Physbone の縮み量。最大値に対する割合として 0.0~1.0 に換算されます

パラメーターの詳細は公式ドキュメントを参照ください。
https://vrc-beta-docs.netlify.app/common-components/physbones/#options

  • Contact Receiver
    • {オブジェクト名}_Constant [Bool] : この Contact Receiver に一つ以上の Contact Sender が接触中の場合 true
    • {オブジェクト名}_OnEnter [Bool] : この Contact Receiver に Contact Sender が Min Velocity の速度以上で接触した時に1フレームだけ true
    • {オブジェクト名}_Proximity [Float] : この Contact Receiver に最接近している Contact Sender との近接度合い。Radius 半径表面以遠を 0.0 ~ Receiver 中心を 1.0 として換算されます

[!IMPORTANT] アバターのものと違い、Animator Controller にパラメーターを用意しておけば Constant, OnEnter, Proximity を一つの Contact Receiver で同時に取得できますが、Physbone のようにこれらの接尾辞を付ける必要があります。

パラメーターの詳細は公式ドキュメントを参照ください。
https://vrc-beta-docs.netlify.app/common-components/contacts/#receiver

Contact Receiver Infomation

仕様上ワールドの Contact Receiver はパラメーターを直接持たないため、パラメーター化するための補助コンポーネントです。
Dynamics Parameter Transfer に Contact Receiver のパラメーターを拾わせるために必須です。

このコンポーネント単体でも他の Udon スクリプトから以下のメソッド・プロパティを呼び出して、Contact Receiver のパラメーターをシンプルに取り出す使い方ができます。

返り値 名前 説明
ContactSenderProxy[] Senders この Contact Receiver が接触中の Contact Sender の配列を取得します
bool Constant この Contact Receiver に一つ以上の Contact Sender が接触中の場合 true
bool OnEnter HasStayedSender() のプロパティ版です
float Proximity CalculateProximity() のプロパティ版です
bool HasStayedSender() この Contact Receiver に一つ以上の Contact Sender が接触中の場合 true
float CalculateProximity() この Contact Receiver に最接近している Contact Sender との近接度合い。Receiver の 半径表面 0.0~1.0 中心 として換算されます
float CalculateProximity(VRCContactSender) 引数の Contact Sender との近接度合いを返します
float CalculateProximity(ContactSenderProxy) 引数の Contact Sender との近接度合いを返します

型の詳細は公式ドキュメントを参照ください。
https://vrc-beta-docs.netlify.app/common-components/contacts/#udon-access-in-worlds