TKSPのUnity関連ブログ

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

VRChatでキャラの色を動的に変えるアニメーションを作成する[VRChatアバター改変のすすめ その3]

髪の毛の色を動的に変える

髪の毛の色を変えるためにまず、素材を準備していきます。

白い髪の毛テクスチャを用意する

使用しているアバターの髪の毛のテクスチャが存在すると思うので、そちらをデスクトップにドラッグ&ドロップでコピーできます。
f:id:ymtkyorosiku:20211004192225p:plain
その後、コピーしたテクスチャを右クリックし、プログラムから開くでフォトを開きます。
f:id:ymtkyorosiku:20211004193921p:plain
編集と作成メニューから、編集、調整で色を一番左にして保存します。
f:id:ymtkyorosiku:20211004192655p:plain
f:id:ymtkyorosiku:20211004192834g:plain
これを画像が白っぽくなるまで繰り返します。
完成した白黒(灰?)画像を作業フォルダに(Textureフォルダとか作っておくといいかも)入れます。
f:id:ymtkyorosiku:20211004192736p:plain

マテリアルを用意する

元のアバターのMaterialを探します。
マテリアルには、Mesh Rendererがコンピューターに描いて欲しい材質の情報が詰まっています。(金属?木材?光る?透明?などの情報)
f:id:ymtkyorosiku:20211004193322p:plain
①をクリックすると、対象のマテリアルがProjectに表示されると思うので、それをctrl + dで複製し、F2で名称を変更します。(自分はnero_hair_matにしました)
f:id:ymtkyorosiku:20211004193346p:plain
①をクリックして見つからない場合は自分で探してください。この場合、Element 0に入っている「tex2」の文字を入力すると引っ掛かります。
(Project内の素材が多すぎると①をクリックしても自動で移動しないことがあります)

f:id:ymtkyorosiku:20211004193614p:plain
見つからない場合は絞り込み

複製したマテリアルを、作業フォルダに移動させてください。
f:id:ymtkyorosiku:20211004194304p:plain

マテリアルに画像を適用する

f:id:ymtkyorosiku:20211004195039p:plain
f:id:ymtkyorosiku:20211004195049p:plain

  1. マテリアルを選択
  2. インスペクターを固定
  3. テクスチャを設定
  4. 人によってテクスチャを入れる場所、量が変化します。ネロちゃんはUnityちゃんToonシェーダーでした。
  5. インスペクターの固定を解除(2の逆)
マテリアルをアバターに適用する。

2つ方法があります。どちらもやっていることは同じです。お好きな方で。

  1. Mesh rendererで適用する
  2. Scene画面で適用する

f:id:ymtkyorosiku:20211004195621j:plain

この子の場合はしっぽと耳も同じマテリアルなので変えておきます。

アニメーションファイルを作成する

作業フォルダにHairColorフォルダを作成し、color_red,color_blue,color_greenのアニメーションを作成します。
f:id:ymtkyorosiku:20211004200321p:plain

f:id:ymtkyorosiku:20211004200352p:plain
ctrl+dで複製
f:id:ymtkyorosiku:20211004200419p:plain
F2でRename

BlendTreeファイルを作成する

普通はコントローラー上で直接作成するのですが、コピーができたほうが、後ほどいろいろとはかどるのでSDKからコピーします。
vrc_CrouchingLocomotionを複製し、名称をhair_colorに変更して、作業フォルダに移動してください。
f:id:ymtkyorosiku:20211004201044p:plain
f:id:ymtkyorosiku:20211004201110p:plain
コピーしたブレンドツリーの項目をすべて削除します。

f:id:ymtkyorosiku:20211004201254p:plain

  1. 選択
  2. 選択
  3. 削除(大丈夫か聞かれるのでDeleateを押す)
  4. 削除を繰り返す

全部消すと以下のようになります。

f:id:ymtkyorosiku:20211004201621p:plain

FXLayerを編集する

前回作成したFXLayerにHairColorLayerを追加し、歯車マークからWaightを1にします。
f:id:ymtkyorosiku:20211004201611p:plain
ParametersにfloatでHairColorを追加します。
f:id:ymtkyorosiku:20211004201701p:plain

先ほど作成したBlend Treeを初期Stateとして登録します。
f:id:ymtkyorosiku:20211004201947p:plain

  1. hairColorLayerを選択
  2. hair_colorをドラッグ&ドロップ
  3. stateを選択
  4. Write Defaultsを外す

