Avatar3.0のBase Layerで遊ぶ(コライダージャンプ)

最初は普通に色変えしてUTSのマニュアル読みながらうなってたんだけどやっぱ動くと嬉しいおもちゃがほしくなってしまってた。

VRChat(というかUnity?)ではコライダージャンプなるものがあって、空中のコライダーに一旦着地することによって連続ジャンプする飛行めそっどがある。実際一部のパブリックアバターやワールド環境で飛ぶことができる。

で、これを自アバターでもやってみたいなあと思って、Googleしたら何か一発で記事見つかったのでこれを突っ込んだりいろいろして遊んだ。

コライダージャンプ搭載

参考記事 : そうだ、空を飛ぼう。VRChatで空を飛ぶもっとも簡単な方法|ブルージー|note

ほんとにこれの通り。

基本的にはコライダーをアバターにアタッチして前の記事みたいにオブジェクト出し入れを実装するだけなんだけど、現行VRCSDKはBoolパラメータが使用可能なのと、今回は衣装のように必ず何か着てないと困る状況ではないのでIntでスイッチせずにBoolでスイッチする。

ステートマシン

Write Defaultsオンなのでアイテムオフの挙動は素のアバターの状態を使ってくれる分アニメーションクリップは一つ少なくなる(手抜きですいません...)けど、ここでは参考記事通り図のようなステートマシンにする。

モーションを付ける

飛行(跳躍か?)機能自体は上記でokなんだけど、参考記事にもあるとおり飛行中にムーンウォークするのは見た目的に微妙かもしれない。

そこでVRC想定移動モーション(無料配布) - 半沢のモーション部 - BOOTHを使って飛行中のモーションを切り替えられるようにする。

サンプルからvrc_AvatarV3LocomotionLayerをコピって図のようにStandingかつIsColliderJumpActiveがtrueだったらFlyingって名前のBlendTree状態に遷移するようにする。

遷移

いろいろ遷移条件を公式のAnimator Parametersをみて試したけど、コライダージャンプ中はコライダーに乗っ掛かってる分Groundedは使えなくて、結局上図のようになった。

そして、この状態で使用するBlendTreeは自作する必要があって少しめんどくさい(適用具合を確認して適宜修正しないといけないので。今回はやらなかったけど...)。

vrc_StandingLocomotionをサンプルからコピペしてきて(かなり値が違うので普通に空っぽから作った方がいいかも)、先にDLしたモーションを次のように割り当てる(ゼロポジションが抜けてるので、これは要修正かも)。

BlendTree割当

ここまでできたらビルド(とアップロード)して確認できる。

TODO できたら動画をここに追記する

おまけ:デスクトップ時の立ちモーションを変える

デスクトップで直立してると腕が真下にぶら下がってて衣装や素体によっては貫通して見た目が微妙になってしまう。これもStandingのBlendTreeを一部変更することで改善できる。

モーションはVRChat向けIDLEアニメーション - Imaginary Caravan by Coquelicotz - BOOTHが身長的にも近かったのでこれを使ってみた。

具体的には(もう一回)コピーしてきたvrc_StandingLocomotionproxy_stand_stillを任意のもので置き換える。

置き換え

実際に立ってみるとこんな感じ。

図

ちなみに今回使ったものとは別に持ってるオリジナル3Dモデル 『Izul -イズール-』 - bikiTadpole - BOOTHは立ちモーションも入っていて直立にならなかったので、アバター作者さんがどれだけ実装してたかによると思います(当たり前体操)。

引っかかりポイント

出したメガネが何か一瞬消えたりする!

コライダージャンプとは関係ないアクセサリの話なんだけど、Action Menuから実際に召喚してみると周期的に表示が消えたりする問題にあった。

最初はメッシュのBoundsの問題かと思ってて、ViewPointをいじったりした。

カメラが近づくと消えるメッシュの原因と対処法【Unity】【トラブルシューティング】 - (:3[kanのメモ帳]

けど、たまたま居合わせたおたくに訊いた所Animatorがおかしい、とのことだった。

よくあるのはHas Exit TimeをまちがってつけててExit timeまでアニメーションがループする、ってやつらしい。

実際on->offのときの遷移条件を書き忘れててHas Exit Timeが強制オンになってて下の図で

Glass_on->(Exit Time経過)->Exit->($IsGlassOn=trueなのでアニメーション頭からまたGlass_onに遷移して最初に戻る)

を繰り返してたっぽい。したの図は修正後の正解。条件忘れには気をつけよう!

ただしい

手書きで遷移させてるとLayerのWeightを1にし忘れたりこういうミスをやりがちなので、RadialInventoryを使わないとしても、少なくとも手順ぐらいはまとめたほうがいいのかもしれない...

環境

多分前回と同じ。

  • Unity 2018.4.20f1 Personal
  • VRCSDK 2021.01.28.19.08

メモ

AV3関連のやつ

フォトショ関連のやつ

販売されているVRC向けテクスチャ(アバター等含む)はクリスタ(CLIP STUDIO PAINT)使ってるケースが多いっぽいのでほんとはクリスタ買うべきなんですが...(?)