TKSPのUnity関連ブログ

Unityに関することで書きたいことを書く.

VRChatで設置ギミックを作成する[VRChatアバター改変のすすめ その4]

はじめに

前回の記事の続きです。
Unity初心者で未読の方は、以前の記事を流し読んでおいて、VRChatで使用するUnityの機能を一通り確認していただければと思います。

今回は設定しなければならないものが多く、以前の記事を読んでいることを前提にするので、画像を多めに使用して雑に書きます。

※こちらのギミックを参考にさせていただいています(というかそのまま)
手っ取り早く済ませるのであればこちらをダウンロードし説明書に従ってください。
booth.pm

今回は自分もあまり詳しくない部分が多いです。
ギミックの作成方法とか、どうやって動いているのかがなんとなく分かっているだけです。
しかし、なんとなくでも分かっていれば応用ができます。
最後に応用例をいくつか書くので、知識をつけて自分オリジナルの改変を目指しましょう。

Constraint の説明

VRChat でワールド固定化などのギミックを作成するにはConstraintの機能をもう少し知る必要があります。

以前、磁石のようなものと説明しましたが、これには多くのパラメータが存在します。
少し難しいですがいつものざっくり解説。
自分も全く理解できていないので、雰囲気だけ掴んどいてください。
f:id:ymtkyorosiku:20211005215420p:plain

f:id:ymtkyorosiku:20211005220519g:plain
①.有効か無効か
f:id:ymtkyorosiku:20211005220605g:plain
②.追従する割合

f:id:ymtkyorosiku:20211005223127p:plain
③-1 固定
③-2 Weightが1の時に、追従する物体からどれだけ離れているか
③-3 Weightが1の時に、追従する物体からどれだけ回転しているか

Constraintでは追従するオブジェクトを増やすことも可能なので、各パラメータを個別で指定する機能がついています。
例えば、反対側にCapsuleを追加してみます。画像の⑥の左側にCapsuleのTransformを追加してます。

f:id:ymtkyorosiku:20211005221713p:plain

④ 追従オブジェクトごとに③と同じパラメータを個別に設定、③を触ると上書きされる
⑤ チェックを外すとその項目だけ追従せずに操作可能になる
⑥ 追従オブジェクトごとに②と同じパラメータを個別に設定、②を触ると上書きされる

f:id:ymtkyorosiku:20211005222854g:plain
Game開始状態でパラメータ触って雰囲気を掴む

ワールド固定ギミックを作る

応用と、仕組みの雰囲気を掴むために、あえてここではBoothのものは使用せず、1から作成する手順を示します。

CreateEmptyを6個作ります。
f:id:ymtkyorosiku:20211009032717p:plain
Shiftキーでまとめて選択し、作成したオブジェクトの座標を0にします。
f:id:ymtkyorosiku:20211009032725p:plain
F2で名称変更し、ドラッグドロップで図のような親子関係にします。
f:id:ymtkyorosiku:20211009033133p:plain
Lockの中に配置したい3Dオブジェクトを設置します。
とりあえず、Lockの中心にオブジェクトが来るように配置してください。
今回も(手に持たせた時と同じように)サイズ0.1のCubeにします。(BoxColliderは外してください)
f:id:ymtkyorosiku:20211009033441p:plain
LockGimmick01にRotation Constraintと、Position Constraintをアタッチし、WorldPointをくっつけます。
以下の画像のように値を設定してください。
Lock にチェックを入れて0に固定し、isActiveにチェックを入れて有効化します。
f:id:ymtkyorosiku:20211009194121p:plain
次に、LockにParent Constraintをアタッチし、ObjectPointとLockPointをくっつけます。
f:id:ymtkyorosiku:20211009034414p:plain
Lock PointにLockをくっつけます。
f:id:ymtkyorosiku:20211009034443p:plain
LockObjectsをアバターの中に入れ、ObjectPointをHips(無いならばArmatureの下にあるオブジェクト)に配置します。
f:id:ymtkyorosiku:20211009035059p:plain
アニメーションを2つ作成します。
f:id:ymtkyorosiku:20211009035121p:plain
boolでLock01パラメータを作成
f:id:ymtkyorosiku:20211009035600p:plain
ToggleでOnOffできるようにして、FXLayerのコントローラーに先ほど作成したアニメーションを追加します。
f:id:ymtkyorosiku:20211009035721p:plain

アニメーションを作成する

今回は録画ボタンでのKeyが打てない項目を選択するため、Add Propertyから追加します。
Add Propertyに並んでる項目はInspectorにあるものばかりですね。
ここにある項目は全て[アニメーションで上書きすることが可能]です!