ブレンドツリーの設定を行う

f:id:ymtkyorosiku:20211004202315p:plain

  1. 1Dに変更
  2. HairColorに変更 -> FXLayerで指定したfloatのパラメータが表示される
  3. Listに3つ追加

Motionに先ほど作成したアニメーションを設定します。
f:id:ymtkyorosiku:20211004202606p:plain

Thresholdを0~1にします。
f:id:ymtkyorosiku:20211004211915j:plain

これで、HairColorが0の時はred,0.5の時はblue,1の時は緑になります。
また、FXLayerにblend Treeが登録されているので、そこに設定されているアニメーションも編集できるようになります。

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

前回の復習です。
最初に、アバターのアニメーションを編集できるようにコントローラーに登録してから、編集したいアニメーションを選択し、録画ボタンです。
f:id:ymtkyorosiku:20211004202946p:plain

髪の毛のオブジェクトを選択し、Mesh Renderer のMaterial色を変更します。
この際、Projectのフォルダにある素材の方を直接触らないように注意してください。
今回は髪の毛だけを変えるため、しっぽや耳の色は同じ素材を使用していますが、変化していないことが確認できるかと思います。

f:id:ymtkyorosiku:20211004203929g:plain

HairについているSkind Mesh Rendererの色を赤に変更するKeyが打てていることが確認できます。
f:id:ymtkyorosiku:20211004204047p:plain

前回書きましたが、大事なことなのでもう一度書きます。
Unityのアニメーションは、「物体の特性に値を上書きする」だけです。
f:id:ymtkyorosiku:20211004211353p:plain
やってることが分かれば何も怖くない。

同様にblueとgreenも作成します。
録画で作成しても良いですが、単純なキーなのでコピペして編集でも大丈夫です。
f:id:ymtkyorosiku:20211004213917g:plain

動作確認

f:id:ymtkyorosiku:20211004212822p:plain
f:id:ymtkyorosiku:20211004212832p:plain
f:id:ymtkyorosiku:20211004212840p:plain

  1. アバターを選択
  2. Game開始
  3. 再生されていることを確認し、ダブルクリックで中へ移動
  4. 選択
  5. 赤い矢印をドラッグ
  6. 色が変わっていることを確認
  7. HairColorが0~1で変化していることを確認
  8. Game終了

色が変わりました!
BlendTreeがrgbを混ぜてくれています。
今回はアニメーションの配置が等間隔(0, 0.5, 1)だったので、赤と青の中間の場合は(r,g,b,a)=(0.5, 0.5, 0, 1)になるため、紫になります。
f:id:ymtkyorosiku:20211004213852g:plain
欲しい色があったら0~1の範囲で後で追加しましょう。

動作確認が済んだらControllerは外しましょう。
f:id:ymtkyorosiku:20211004214452p:plain

VRChatで動かすための準備

いつものやつです。
動作することは確認したので後はVRChatで動くようにするだけです。今回で三回目ですね。

Expression ParameterにHairColorを登録
f:id:ymtkyorosiku:20211004214504p:plain

Menuに登録
f:id:ymtkyorosiku:20211004214559j:plain
Radial Puppetについては後で解説します。
Paramater Rotationの方にHairColorを設定してください

アップロード

Materialの変更で赤いエラーが出ていた場合は(赤いエラーだけ)Auto Fixしてください。
f:id:ymtkyorosiku:20211004215025p:plain
動いた!
f:id:ymtkyorosiku:20211004220501g:plain

Radial Puppetについて

Paramater スティックメニューを開いている間はOn(1),閉じている間はOff(0)
Paramater Rotation 0~1の範囲で0.01刻みに値を変更する(0%~100%)

耳の色も変更する

HairColorFolderと同じ場所にEarColorフォルダを作成します。
f:id:ymtkyorosiku:20211004220945p:plain

次にHairColorFolderの中身を複製するのですが、下記の方法で複数選択した後にctrl + dで複製を行うと簡単です。

複数選択方法

複数選択の方法は2つあるので使い分けてください。

ctrlを押しながらクリックで複数選択-> 間をあけることができる。

f:id:ymtkyorosiku:20211004221410g:plain
ctrlで一つずつ選択

Shiftを押しながら対象の範囲の上部分と下部分を順番にクリック -> 一度にたくさん選択できる

f:id:ymtkyorosiku:20211004221651g:plain
Shiftで一気に選択

