VRChatでの改変備忘録

はじめに

ここは私がVRChatをやる中で改変などしていくうちに書き溜めていく備忘録のような何かです。
ややこしいアニメーション周りのことが多いかも。
思いついたままに追記したり書き換えたりします。
確認したことは確認済み、と書きますがそれ以外は検証がイマイチだったりそもそも何もしていない可能性が高いです。
書いてあることについて質問等ありましたら、TwitterかVRChatで捕まえて聞いてみて下さい。分かる範囲で答えます。

VRChat内で割れるサングラスを実現する(検証大体済)

概ね検証済み。

実装に必要なもの

以下
 ・サングラスデータ(メッシュ)
  →UV展開されていて、少なくともレンズ部分がテクスチャにより実装されているもの。シェーダーはliltoon等Dissolveを使用できること。
 ・サングラスのヒビを表現するマスクデータ
  →シェーダーのDissolve機能で使用する。
 ・割れた時の効果音
  →フリー素材とかで探すか、作るか作ってもらう等

実装の仕方メモ

  1. アバターにサングラスを位置サイズ等合わせる

  2. 空のゲームオブジェクトを設置して割れた効果音を放り込む、オフにする

  3. サングラスのシェーダーでDissolveを使ってレンズ部分にヒビのマスクデータがいい感じに適用されるように調整する

  4. 2.のシェーダー設定と効果音をオンにするのをアニメーションとして保存する(このときアニメーションに含むのはDissolve関係の設定と効果音のみ)

  5. 3.で作ったアニメーションを元にDissolveと効果音がオフのアニメーションを作る

  6. (必要なら)サングラスそのものをON,OFFするアニメーションを作る

  7. アバターのFXレイヤーを選択し、Parameterに次の3つを設定する。1.サングラスを割る挙動をした時のBool、2.割れたサングラスを戻す挙動をした時のBool、3.1と2のBoolを受けて状態を変化させるInt

  8. サングラスのレンズ付近にVRC Contact Reciveを2つ設定する。1つは割るときのONスイッチになるもの、2つ目は割れたサングラスのOFFスイッチになるもの。1つ目のONスイッチは自分以外が触った時に動くこと。2つ目のOFFスイッチは自分だけが触れること。

  9. 1つ目のContactをConstantで6で設定した割る挙動をした時のBoolに設定。反応するタグはHandとか。

  10. 2つ目のContactをConstantで6で設定した戻す挙動をした時のBoolに設定。反応するタグはHandとか。

  11. FXレイヤーに戻り、Contactを受けるレイヤー、サングラスの状態を保存するレイヤーの2つを作成する。

  12. 10で作成したContactを受けるレイヤーは次のように設定する。遷移先は3つ、1つ目は2つのContactどちらも叩かれていない時のステート、アニメーションはEmpty。2つ目は壊れた時のContactがTrueになった時のステート、アニメーションはEmptyでParameterDriverをLocalOnly,Set,設定したIntに1を渡す。3つ目は壊れたのを戻す時のContactがTrueになった時のステート、アニメーションはEmptyでParameterDriverをLocalOnly,Set設定したIntに0を渡す。

  13. サングラスの状態を保存するレイヤーは次のように設定する。遷移先は2つ、1つ目は割れていない時のステート、遷移条件はIntが0の時、アニメーションにサングラスのシェーダーでDissolveがOFFになるものを。2つ目は割れている時のステート、遷移条件はIntが1の時、アニメーションにサングラスのシェーダーでDissolveがONになるときのものを。

  14. GestureManagerが使えるならDebugで壊れた時のBool、壊れたのを戻すBoolをそれぞれ叩いて動きを確認する。問題なければアップロードして実装完了。

VRChat(Unity?)における状態遷移のメモ

Contactで叩いた値で直接メッシュ等オブジェクトの状態を変化させると同期ズレするかも?
今のところ同期ズレしない(ほぼしない?)と確認できているのは、Contactで叩いた値を元にAvatarParameterDriver等で別の値を叩いて遷移させた先でメッシュ等オブジェクトの状態を変化させる方法。
これについては次のように考察する。

Contactはどのように設定してもその範囲内に設定したタグがあるときのみ、設定したParameterに値を渡す仕様。
なので、範囲内にタグが入ると設定したParameterに値を渡すが、タグが出た時に値を受けたParameterは0に戻ってしまい状態は保存されない。
これが同期ズレ、あるいは他者から見て遷移が発生しない原因とする。
なので、Contactの範囲内にタグが入った時に設定したParameterの値を受けて、更に別のParameterを叩く(値を渡す)2段式にする。そして更に値を受け取ったParameterを元に状態を遷移させる。
すると、Contactの範囲内からタグが出てもContactから直接値を受け取るように設定されたParameterの値が変化するだけで、2段目のParameterの値は変化しない、とすることができる。

ドローンシステムになるかもしれないメモ

これまでの状態遷移についてのメモを元に考えると、移動方向を叩くParameter、位置を記憶するParameterを設定すればアバターの付属品を自由に動かせるのでは?と考える。

課題

位置情報はParameterで記録したあとどうやってドローンの位置情報、Positionに反映するか?
アニメーションで呼び出せるのか?

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