curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

VRChatでFixedJointを使って自身と同期して動くアバターを作る、ためのスクリプトを作ってみた。

FixedJointを使うと同じ動きができるらしい、というお話を聞いたので試してみました。 いろいろ試したところ何とか成功。先人たちの知恵に感謝です。

で、設定が面倒だったので簡易なスクリプトを作ってみました。 Humanoidのアバター同士であればお手軽に同期できます。

f:id:curlune:20180321211741g:plain

動画雑い...

完成品

github.com

注意

  • これでいいのかは謎です。
    • 詳しくは聞いていないので適当に試行錯誤。
  • 不具合があります。
    • gifのように自身に同期するアバターが混ざる??謎。
  • 動作がおかしくなる場合があります。
    • 別途物理Rigidbodyを使うアバターと相性がよろしくない です。
      • 移動を反映しないようにしてしまうため。
    • 試す場合は新規シーンで。

環境

  • VRC: 0.12.0p15
  • VRC SDK: 2018.02.28,21,21
  • Unity: 5.6.3p1

使い方

f:id:curlune:20180321212917p:plain

アバターの準備

  • 自身用のアバターと、同期させたいHumanoiidアバターのモデルを用意します。
    • お手軽に試すのであれば同じものを複製するだけOKです。
    • ポーズが異なるとずれます。
  • シーンのヒエラルキーで、同期させたいモデルを、自身のアバターの子としてツリーに追加します。

スクリプトの準備

  • プロジェクトのAssetsの好きな場所にEditorというディレクトリを作る。
  • 先ほどのスクリプトを拾ってきてて投げ込む。
    • 完了するとメニューのVRC SDKの部分に項目が追加されます。

同期させる

注意: Undoに対応していないので元に戻せません!

メニューに追加された項目 VRC SDK > Util > Joint Sub Animator Bone を選択するだけです。

仕組み

同じ役割のボーン同士をつなげて、同じように回転させることで同期させています。 動作の邪魔になりそうな抵抗類はなくしています。

すべてのボーンに対して同じことをすることで全身(だいたい)同じ動きになります。 手動で設定するのは面倒なのでスクリプトスクリプト化しました。

Humanoidとしてのボーン情報を利用することで、モデルに関係なく自動的につなげています。

都合上、位置の移動は伝えていないため、一部アバターは動作しないかもしれません。位置も伝えるひどいことにしまうので....。

終わりに

Unityはお手軽に機能追加が出て便利ですね。

VRChat内部ではスクリプトが制限されていますが、データを作るためのEditer内では使い放題。いろいろやってみたいなあ。