また、ctrlの方法は既に選択しているものを選択から外すことが可能なため、Shiftで選択してから、いらない部分をctrlで外すなどの合わせ技ができます。

Hairと同じような状態にする

ctrl + d で複製
複数選択した状態で選択されている素材の一つをドラッグ&ドロップすると一緒に移動できます。便利。
f:id:ymtkyorosiku:20211004222236p:plain

アニメーション名が被ってしまうので「部位_色」に変更します。
名称変更はF2ですね。Earも対応しましょう。
f:id:ymtkyorosiku:20211004222717p:plain
f:id:ymtkyorosiku:20211004222725p:plain

earのblend treeに紐づいているアニメーションを修正します。
f:id:ymtkyorosiku:20211004222930p:plain

Hairでやったことと同じようなことをやる。
f:id:ymtkyorosiku:20211004223820p:plain
f:id:ymtkyorosiku:20211004223827p:plain
f:id:ymtkyorosiku:20211004224133p:plain
f:id:ymtkyorosiku:20211004224541p:plain
f:id:ymtkyorosiku:20211004225309p:plain
f:id:ymtkyorosiku:20211004225317p:plain
f:id:ymtkyorosiku:20211004225737p:plain
f:id:ymtkyorosiku:20211004225957p:plain
f:id:ymtkyorosiku:20211004230102p:plain
f:id:ymtkyorosiku:20211004230703p:plain

  1. Layere追加
  2. Weight変更
  3. Parameters追加
  4. Blend Treeをドラッグ&ドロップ
  5. State選択
  6. Write defaults を切る
  7. controller設定
  8. earのアニメーションを編集してるか確認
  9. コピペしたのでearのキーが全部hairになっているため削除(一番上のキーが全体になるので、右クリックからDelete Keys)
  10. 録画ボタンとかを駆使して耳の色が変わるアニメーションキーを打つ(さっき髪でやった)
  11. プレビューで確認可能
  12. 色が変わってるか確認
  13. プレビューOffの時
  14. 元に戻ってるか確認
  15. 青と緑も作る
  16. controller外す
  17. Expression Parameters登録
  18. Menuに登録
  19. 忘れてました。Blend Treeに紐づいているパラメータ変更

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

X軸とY軸を持つBlend Tree

Blend Treeの作成

しっぽの色を変更するアニメーションを例に説明します。
VRChatのfloatの範囲は-1.00~1.00なのですが、そちら活用する方法の一例です。
f:id:ymtkyorosiku:20211004235608p:plain
2D Freefrom Directional の Blend Treeを作成します。
これは、X軸とY軸を-1.00~1.00の範囲で持つBlend Treeです。
今回は黒と白のアニメーションも作成し、いい感じの位置に置いて動作確認をしました。
f:id:ymtkyorosiku:20211004234648g:plain
きれいに混ざりましたね。
本来は色を混ぜるために使うものではないです。
この方法では一部の色が表現できません。(黄色とか)
また、余分にパラメータを消費します。
パラメータに余裕のない方や、指定した色だけで変更したい方は 1D のBlendTreeにたくさんの色変更アニメーションを登録した方が良いです。
パラメータを余分に使っていいという方は、こちらの方法でアニメーション作成の手間を省くことができます。

VRChatで表示

いつも通りのパラメータ追加
f:id:ymtkyorosiku:20211004234017p:plain

Two Axis Puppetを選択
f:id:ymtkyorosiku:20211004234050p:plain

Two Axis Puppetの説明

Parameter 開いてるときOn(1),閉じているときOff(0)
Parameter Horizontal 横に-1.00~1.00の範囲で変化させる
Parameter Vertical 縦に-1.00~1.00の範囲で変化させる

アップロードして確認

自由に色を変更することができますね。
f:id:ymtkyorosiku:20211005000412g:plain

f:id:ymtkyorosiku:20211005000052p:plain
決定したときにxとyの値が固定される

このメニューを、別のことに応用できないかを模索してみてください。
ちなみにデフォルトのLocomotionLayerではアバターの移動方向をX(左右),Z(前後)として、移動方向のアニメーションを混ぜて表現しているみたいです。
f:id:ymtkyorosiku:20211005001648p:plain

終わりに

以上、キャラの色を動的に変えるアニメーションの作成方法の解説でした。

次はWorldにオブジェクトを配置するギミックの作成をしてみたいなと考えています。
頑張って土曜日までには投稿したいです。