以下のキーを追加します。
LockObjects>LockGimmick01>Lock>Parent Constraint > Sources.Array.data[0].weight
LockObjects>LockGimmick01>Lock>Parent Constraint > Sources.Array.data[1].weight
LockObjects>LockGimmick01>LockPoint>Parent Constraint > Active

f:id:ymtkyorosiku:20211009160744p:plain
f:id:ymtkyorosiku:20211009160815p:plain

完成すると以下のようになります。
f:id:ymtkyorosiku:20211009162050p:plain

上から順に0、1、チェック無しにします。
f:id:ymtkyorosiku:20211009163507p:plain
Lock_off_01アニメーションにキーをコピーして1、0、チェックありにします。
f:id:ymtkyorosiku:20211009200139p:plain
60frameのところにキーが打たれていた場合は、そちらを選択して削除します。
f:id:ymtkyorosiku:20211009164201p:plain

ここでやっていることは難しくないです。
以下の図を見てください。
アニメーションのキーと同じ個所がInspectorにあるはずです。
f:id:ymtkyorosiku:20211009163728p:plain
f:id:ymtkyorosiku:20211009163806p:plain
つまり、この部分をOnOffで切り替えているだけです。

動作確認

Unity上だとGame再生中はキャラのボーンのTransformがアニメーションで上書きされてしまうので、Scene画面では値を変更しても反映されなくなりしゃがんだ状態になってしまいます。
そこで、キャラの座標移動を再現するアニメーションを作成します。
まず、ExampleのTポーズアニメーションを複製します。
f:id:ymtkyorosiku:20211009164957p:plain
FXControllerにLayerを追加してWeightを1にして、先ほど複製したアニメーションをドラッグ&ドロップしておき、再生できるようにします。
f:id:ymtkyorosiku:20211009165100p:plain
複製したアニメーションの30frameにRoot T のX座標を変化させるキーを設置します。
f:id:ymtkyorosiku:20211009165622p:plain

これで、Game上で座標が変化した際の動作確認ができるようになりました。
f:id:ymtkyorosiku:20211009170216g:plain

Game中にParametersのLock01を切り替えるとWeightの0と1が逆転し、接続先が変化してその場にCubeを落とすように見えるのが確認できますね!
f:id:ymtkyorosiku:20211009170927g:plain

動作確認が済み次第、不具合が起きないように、FXControllerに追加したLayerのWeightは0にするか、レイヤー自体を削除しましょう。

いつものパラメータ設定とアップロード

そろそろ説明不要かな。
f:id:ymtkyorosiku:20211009175717p:plain
f:id:ymtkyorosiku:20211009175724p:plain

応用

応用1.落とした時だけ見えるようにする。

Lock_onの時にCubeを表示
f:id:ymtkyorosiku:20211009171428p:plain
Lock_offの時はフレームを追加しましょう。
Cubeを表示から非表示に切り替えることで回収しているように見せることができます。
f:id:ymtkyorosiku:20211009171803p:plain
f:id:ymtkyorosiku:20211009171810p:plain

落とした時だけ表示、回収時に足元まで来たら見えなくなるようになりました。
f:id:ymtkyorosiku:20211009172259g:plain

応用2.接続場所を変更する。

試しに、右手に配置してみます。
ObjectPointをボーンに配置したら、座標を(0,0,0)にします。
f:id:ymtkyorosiku:20211009204257p:plain
配置するオブジェクトの回転と座標を調整します。
f:id:ymtkyorosiku:20211009173658p:plain
完成!
f:id:ymtkyorosiku:20211009174607g:plain

応用3.設置物を増やす。

LockGimmick01を複製します。
出現位置を変更したい場合はObjectPointを複製しLockGimmick02に名称を変更し、応用2と同じように設定します。
複製したLockGimmickのConstraintで接続しているObjectPointを変更します。
f:id:ymtkyorosiku:20211009175221p:plain

LockGimmick01と同じようにアニメーションの作成、パラメーターの追加をします。
f:id:ymtkyorosiku:20211009181125p:plain
f:id:ymtkyorosiku:20211009181153p:plain

完成!
f:id:ymtkyorosiku:20211009201033g:plain

最後に

お疲れ様でした。

Constraintを活用することでアバターから切り離したり、接続したりできることが分かりましたね!
次回は音源を配置する方法について説明しようと考えているので、こちらと組み合わせることで、設置した場所に音楽を流すなどの応用も可能になるかと思います!