VRChatでFixedJointを使って自身と同期して動くアバターを作る、ためのスクリプトを作ってみた。
FixedJoint
を使うと同じ動きができるらしい、というお話を聞いたので試してみました。
いろいろ試したところ何とか成功。先人たちの知恵に感謝です。
で、設定が面倒だったので簡易なスクリプトを作ってみました。 Humanoidのアバター同士であればお手軽に同期できます。
動画雑い...
完成品
注意
- これでいいのかは謎です。
- 詳しくは聞いていないので適当に試行錯誤。
- 不具合があります。
- 動作がおかしくなる場合があります。
- 別途物理
Rigidbody
を使うアバターと相性がよろしくない です。- 移動を反映しないようにしてしまうため。
- 試す場合は新規シーンで。
- 別途物理
環境
- VRC: 0.12.0p15
- VRC SDK: 2018.02.28,21,21
- Unity: 5.6.3p1
使い方
アバターの準備
- 自身用のアバターと、同期させたいHumanoiidアバターのモデルを用意します。
- お手軽に試すのであれば同じものを複製するだけOKです。
- ポーズが異なるとずれます。
- シーンのヒエラルキーで、同期させたいモデルを、自身のアバターの子としてツリーに追加します。
スクリプトの準備
同期させる
注意: Undoに対応していないので元に戻せません!
メニューに追加された項目 VRC SDK > Util > Joint Sub Animator Bone
を選択するだけです。
仕組み
同じ役割のボーン同士をつなげて、同じように回転させることで同期させています。 動作の邪魔になりそうな抵抗類はなくしています。
すべてのボーンに対して同じことをすることで全身(だいたい)同じ動きになります。 手動で設定するのは面倒なのでスクリプトでスクリプト化しました。
Humanoidとしてのボーン情報を利用することで、モデルに関係なく自動的につなげています。
都合上、位置の移動は伝えていないため、一部アバターは動作しないかもしれません。位置も伝えるひどいことにしまうので....。
終わりに
Unityはお手軽に機能追加が出て便利ですね。
VRChat内部ではスクリプトが制限されていますが、データを作るためのEditer内では使い放題。いろいろやってみたいなあ。