VRChat 軽量で快適な合法チートロポリコンを作ってみた!
はじめに
こんにちは!
VRC合法チート研究会開発長のTKSPです!
今回は合法チート研究会のツールとMesh Bakerを使って便利なロポリコンちゃんを作成してみたので,その方法を伝授します!
何をするか
publicワールドやお出かけに使用するShow Avatarしなくても見える軽量で便利なアバターを作っていきます!
Quest版ではExcellent、PC版ではGoodパフォーマンスのロポリコンを作成します。
どこでも寝れてどこでも座れる、巨大化縮小化が可能で空も飛べる。動画も再生できるのにexcellentなQuestアバターが完成しました。mesh bakerが必要ですが、作り方を執筆中です。
— TKSP (@YMTKSP) 2022年1月7日
VRC画像&動画共有システムをv1.0.1に更新します。#VRChat #睡眠システム #スケールチェンジシステム #動画共有システム pic.twitter.com/UkF7VfuIKm
下準備
まず必要なものの購入やダウンロードを済ませておきます。
VRC SDK3のダウンロード
VRChat homeのDownloadからダウンロード
VRChat - Home
ロポリコンの購入
こちらのリンクからロポリコンちゃんを購入します。
booth.pm
Mesh Bakerの購入
こちらのリンクから購入します。
assetstore.unity.com
Dynamic Boneの購入
みんな持ってるよね。
assetstore.unity.com
ModelBoneDeleterのダウンロード
こちらのリンクからダウンロードします。
booth.pm
PC版のGoodなロポリコンを作成する
PCプロジェクトの用意
PCアバター用のプロジェクトを作成します。
後でQuest用のものをプロジェクトを複製して作成するため保存先は分かる場所にしておいてください。
パッケージの導入
先ほどダウンロードしたものを以下の順番でインポートします。
(3つほど足りないですが、Quest対応の時にインポートします)
1.VRC SDK3
2.Dynamic Bone
3.UTS2_ShaderOnly_v2.0.8_Release
4.ロポリコン
5.合法チートツール4種
6.好きな動画(mp4,40秒未満を推奨)と好きな音楽(mp3)をProjectにドラッグ&ドロップ
ロポリコンをSDK3化する
1.LowPoly_Kon_PCプレハブをHierarchyに追加します。
Projectから矢印が付いていないほうのLowPoly_Kon_PCをHierarchyにドラッグ&ドロップします。
2.Pipeline Managerと(Scriptの削除)
右クリックでRemove Component
3.VRC Avatar Descriptorを追加
Add Componentからvrcで検索するとすぐに出ます。
4.ViewPositionとリップシンク設定
ViewPositionに(0,0.83,0.007)を設定
リップシンクはAuto Detect!で自動で設定されます。
5.HandsLayerの複製
VRCSDK/Example3/Animation/Controllers/vrc_AvatarV3HandsLayer.controllerを複製します。
選択してctrl + dで複製できます。
適当なフォルダに移動し、LowPolyKonFXLayerに名前を変えておきましょう。
選択してF2でファイルの名称変更ができます。
6.HandsLayerの編集
LowPolyKonFXLayerをダブルクリックしてAnimatorタブを開きます。
AllPartsとLeft Handの間にIdleを追加します。
Weightを1に設定してください。
7.Idleアニメーションの作成
CreateからAnimationを作成しIdleとします。
先ほど作成したLowPolyKonFXLayerのIdleに追加し、オレンジの枠を選択したら、InspectorからWriteDefaultsを切ります。
8.Idleアニメーションのキーを設定
LowPolyKonFXLayerをLowPoly_Kon_PCのAnimatorのControllerに指定します。
Window>Animation>AnimationでAnimationタブを開き、Idleを指定します。
録画ボタンを押したら、LowPoly_Kon_PC内のLowpoly_konを選択し、vrcで始まるリップシンク以外のやつを全て少し動かして0のKeyを打ちます。
最終的にこのようになります。Keyを打ち終わったら録画ボタンで停止、Previewを押してしゃがみからTポーズに戻してください。
9.変更したControllerを元に戻します。
10.アニメーションの設定
Left HandのIdleとRight HandのIdleにVGC/VGCResources/EmptyAnimationを設定します。(Keyが何も設定されていないアニメーションファイルです)
右手と左手のFistからThumbs upに好きな表情を設定しましょう。
Lowpply_Kon_ver1.2/Animation_ver1.2に表情のアニメーションが14個入っています。
11.FXレイヤーを設定する
LowPoly_Kon_PCのPlayableLayersのFXにLowPolyKonFXLayerを指定します。
お疲れ様でした。ロポリコンのSDK3化はこれで完了です。
VGCツールを導入する
睡眠システム、水泳アニメーション、スケールチェンジシステムの導入
※順番に注意してください。
睡眠システム、水泳アニメーション、スケールチェンジシステムの順で導入する必要があります。
30秒かからないですね。
動画システムの導入
動画システムを導入します。
アスペクト比調整が小さいほど画像が大きくなります。
スキップするフレーム数が小さいほどフレームレートが上がります。
Material数が1になるように調整しましょう。
DynamicBoneを減らす
耳以外のDynamicBoneは削除します。
Quest版のExcellentなロポリコンを作成する
Quest版のロポリコンをSDK3化する
LowPoly_Kon_PCのVRC Avatar Descriptorを右クリックでコピーし、LowPoly_Kon_QuestのAnimatorを右クリックしてPaste Component As Newで貼り付けます。
(Script)はRemoveしましょう。
PC版を非アクティブにし、リップシンクがPC版を参照しているのでDefaultに戻してAuto Detect!
VGCシステムの再設定
(シーン保存前にUnityを閉じたのが原因か、自分は水泳アニメーションとスケールチェンジのセットアップが未完了になっていたため再セットアップしました)
動画システムの再設定を行います。
今回はExcellentを目指すので、有効化アニメーションを変更にチェックを入れます。
ArmatureのScaleが100になっているため、ビデオシステムのスケールを0.01倍にします。
ビデオは内側を向いているので180度回転させておきましょう。
Positionも高いのでYに0を入れておきましょう。
パッケージの導入
最初に用意しておいて入れていなかったパッケージをインポートします。
1.ModelBoneDeleter
2.Mesh Baker
ボーンを削減する
GatoToolからModelBoneDeleterを使用して、髪としっぽのボーンを削除します。
複製されるのでLowPoly_Kon_Questは非アクティブにします。
Meshを結合する
GameObject>Create Other > Mesh Baker > TextureBaker and MeshBaker
からTextureBaker (0)を生成します。
Assets内の適当なフォルダにMeshBakerのフォルダを作成します。(名前はフォルダ名はMeshBakerじゃなくても分かりやすければよいです。)
TextureBakerを選択し、Create Empty Assets For Combined Materialを選択します。
マテリアルを作成するので、先ほど作成したMeshBakerフォルダに保存しましょう。
LowPoly_Kon_Quest_deleteBonesをDrag & Drop Renderers or Parents HEARにドラッグ&ドロップします。
Objects To Be Combined が2つになっていることを確認します。
Max Tilong Bake Sizeを2048にします。
include Blend Shapesにチェックを入れます。
Skinned Mesh Rendererに変更します。
Merge Blend Shapes With Same Namesにチェックを入れます。
Bake Materials Into Combined Materialを押します。
TextureBakerの中にあるMeshBakerを選択し、OutputをBake Into Prefabに変更します。
Create Empty Prefabで先ほど作成したフォルダに新規Prefabを保存します。
Bakeします。
結合したメッシュでアバターを作成する
LowPoly_Kon_Quest_deleteBonesを非アクティブにして作成したPrefabをシーンに配置します。
そのあとMyPrefab0をUnPackPrefabします。
LowPoly_Kon_Quest_deleteBones(Clone)を外に出し、MeshBaker-mesh-meshをLowPoly_Kon_Quest_deleteBones(Clone)の中に入れます。
MyPrefab0を削除します。
Lowpoly_konを削除し、MeshBaker-mesh-meshをLowpoly_konに名称変更します。
リップシンクの設定をやり直します。Defaultに戻してAuto Detect!
マテリアルのシェーダーを変更します。
Legacy Shaders/DiffuseからVRChat/Mobile/Toon Litに変更します。
アニメーションのパスを修正
VGC/CreateAssets/LowPoly_Kon_QuestにあるVGCVideo_offとVGCVideo_onのパスを変更します。
ダブルクリックでアニメーションを開き、Key名を選択した状態でキーボードのF2で名称変更します。Lowpoly_konに変更します。
VRChatアバターにSit判定を設定する[VRChatアバター改変のすすめ その6]
はじめに
こんにちは。
今回はアバターにSit判定を設定して他の人を座らせる方法をご紹介したいと思います。
Sit判定の作成
Sit判定を付与する方法はとても簡単です。以下の2つのステップで簡単に設定できます。
VRC Station 特性をアタッチ
取り出す物に対して、VRC Stationをアタッチします。
Enter,Exitを設定
Create Empty で、取り出す物の中に2つオブジェクトを作成します。
その後、Enter,Exitなどに名前を変更し、VRC Stationに適用します。
こちらをアップロードするとこのような感じで、Cubeをタッチしたときに座るモーションになり、手と頭を動かすことのできる状態になります。
座るモーションの変更
例として立ちアニメーションを設定したアニメーションコントローラーを作成し、アタッチします。
立ちアニメーションに変更されました。
※自由なアニメーションを設定可能ですが、手と頭は動かせてしまいます。
補足
タッチ判定の形
タッチできる形を決めているのはMesh Filterです。無い場合は動かないと思います。
当たり判定だけ表示したい場合は以下の2つの方法があります。
(確認のために前者の方法でいつでも表示できるようにした方がいいかも。後者の場合はマテリアル数が減ります)
座る場所と降りる場所
Enterが座る位置、Exitが降りる位置になります。
Positionを変更することで、簡単に変更可能です。
その他のパラメータ
その4の設置ギミックを使用して、以下の5つの設定を用意して動作確認を行いました。
1. 普通。
2. 1->2には座った状態で座れるが、2->1は座れない。
右が1で左が2の椅子です。
3. 立つ、降りた後に動けなくなる。(不具合?)
- > 他の椅子にSitした場合、再び動けるようになるが、それ以外はワールド入り直さないと動けない(アバター変更じゃ直らない)
4. 他の椅子に移れないため、降りてから他の椅子に座ることで足が動くようになる
2と3が組み合わさった状態。アバターギミックとしては使わないほうが良さそう。
5. 1と全く変わらない。
多分ワールドギミック用の設定なのだろう...
さいごに
以上、VRChatでアバターにSitギミックを設定する方法でした。
簡単に実装できますね。
手と足が動いてしまっても大丈夫なモーションであれば、オリジナルのSit判定がすぐに使えるようになると思います!
VRChatアバターから音楽を鳴らす[VRChatアバター改変のすすめ その5]
はじめに
こんにちは。
前回はConstraintについての大雑把な説明を行いました。
ここまで読んでくれた方は、かなりアバター改変の腕が上がっているのではないでしょうか?
さて、今回はVRCで効果音や音楽を鳴らす方法について説明していきます。
音楽を用意する
お手軽なのは魔王魂さんです。
よさげな曲をダウンロードしたら、UnityのProjectにドラッグ&ドロップしましょう。
mp3、wav、ogg形式に対応しています。m4aは対応していません。別のツールで変換してください。
音楽を鳴らす
今回はとても簡単です。UnityではAudioSource属性のついた物体で音を鳴らすことができます。
試しにその2で作成した右手のCubeにAudioSource属性を取り付けてみます。
再生したい音楽を指定しましょう。
Play On Awakeには必ずチェックを入れましょう。入っていないと再生されないです。
ループしたい場合はLoopにチェックをします。
Volumeで音量を調整します。
各パラメータについてはこちらの変数の項目を参照してください。
UnityEngine.AudioSource - Unity スクリプトリファレンス
これで、オーケストラ24がワールドにいるすべての人に同じ音量で響き渡るようになりました!
大迷惑!!
音の範囲を調整する
音の範囲を調整するには VRC Spatial Audio Source が必要になります。アタッチしましょう。
そのままだと聞こえる範囲が広すぎるので、Farを3、Nearを2にします。
Farは聞こえる距離(メートル)でNearは音量が下がらない範囲(メートルです)
Gainは音量の強さだと思うのですが、AudioSourceのVolumeとバランスをとって最適な音量になるまでいろいろ試してみてください。
これで、Cubeの中心に近づくほど音量が大きくなるようになりました!
完成
今回はとても簡単でしたね。
そのままアップロードで完成です。
その2で作成した、cube_onとcube_offを切り替えるとActiveが切り替わってAudioSourceが無効化されるため、Cubeが出現しているときに音楽が再生され、Cubeが出現していないときに音楽が停止します。
応用
応用1.見た目を変更する
こちらのスピーカーをインポートします。
Cubeと同じ階層に置きます。
Transformをコピー、ペーストします。
Transformと表示されている部分で右クリックするとコピーをするメニューが出てきます。
Parent ConstraintとAudioSorceとVRC Spatial Audio Sourceを同じ設定で取り付けます。
新しく取り付ける場合は、すでについているコンポーネントのいずれかから右クリックしてメニューを出現させ、Paste Component As New です。
スピーカーのAnimatorはいらないので外しちゃいます。
Cubeを削除して、スピーカーの位置を調整します。
アニメーションを修正します。
アバターのAnimator属性のControllerにFXLayerを指定して録画ボタンでしたね。
cube_offとcube_onアニメーションを修正しましょう。
これで見た目をCubeからスピーカーに変えることができました。
応用2.設置ギミックから音楽を鳴らす
その4で作成した設置ギミックのCubeをスピーカーにします。
スピーカーについているParent Constraint以外のコンポーネントを全てCubeに上書きまたは追加します。
これで完成!早い...
Mesh Filterは形、Mesh Rendrerはコンピューターにこの材質で絵を描いて欲しいと命令する特性なので、実は応用1もこの方法なら早かったのです。
応用3.音楽を変更する
複数の音楽を配置する
Cubeの子に空のオブジェクト(Create Empty)を鳴らしたい音楽の数だけ配置し、それぞれにAudioSourceとVRC Spatial Audio Sourceを設定、名称変更、再生したい音楽を指定します。
CubeのVRC Spatial Audio SourceとAudioSourceは外します。
この時、先にVRC Spatial Audio Sourceから外さないとAudioSourceは外せません。
アニメーションの準備
FXLayerにLayerを追加、Weightは1、アニメーションを作成し、パラメータ追加、Motion Timeをonにして、作成したパラメータを指定します。
Motion Timeについては後述します。
アニメーションの作成
先ほど作成した音楽を鳴らす物体をまとめて選択して録画状態でキーを打ちます。
コピペで増やして、n+1分のキーを打ちます。(nは配置した音楽の数、画像の場合は3なので3+1 = 4)
以下の画像のように各フレームで有効にする物体が一つになるようにキーを打ちます。(最後のキーは全部無効化)
アップロードの準備
第3回で使用したRadial Puppetで0-1の範囲でSelectMusicを切り替えるようにします。
アップロード
アップロードして動作確認しましょう。
設置した後にRadial Puppetの値を変更することで音楽が変更されることが確認できるかと思います。
Motion Timeについて
アニメーションをframeで流れるように再生するのではなく、frameを割合で固定して再生することができます。
応用すれば服を即座に切り替えることもできますし、第3回で行った色の切り替えも、色を混ぜる表現の必要が無い場合は、こちらの方法だとアニメーションファイル一つで実現可能になります。
最後に
以上、VRChatアバターから音楽を鳴らす方法でした。
VRChatで設置ギミックを作成する[VRChatアバター改変のすすめ その4]
はじめに
前回の記事の続きです。
Unity初心者で未読の方は、以前の記事を流し読んでおいて、VRChatで使用するUnityの機能を一通り確認していただければと思います。
今回は設定しなければならないものが多く、以前の記事を読んでいることを前提にするので、画像を多めに使用して雑に書きます。
※こちらのギミックを参考にさせていただいています(というかそのまま)
手っ取り早く済ませるのであればこちらをダウンロードし説明書に従ってください。
booth.pm
今回は自分もあまり詳しくない部分が多いです。
ギミックの作成方法とか、どうやって動いているのかがなんとなく分かっているだけです。
しかし、なんとなくでも分かっていれば応用ができます。
最後に応用例をいくつか書くので、知識をつけて自分オリジナルの改変を目指しましょう。
Constraint の説明
VRChat でワールド固定化などのギミックを作成するにはConstraintの機能をもう少し知る必要があります。
以前、磁石のようなものと説明しましたが、これには多くのパラメータが存在します。
少し難しいですがいつものざっくり解説。
自分も全く理解できていないので、雰囲気だけ掴んどいてください。
③-1 固定
③-2 Weightが1の時に、追従する物体からどれだけ離れているか
③-3 Weightが1の時に、追従する物体からどれだけ回転しているか
Constraintでは追従するオブジェクトを増やすことも可能なので、各パラメータを個別で指定する機能がついています。
例えば、反対側にCapsuleを追加してみます。画像の⑥の左側にCapsuleのTransformを追加してます。
④ 追従オブジェクトごとに③と同じパラメータを個別に設定、③を触ると上書きされる
⑤ チェックを外すとその項目だけ追従せずに操作可能になる
⑥ 追従オブジェクトごとに②と同じパラメータを個別に設定、②を触ると上書きされる
ワールド固定ギミックを作る
応用と、仕組みの雰囲気を掴むために、あえてここではBoothのものは使用せず、1から作成する手順を示します。
CreateEmptyを6個作ります。
Shiftキーでまとめて選択し、作成したオブジェクトの座標を0にします。
F2で名称変更し、ドラッグドロップで図のような親子関係にします。
Lockの中に配置したい3Dオブジェクトを設置します。
とりあえず、Lockの中心にオブジェクトが来るように配置してください。
今回も(手に持たせた時と同じように)サイズ0.1のCubeにします。(BoxColliderは外してください)
LockGimmick01にRotation Constraintと、Position Constraintをアタッチし、WorldPointをくっつけます。
以下の画像のように値を設定してください。
Lock にチェックを入れて0に固定し、isActiveにチェックを入れて有効化します。
次に、LockにParent Constraintをアタッチし、ObjectPointとLockPointをくっつけます。
Lock PointにLockをくっつけます。
LockObjectsをアバターの中に入れ、ObjectPointをHips(無いならばArmatureの下にあるオブジェクト)に配置します。
アニメーションを2つ作成します。
boolでLock01パラメータを作成
ToggleでOnOffできるようにして、FXLayerのコントローラーに先ほど作成したアニメーションを追加します。
アニメーションを作成する
今回は録画ボタンでの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
完成すると以下のようになります。
上から順に0、1、チェック無しにします。
Lock_off_01アニメーションにキーをコピーして1、0、チェックありにします。
60frameのところにキーが打たれていた場合は、そちらを選択して削除します。
ここでやっていることは難しくないです。
以下の図を見てください。
アニメーションのキーと同じ個所がInspectorにあるはずです。
つまり、この部分をOnOffで切り替えているだけです。
動作確認
Unity上だとGame再生中はキャラのボーンのTransformがアニメーションで上書きされてしまうので、Scene画面では値を変更しても反映されなくなりしゃがんだ状態になってしまいます。
そこで、キャラの座標移動を再現するアニメーションを作成します。
まず、ExampleのTポーズアニメーションを複製します。
FXControllerにLayerを追加してWeightを1にして、先ほど複製したアニメーションをドラッグ&ドロップしておき、再生できるようにします。
複製したアニメーションの30frameにRoot T のX座標を変化させるキーを設置します。
これで、Game上で座標が変化した際の動作確認ができるようになりました。
Game中にParametersのLock01を切り替えるとWeightの0と1が逆転し、接続先が変化してその場にCubeを落とすように見えるのが確認できますね!
動作確認が済み次第、不具合が起きないように、FXControllerに追加したLayerのWeightは0にするか、レイヤー自体を削除しましょう。
いつものパラメータ設定とアップロード
そろそろ説明不要かな。
応用
応用1.落とした時だけ見えるようにする。
Lock_onの時にCubeを表示
Lock_offの時はフレームを追加しましょう。
Cubeを表示から非表示に切り替えることで回収しているように見せることができます。
落とした時だけ表示、回収時に足元まで来たら見えなくなるようになりました。
応用2.接続場所を変更する。
試しに、右手に配置してみます。
ObjectPointをボーンに配置したら、座標を(0,0,0)にします。
配置するオブジェクトの回転と座標を調整します。
完成!
応用3.設置物を増やす。
LockGimmick01を複製します。
出現位置を変更したい場合はObjectPointを複製しLockGimmick02に名称を変更し、応用2と同じように設定します。
複製したLockGimmickのConstraintで接続しているObjectPointを変更します。
LockGimmick01と同じようにアニメーションの作成、パラメーターの追加をします。
完成!
最後に
お疲れ様でした。
Constraintを活用することでアバターから切り離したり、接続したりできることが分かりましたね!
次回は音源を配置する方法について説明しようと考えているので、こちらと組み合わせることで、設置した場所に音楽を流すなどの応用も可能になるかと思います!
VRChatでキャラの色を動的に変えるアニメーションを作成する[VRChatアバター改変のすすめ その3]
はじめに
本記事は前々回からの続きです。
既読を前提とする部分が含まれるため、一読していただけますと幸いです。
VRChatアバターにアニメーションを大量に設定するのに必要な知識とか機能のまとめ - TKSPのUnity関連ブログ
VRChatで物を取り出すアニメーションを作成する - TKSPのUnity関連ブログ
髪の毛の色を動的に変える
髪の毛の色を変えるためにまず、素材を準備していきます。
白い髪の毛テクスチャを用意する
使用しているアバターの髪の毛のテクスチャが存在すると思うので、そちらをデスクトップにドラッグ&ドロップでコピーできます。
その後、コピーしたテクスチャを右クリックし、プログラムから開くでフォトを開きます。
編集と作成メニューから、編集、調整で色を一番左にして保存します。
これを画像が白っぽくなるまで繰り返します。
完成した白黒(灰?)画像を作業フォルダに(Textureフォルダとか作っておくといいかも)入れます。
マテリアルを用意する
元のアバターのMaterialを探します。
マテリアルには、Mesh Rendererがコンピューターに描いて欲しい材質の情報が詰まっています。(金属?木材?光る?透明?などの情報)
①をクリックすると、対象のマテリアルがProjectに表示されると思うので、それをctrl + dで複製し、F2で名称を変更します。(自分はnero_hair_matにしました)
①をクリックして見つからない場合は自分で探してください。この場合、Element 0に入っている「tex2」の文字を入力すると引っ掛かります。
(Project内の素材が多すぎると①をクリックしても自動で移動しないことがあります)
複製したマテリアルを、作業フォルダに移動させてください。
マテリアルに画像を適用する
- マテリアルを選択
- インスペクターを固定
- テクスチャを設定
- 人によってテクスチャを入れる場所、量が変化します。ネロちゃんはUnityちゃんToonシェーダーでした。
- インスペクターの固定を解除(2の逆)
マテリアルをアバターに適用する。
2つ方法があります。どちらもやっていることは同じです。お好きな方で。
- Mesh rendererで適用する
- Scene画面で適用する
この子の場合はしっぽと耳も同じマテリアルなので変えておきます。
アニメーションファイルを作成する
作業フォルダにHairColorフォルダを作成し、color_red,color_blue,color_greenのアニメーションを作成します。
BlendTreeファイルを作成する
普通はコントローラー上で直接作成するのですが、コピーができたほうが、後ほどいろいろとはかどるのでSDKからコピーします。
vrc_CrouchingLocomotionを複製し、名称をhair_colorに変更して、作業フォルダに移動してください。
コピーしたブレンドツリーの項目をすべて削除します。
- 選択
- 選択
- 削除(大丈夫か聞かれるのでDeleateを押す)
- 削除を繰り返す
全部消すと以下のようになります。
FXLayerを編集する
前回作成したFXLayerにHairColorLayerを追加し、歯車マークからWaightを1にします。
ParametersにfloatでHairColorを追加します。
先ほど作成したBlend Treeを初期Stateとして登録します。
- hairColorLayerを選択
- hair_colorをドラッグ&ドロップ
- stateを選択
- Write Defaultsを外す
ブレンドツリーの設定を行う
- 1Dに変更
- HairColorに変更 -> FXLayerで指定したfloatのパラメータが表示される
- Listに3つ追加
Motionに先ほど作成したアニメーションを設定します。
Thresholdを0~1にします。
これで、HairColorが0の時はred,0.5の時はblue,1の時は緑になります。
また、FXLayerにblend Treeが登録されているので、そこに設定されているアニメーションも編集できるようになります。
色を変更するアニメーションを作成する
前回の復習です。
最初に、アバターのアニメーションを編集できるようにコントローラーに登録してから、編集したいアニメーションを選択し、録画ボタンです。
髪の毛のオブジェクトを選択し、Mesh Renderer のMaterial色を変更します。
この際、Projectのフォルダにある素材の方を直接触らないように注意してください。
今回は髪の毛だけを変えるため、しっぽや耳の色は同じ素材を使用していますが、変化していないことが確認できるかと思います。
HairについているSkind Mesh Rendererの色を赤に変更するKeyが打てていることが確認できます。
前回書きましたが、大事なことなのでもう一度書きます。
Unityのアニメーションは、「物体の特性に値を上書きする」だけです。
やってることが分かれば何も怖くない。
同様にblueとgreenも作成します。
録画で作成しても良いですが、単純なキーなのでコピペして編集でも大丈夫です。
動作確認
- アバターを選択
- Game開始
- 再生されていることを確認し、ダブルクリックで中へ移動
- 選択
- 赤い矢印をドラッグ
- 色が変わっていることを確認
- HairColorが0~1で変化していることを確認
- Game終了
色が変わりました!
BlendTreeがrgbを混ぜてくれています。
今回はアニメーションの配置が等間隔(0, 0.5, 1)だったので、赤と青の中間の場合は(r,g,b,a)=(0.5, 0.5, 0, 1)になるため、紫になります。
欲しい色があったら0~1の範囲で後で追加しましょう。
動作確認が済んだらControllerは外しましょう。
VRChatで動かすための準備
いつものやつです。
動作することは確認したので後はVRChatで動くようにするだけです。今回で三回目ですね。
Expression ParameterにHairColorを登録
Menuに登録
Radial Puppetについては後で解説します。
Paramater Rotationの方にHairColorを設定してください
アップロード
Materialの変更で赤いエラーが出ていた場合は(赤いエラーだけ)Auto Fixしてください。
動いた!
Radial Puppetについて
Paramater スティックメニューを開いている間はOn(1),閉じている間はOff(0)
Paramater Rotation 0~1の範囲で0.01刻みに値を変更する(0%~100%)
耳の色も変更する
HairColorFolderと同じ場所にEarColorフォルダを作成します。
次にHairColorFolderの中身を複製するのですが、下記の方法で複数選択した後にctrl + dで複製を行うと簡単です。
複数選択方法
複数選択の方法は2つあるので使い分けてください。
ctrlを押しながらクリックで複数選択-> 間をあけることができる。
Shiftを押しながら対象の範囲の上部分と下部分を順番にクリック -> 一度にたくさん選択できる
また、ctrlの方法は既に選択しているものを選択から外すことが可能なため、Shiftで選択してから、いらない部分をctrlで外すなどの合わせ技ができます。
Hairと同じような状態にする
ctrl + d で複製
複数選択した状態で選択されている素材の一つをドラッグ&ドロップすると一緒に移動できます。便利。
アニメーション名が被ってしまうので「部位_色」に変更します。
名称変更はF2ですね。Earも対応しましょう。
earのblend treeに紐づいているアニメーションを修正します。
Hairでやったことと同じようなことをやる。
- Layere追加
- Weight変更
- Parameters追加
- Blend Treeをドラッグ&ドロップ
- State選択
- Write defaults を切る
- controller設定
- earのアニメーションを編集してるか確認
- コピペしたのでearのキーが全部hairになっているため削除(一番上のキーが全体になるので、右クリックからDelete Keys)
- 録画ボタンとかを駆使して耳の色が変わるアニメーションキーを打つ(さっき髪でやった)
- プレビューで確認可能
- 色が変わってるか確認
- プレビューOffの時
- 元に戻ってるか確認
- 青と緑も作る
- controller外す
- Expression Parameters登録
- Menuに登録
- 忘れてました。Blend Treeに紐づいているパラメータ変更
完成!
X軸とY軸を持つBlend Tree
Blend Treeの作成
しっぽの色を変更するアニメーションを例に説明します。
VRChatのfloatの範囲は-1.00~1.00なのですが、そちら活用する方法の一例です。
2D Freefrom Directional の Blend Treeを作成します。
これは、X軸とY軸を-1.00~1.00の範囲で持つBlend Treeです。
今回は黒と白のアニメーションも作成し、いい感じの位置に置いて動作確認をしました。
きれいに混ざりましたね。
本来は色を混ぜるために使うものではないです。
この方法では一部の色が表現できません。(黄色とか)
また、余分にパラメータを消費します。
パラメータに余裕のない方や、指定した色だけで変更したい方は 1D のBlendTreeにたくさんの色変更アニメーションを登録した方が良いです。
パラメータを余分に使っていいという方は、こちらの方法でアニメーション作成の手間を省くことができます。
VRChatで表示
いつも通りのパラメータ追加
Two Axis Puppetを選択
Two Axis Puppetの説明
Parameter 開いてるときOn(1),閉じているときOff(0)
Parameter Horizontal 横に-1.00~1.00の範囲で変化させる
Parameter Vertical 縦に-1.00~1.00の範囲で変化させる
アップロードして確認
自由に色を変更することができますね。
このメニューを、別のことに応用できないかを模索してみてください。
ちなみにデフォルトのLocomotionLayerではアバターの移動方向をX(左右),Z(前後)として、移動方向のアニメーションを混ぜて表現しているみたいです。
終わりに
以上、キャラの色を動的に変えるアニメーションの作成方法の解説でした。
次はWorldにオブジェクトを配置するギミックの作成をしてみたいなと考えています。
頑張って土曜日までには投稿したいです。
VRChatで物を取り出すアニメーションを作成する[VRChatアバター改変のすすめ その2]
はじめに
こちらの記事は前回の続きです。
tksp-unityroom.hatenablog.com
前回、キャラクターを動かすアニメーションの設定ができたので今度は物を取り出す機能の作成を行いたいと思います。
物を取り出す
物を取り出すためには、アバターと同じ位置に物を出現させる必要があります。
そのため、物を取り出す前に、物をアバターに追従させる技術を知っておく必要があります。
物を追従させる
方法は2種類あります。
応用の幅が広いので、ぜひ2の方法は知っていてほしいです。
応用をしない場合は1の方法が処理が軽いので、使い分けられるようになっていただけたら嬉しいです。
- 物体をボーンの中に入れる
- Constraint特性で結合する
最初にCubeをHierarchy内で作成し、InspectorのSize(XYZ全部)を0.1にして大きさを調整します。
Cubeにはデフォルトで4つの特性(コンポーネント)がついていますね。Transformeについては前回説明したのでそれ以外についてザックリ説明します。
Mesh Filter
その物体の形を確定させるもの
Mesh Renderer
Mesh Filter で指定された形で絵を描いて欲しいとコンピュータに命令を送るもの
box Collider
Collider同士でぶつかると反発する当たり判定の特性。
不要なコンポーネントを外す方法
今回、BoxColliderがついたままだとVRChatのアバターに自動的に付与される当たり判定と干渉して不具合が起きるのでBoxColliderを外しておきます。
消したいコンポーネントを右クリックして、Remove Component で外せます。
ボーンとMesh Rendererの関係
さて、ボーンとは何ぞやといいますと骨です。(意味不)
大体のアバターがArmatureの中に入っている構造になっているかと思います。(Armatureが無ければ別の名前で同じような構造になっているかと思います。)
キャラクターの構造としては、先ほど説明したMesh Rendererでその形を描くように命令されているのですが、それだとポーズが取れないです。
そのため、ネロちゃんはbodyにSkinned Mesh Renderer という別の特性を持っています。
これは、Meshの中に入っている形を対応されたボーンのTransformの値で変形させてから描くように命令するMesh Rendererです。
例えば、Arm(腕)ボーンのTransformを変更するとSkinned Mesh Rendererが表示する形が変形することが確認できます。
添付画像のように、Transformの変形はInspectorからの直接指定だけではなく、Hierarchyで物体を選択した後、Sceneでドラッグ操作することでも変更可能です。
変形の方法は以下の通りです。
- 位置(Position)
- 回転(Rotation)
- 大きさ(Scale)
- 上記全部まとめてできる
編集をする際は、細かい部分はこちらで調整し、最後は直接指定で小数部分をきれいにしたりすると良いかと思います。
方法1: ボーンの中にCubeを入れる
ボーンの中にCubeを入れて、ボーンを変形させると、追従することが確認できます。
今回はこちらの方法は使用しません。
方法2: Constraint特性で結合する
Constraintは簡単に言えば磁石のようなものだと思っていただければよいです。
CubeにParent Constraintの特性を追加します。
Sourcesにくっつけたい物体を指定し、(今回はArmのボーン)
Is Active にチェックを入れて有効化します。
実はこの状態でHierarchyのボーンを動かしてもConstraintが動いているのかは確認できません。
確認するためにはゲームを起動させる必要があります。
ゲームを起動するのは上の再生ボタンです。
- ゲーム開始、停止
- 一時停止
- 一時停止中、1frameずつ進める
ゲーム中に毎frame磁石の力が働くので、Cubeがくっついていることが確認できます。
しかし、Scaleは追従してませんね。
それは、Parent ConstraintがPositionとRotationに追従させる特性だからです。
Scaleも追従させたい場合は、Scale Constraintも追加しましょう。
(今回は追加しない)
この時点でお気づきかと思いますが、全部追従してしまう①の方法に対して、追従する箇所を選べる②の方法は圧倒的に応用性が高いです。
Constraintはいくつか種類があります。Parent Constraint はPosition Constraint と Rotation Constraintを一つにまとめて動作を軽くした特性になります。
さて、最後にアバターの中にCubeを入れておきましょう。VRChatにアップロードするデータは VRC Avatar Descriptor 特性を持つ物体だからです。
データが無ければ存在しないのと同じですからね。
この状態でアップロードするとCubeが追従しているのが確認できます。
今は腕に追従しているので、くっつけるボーンをHandに変更し、Cubeの座標も手の位置にしておきましょうか。
これで手に持っているように見えるはずです。
鏡なので反転するよー
アニメーションを作成する
さて、いよいよアニメーションを作成していきますが、アニメーションって何なのでしょうか?
覚えていただきたいのが、Unityのアニメーションは、「物体の特性に値を上書きする」ものだということです。
前回のアニメーションでキャラクターに拍手をさせたと思うのですが、あれはボーンのTransform属性の座標と回転を変更することによって表現されています。
つまり、Inspectorの値を書き換えることがアニメーションの本質なのです!
では、実際にアニメーションを作成していきます。
cube_off,cube_onのアニメーションと、例としてnero_FXLayerというアニメーションコントローラを作成します。(前はVRCSDKからActionLayerをコピーしてきましたが、FXLayerのサンプルはないので新規作成です)
作成したFXLayerを選択した状態でAnimatorタブを開きます。
LayersにCubeLayerを追加し、歯車のアイコンからwaightを1にします。
cube_off,cube_onの順にドラッグ&ドロップします。(オレンジの矢印がOffに行くようにしたい)
ちなみにオレンジの矢印はEntryで右クリックをして引き直す項目があるので、そちらでOffに行くように設定できればいいです。
これが、前回解説していなかったもう一つのStateを増やす方法です。
では、アニメーションに特性を変化させるKeyを打っていきます。
Action Controller をアバターのAnimator Compornent内のControllerに指定します。
Animationタブを開きます。
InspectorでAnimator Compornentを所持している物体を選択すると、AnimatorタブとAnimationタブがそれぞれ、Animator CompornentのControllerに指定されているAnimationControllerに紐づけされます。
画像で説明すると、1を選択状態にすることで、2に設定しているControllerを3,4で編集することが可能になります。
キーを打つ
方法は簡単です。Animationで編集したい項目を選択してから録画を開始し、Inspectorの値を変更するだけです。
- 編集したいアニメーションを選択(編集対象がnero_0.0.0、編集先のControllerがFXLayerになっているのでFXLayerの全Stateに設定されているアニメーションが一覧で表示される)
- Key録画開始
- アニメーションで操作する物体選択
- ActiveをOffにする
- CubeのActiveをOffにするKeyが生成される
- Key録画終了
ちなみに、④のActiveについてですが、こちらをOffにすると「自身のTransform以外のすべての特性を無効化し、自身の階層下オブジェクトのTransform以外のすべての特性を無効化」する効果があります。
つまり、MeshRendererが無効化されるのでコンピューターにMeshの形を描く命令が飛ばなくなります。
結果、Cubeが描かれないため表示されないのです。ConstraintはActiveになったときに手の座標までワープする感じになりますね。
ワープするのが一瞬見えてしまうのが嫌だという方は、Mesh RendererのActiveを切る方法でアニメーションを作成しても大丈夫です。
しかし、物体自体のActiveを切ってしまったほうが、表示していないときの処理が軽くなるのでお勧めです。
そしたらOnのアニメーションを作成しましょう。
上記と同じ方法でKeyを設定する方法でもよいのですが、OffのKeyを選択(青色になる)して、ctrl+c(コピー)して編集対象をOnのアニメーションに変更し、1frame目にctrl+v(ペースト)してActiveをonにする方が楽です。
アニメーションコントローラーの設定(前回解説したのでわかるはず。boolは0か1のフラグでしたね)
- Parametersタブにフラグをboolで追加
- フラグ名はなんでもよいが、とりあえずCubeにする
- MakeTransitionで結ぶ
- MakeTransitionで結ぶ
- off -> onの矢印を選択
- Has Exit Time無し
- フラグをtrueで追加
- on -> off の矢印選択
- Has Exit Time無し
- フラグをfalseで追加
- offのStateを選択
- Write Defaultsをoffにする
- onのStateを選択
- Write Defaultsをoffにする
Write Defaultsについて
現在のバージョンではVRChat公式が非推奨と言っているのでoffにしましょう。Write Defaultsがどういうものか知りたい方は調べてみてください。
動作確認
キャラのAnimator特性にControllerが設定されている場合、Animatorタブのコントローラーは紐づいているので、Gameを開始することで実際のアニメーション遷移を確認することができます。
Gameを開始し、Parametersの値を変化させることでアニメーションの遷移が行われて、Cubeの表示がOn,Offされていることが確認できます。
アニメーションコントローラーを外す
編集が終わったのでAnimatorのControllerはNoneにしましょう。右側のボタンで直接指定できるのでNoneを選択します。
次は、VRChatからアニメーション操作をするための処理を追加します。
動作確認が正しく動いていた場合、ここが間違っているか、アップロードのデータに含まれていない(キャラの中にCubeを入れていない)ことが多いので確認してください。
Parameterの追加
Addから追加
Menuの追加
On,Offを制御したいのでToggleを追加
アップロード
完成です!
Cubeを取り出すことができました!
取り出すものを好きな物体に変更する
Cubeの代わりに好きなオブジェクトで同じ方法を試してみるのもよし、Cubeの中に好きなものを追加して、CubeのTransform以外の特性を削除するのもよし
ActionLayerのアニメーションを見てみる
ここまでの説明でアニメーションで何をやっているかが分かったはずなので、怖くないですね。
ControllerにActionLayerを設定して、拍手のアニメーションを見てみましょう。
Animatorコンポーネントの値を書き換えてるだけでした。全部ボーンに関するパラメータですね。
Animator特性について
自分もあまり詳しくないので、なんとなくの雰囲気ですが以下のような感じです。
(Humanoidとは何ぞやとかになるので、詳しく知りたい方はこちらを参照
Unity Humanoid Avatarの解説 [VirtualCast]
)
1.Game中、ControllerのアニメーションをAvaterに適用する。
2.Game中、Avatar(大抵はFBXファイル)の設定を使用してアニメーションに存在する設定値でTransformの値を上書きする。
最後に
お疲れ様でした。
ただCubeを表示するだけなのに教えておきたいことが多すぎて意外と大変でした。
次は色を変化させるアニメーションを作成できたらなと思っています。
tksp-unityroom.hatenablog.com
VRChatアバターにアニメーションを大量に設定するのに必要な知識とか機能のまとめ[VRChatアバター改変のすすめ その1]
はじめに
こんにちは。
VRChatを始めて2ヶ月くらいのTKSPです。
初心者の人たちと話す機会が増えて意外とUnity難しい、分からないという話を聞くので、アバター作成に覚えておくと便利なUnityの機能をざっくりと解説しながら、改変例を紹介していきたいなと考えております。
なんとなくで書いているので間違っている部分もあるかと思いますが、UnityでのアニメーションがVRChat上でどのように作用してアバターが動いているのか全体の雰囲気をなんとなく感じ取ってもらえれば幸いです。
今回はアニメーションを設定する方法の解説をしていきたいと思います。デスクトップでアバターを動かしている人たちは必見です。
アバターアップロードの手順は省きますので別の方の記事を参照してください。
note.com
本記事ではUnity 2019.4.31f1を使用します。
こちらのページを確認し、現在のVRChatに合わせたバージョンで作成するようにしてください。
Unityのインストール
こちらのページからダウンロード、インストール、UnityIDの登録を済ませておいてください。
unity3d.com
VRChat SDK のダウンロード
こちらからDownload SDK3 - Avatars をダウンロードしてください
https://vrchat.com/home/download
UnityのVRChatアバター作成に必要なタブ
Unityを起動するといろいろなタブが出てきますが、大雑把に説明します。
Hierarchy
現在のシーンに置かれている物体の一覧が表示される
物体をクリックするとその物体が選択され、一部のタブで操作が可能になる(操作できるタブに関しては後述)
Scene
現在開いているシーンが表示される。
Asset Store
ゲームを作るための素材の購入やダウンロードができる。
素材をVRChatに持っていくためには改変が必要なケースが多いため、VRChat初心者にはお勧めしません。Boothを使用しましょう。
Project
現在のプロジェクトに入っている素材一覧です。
Game
基本使用しないです。(アバターのアップロード時には使用する)
アニメーションやパーティクルを作成中で動作確認をする場合などに使用します。
正しく動くかをアップロード前に確認したりできますが、説明が大変なので省きます。
Inspector
Hierarchyで選択した物体の特性を表示、編集します。
Console
エラーや、開発者用のメモを表示したりするところです。
テキストが赤くならなければ気にする必要はほとんどありません。
Animation
Hierarchyで選択した物体か、Projectで選択したアニメーションの作成、編集を行う場所。
Animator
Hierarchyで選択した物体か、Projectで選択したアニメーションコントローラーの編集を行う場所。
Unityをカスタマイズする
これらのタブはドラッグで自分の好きな位置に移動したり、塊から外して別窓で表示できます。
別窓表示時に誤って消してしまった場合は、メニューにあるWindowから探すことで表示させることが可能です。
よく使うショートカット(覚えておくと便利)
Hierarchyの物体を選択している状態で「ctrl + c 」(コントロールキーを押しながらCキーを押す)コピー
「ctrl + v 」ペースト
「ctrl + z」操作を一つ巻き戻す
「ctrl + y」巻き戻した操作を元に戻す
Hierarchyの何もない場所をクリックした後に 「ctrl + s」 シーンを保存する
Hierarchyの物体やProject内の素材を選択している状態で「F2」 名前の変更
Hierarchyの物体やProject内の素材を選択している状態で「ctrl + d」 複製
VRCSDKのインポート
先ほどダウンロードしたVRChat SDK(VRCSDK3-AVATAR-2021.09.30.16.19_Public.unitypackage)をUnityを開いている状態でダブルクリックします。
すると、以下のようなウィンドウが表示されるのでImportします。
Importが終わるとProjectにVRC SDKが導入され、メニューにVRChat SDK と表示されるようになります。
アバターのインポート
次にアバターを導入します。
Dynamic Bone所持済みの方は先にインポートしておいてください。
VRCSDKと同様に.unitypackageがあると思うので導入してください。
無い場合はProjectでAssetsフォルダを選択した状態で右クリックし、Createから作業用のフォルダを作成します。
その中に.fbxやテクスチャなどをドラッグ&ドロップすれば素材として追加することができます。
今回はネロちゃんを使用します。
booth.pm
改変なしでアップロードする場合は多くの場合は.prefabがあると思うのでそちらをHierarchyにドラッグ&ドロップし、メニューのVRChat SDK -> Show Control Panelから表示されるタブからログインしてBuilderタブのBuild & Publish for Windowsからアップロードできるかと思います。
インポートすると.fbxがあると思うのでそれをHierarchyにドラッグ&ドロップします。
すると、Scene画面にオブジェクトが表示されます。
Scene画面の覚えておくと便利な操作方法
Hierarchyに配置した物体を選択するとInspectorにその特性((コンポーネント)が表示されます。
Transform
その物体の位置、回転、大きさを制御
Animator
その物体のアニメーションを制御
VRC Avatar Descriptorコンポーネントの追加
ここにAdd Componentからvrcと検索してVRC Avatar Descriptorを追加します。
View PositionのEditを押して目線の高さを調整します。額の高さくらいが良いです。
大抵のアバターはLipSync(口パク設定)をAuto Detect!で自動的に設定できるかと思います。
Eye Look は目の向きとまばたきを制御します。
まず、Transformに目のボーンをHierarchyからドラッグ&ドロップで設定し、Scene画面を見ながらRotation Statesの値を調整します。
EyelibsでBlend Shapesを選択し、顔のメッシュをドラッグ&ドロップします。
Blinkで瞬きのアニメーションを設定したら、自動でまばたきするようになります。
Looking Up と Looking Down は - none - で大丈夫です。
ここまでで、アップロードできる設定までは完了しました。
アニメーションコントローラーを作成する
ProjectからAssets > VRCSDK > Example3 >Animation > Controllers内にあるvrc_AvatarV3ActionLayerを複製(ctrl + d)します。
複製したActionLayerは分かりやすいようにRenameし、作業フォルダの中に入れておきましょう。
名称例 : nero_ActionLayer
作業フォルダ例 : TKSP > Nero > Animation
Animatorタブを開いた状態で先ほど複製したActionLayerを開きます。
Animatorタブの操作や内容
操作方法
Sceneと同じでマウスホイールで拡大縮小、マウスホイールクリック状態でドラッグすると平行移動ができます。
Layersタブ
レイヤーを管理
Paramtersタブ
アニメーションを制御するフラグを管理する。
フラグは、ある条件を達成しているかを管理するものです。
State
アニメーションが設定できるブロック。
Transition
矢印。アニメーションからアニメーションへどのように切り替わるかを制御する。
Stateの追加
2つの方法があります。
何もないとこで右クリック、Create State > Empty
AnimationファイルをProjectからドラッグ&ドロップ(次回の記事で説明すると思います)
Transition の追加
Stateの上で右クリック Make Transition で矢印を伸ばしたいStateをクリック
Transitionの削除
削除したい矢印を選択した状態でInspectorから繋がっているStateを選択し削除
ActionLayerの仕組み
大雑把に解説します。
オレンジ色のStateを選択してください、「WaitForActionOrAFK」
これがスタート位置になります。
InspectorのMotion内にあるファイルをクリックすると、ProjectのAssets > VRCSDK > Example3 > Animation > ProxyAnimが開きます。
そのファイル(.anim)を選択するとInSpectorの画面が変わると思いますが、ここでアニメーションの確認ができます。
デフォルトでは黒い服着た人ですが、Hierarchyに置いてあるモデルをドラッグ&ドロップすることで好きなアバターに切り替えることができます。
オレンジのStateから上に伸びている矢印を選択してください
- 矢印が繋がっているState
- 時間をかけて矢印を通るか(後述します)
- フラグです。この場合、VRCEmoteが1以上8以下でこの矢印を通るとなります。Greaterは「~より大きい」、Lessは「~より小さい」です。
- 後述します。
次にstand_clap_loopの両端の矢印を見てみましょう。
Equalはイコール(等しい)、NotEqualはノットイコール(等しくない)です。
左のフラグがVRCEmoteが2と等しい時、右のフラグがVRCEmoteが2じゃないときに矢印を通るのが確認できます。
VRCEmoteはParamtersタブでフラグとして登録されていますが、VRChatで切り替える方法を解説します。
先ほどアバターに追加したVRC Avatar DescriptorコンポーネントのPlayable Layersに作成したアニメーションコントローラーを設定します。
作業フォルダにExpression ParametersとExpressions Menuを作成します(名前は分かりやすいようにしておくと良いです)
VRC Avatar DescriptorコンポーネントのExpressions に設定します。
下記の画像のように、ExpressionParametersのInspectorを見てみるとすでにいくつか設定されています。
ここに設定されたものをVRChatのメニューから操作できるようになるので、NameとTypeがActionLayerのParamertersタブのものと一致するか確認しましょう。
今回はVRCEmoteを操作したいので一致していて大丈夫そうですね。
- ExpressionParametersを選択
- NameとTypeを確認する
- AnimatorのParametersタブを確認
- Typeの種類はここで確認できます。(Typeの種類は後述します)
- Nameと一致しているのを確認
誤って追加した項目は右クリックでDeleteを表示して削除できます。
Typeの種類
int 整数 0~255までを管理できるフラグ
float 少数 -1.00 ~ 1.00 を0.01刻みで管理できるフラグ
bool 真偽 0(偽)と1(真)を管理できるフラグ(VRChatで制御できるフラグは上限があるので少ない数字で表現できる分岐の場合にコスパがいい)
次にMenuを開きます。
Add Controlsで項目を追加します。
Name に手を合わせると入力します。
TypeをToggleに変更します。
ParameterをVRCEmoteに変更します。ここで設定できる項目はExpressionParametersで設定した項目であることが分かります。
Valueに2を設定します。
この状態でアップロードして動かしてみましょう。
すると、Expressionsに追加したToggleが表示されていることが確認できます。
ToggleはOnの時に設定したパラメータを指定の数字に、Offにしたときに設定したパラメータを0にするメニューです。
つまり、OnでVRCEmoteに2,OffでVRCEmoteに0が設定できました!
さて、ExpressionParametersに設定してはいけないParametersも存在します。
それは既に定義しているパラメーターです。
詳しくはこちらを参照
公式(英語):https://docs.vrchat.com/docs/animator-parameters
翻訳(非公式)
ankoro199.hatenablog.com
こちらはAnimationController(ActionLayer)のParameterに設定しておくことでメニュー以外からの操作ができるパラメーターの一覧になります。
ミュートやAFKになったときに特別なアニメーションをさせることができそうですね!
次に好きなアニメーションを設定してみましょう。
キャラアニメーションはこちらを使用させていただきます。
booth.pm
- アニメーションを変更したいState選択
- StateのMotion欄に再生したいアニメーションを設定
はい、これで拍手のアニメーションが設定したアニメーションで置き換わりました。
Has Exit Time について
次にstand_waveのStateの右矢印を見てみましょう。
stand_clap_loopと違ってVRCEmoteが1じゃないときに矢印を通るフラグが設定されていないことが確認できます。
しかし、Has Exit TimeがOnになっているので、時間の経過で矢印を通るのです。
Settingsの中身を見てみます。
Exit Timeが0.6秒。これは矢印の左接続Stateが開始されてから0.6秒のタイミングで矢印を通ることを指しています。
Transit Duration 0.25秒。これは0.25秒の間、前のStateを混ぜながら次のStateを開始することを指しています。
Transition Offset 0秒 矢印を通るのを開始した際に、次のアニメーションが混ぜられるため開始しているのですが、矢印を通るタイミングでの次のアニメーションの再生位置を指定できます。(前のアニメーションとうまく混ぜられるように設計するため?)
詳しくは公式のリファレンスを参照してください。
アニメーション遷移 - Unity マニュアル
さて、例えば、先ほど設定したEmote2の時と同じようにToggleでメニューを登録してしまうと問題が発生します。
それは、ToggleがOnになっていてもアニメーション終了判定を通ってしまいループしてしまうからです。
- Onになったら通る
- Offになっていなくても0.6秒経過したら通る
このようなときはToggleではなくButtonを使用しましょう。
ボタンは押している間はOn、離している間はOffになります。
つまり、Onの時に設定したパラメータを指定の数字に、Offにしたときに設定したパラメータを0にするメニューです。
OnでVRCEmoteに1,OffでVRCEmoteに0が設定できました!
さて、ここまで来たらアニメーションの設定はなんとなく分かったのではないかと思います。
Stateの追加方法やTransitionの追加方法も途中で紹介していたりするので見落としてなければできるはずです。
しかし、ActionLayerには罠があります。
それはVRCEmoteの9~16は座っているときのパターンで既に使用されているので追加したらうまく動かなくなることです。
上方向のTransitionに17~の矢印を追加するのが正解になります。
Transitionは同じ個所に複数追加することもできるのです。
先ほど、VRCEmoteが1以上8以下の矢印があったと思いますが、同じ矢印に条件を複数設定した場合は条件A,条件Bとすると、積集合A∩Bとなります。(AかつB)
同じ場所、同じ方向に矢印を2本以上引いた場合、それぞれの矢印をCとDとすると、和集合C∪Dとなります。(CまたはD)
Stateをたくさん追加するのが大変だと思ったので17~58を使用できるようにしたActionLayerを用意しておきました。
https://tksp110.booth.pm/items/3323298
さて、こちらにレイヤーはStateを作る際にSub - State Machineを作成しているのですが、これはStateを入れることができるフォルダのようなものです。
Stateが多くなると、矢印がごちゃごちゃしてしまうので、きれいにしたい場合はフォルダ分けしておくと見やすくなります。
こちらをインポートしてアニメーションを設定し、Toggleでそれぞれの番号に合ったメニューを設定しておけばアニメーションを沢山設定できます。
その際、MenuにはToggleやButtonが8個までしか設定できないことが分かるかと思いますが、その場合はメニューを増やします。
ButtonやToogle以外にSub Menuという項目があるので、こちらを選択すると、メニューの中にメニューを作成することができます(つまり無限に増やせる)
EmoteMenu1をドラッグドロップして登録。
登録したメニューをダブルクリックするとそのままそのメニューの設定ができるので覚えておくと便利です。
また、Parameterはメニューが開かれているときにOn、メニューが閉じられたらOffになります。上級者がアニメーションコントローラーを凝るときに使えそうですね!