0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アニメーションするVCIを作ろう

Last updated at Posted at 2024-12-01

ご挨拶

はいどうも
自分のアバターをアニメーションで動かしたいと思ってくる。思うよね?
ということで今回はアニメーション人形を作りましょう。

※アバターの改変やストアに公開すると2次配布に当たる可能性があるため、
 作成には規約の確認と自己責任でお願いします。

○環境

今回はUnity2022.3.22f1、UniVRM0.124、UniVCI42.1で作成。
最近気がついたけどUniVRMはちゃんと指定したバージョンを使おうね!
ちゃんと依存関係があるのでコンソールに色々とエラーメッセージが表示されちゃうぞ。
(何回かやった)

必須ではないけど追加設定

アニメーションのデータなどはデフォルトではテキスト形式で保存されます。
そのため、モーションデータからのアニメーションを作成するとデータ量が大きくなり
読込みに凄い時間が掛かります。

「編集」→「プロジェクト設定」から、
エディター「アセットのシリアル化」から「ForceBinary」を選びましょう。
データがバイナリかされるので色々と捗ります。
1.jpg

2.jpg

○下準備

①VRMをインポートしましょう。
3.jpg

②ヒエラルキーより「アニメーション人形」等の名前を付け、
 「VCI Object」をアタッチし、VCIとして必要な情報を色々と入力しましょう。
4.jpg

③「アニメーション人形」の下に「sab_item」を作成し、
 アバターを貼り付け「doll」とでもしましょう。
 (スクショ撮るとき名前間違えてるけど)

5.jpg

④念のため、アバターが入っている「doll」を右クリックし、
 「プレハブ」→「全てを展開」をしておきましょう。
6.jpg

⑤「sab_item」で「VCI Sub Item」をアタッチし、必要な情報を入力しましょう。
 (重力OFF、キネマティックONは忘れがち)
 その後「Box Collder」をアタッチし、コライダーサイズを設定しましょう。
 ルームなどで接触判定が不要ならトリガーをONにしましょう。
7.jpg

⑥インポートしたアバターはTポーズしているので、
 アームの角度を60度/-60度にしておきましょう。
 ※アバターによって構成は違います。
7-1.jpg

○瞬きアニメーションの作成

①「アニメーション人形」を選択し、
 「アニメーション」タブから「作成」をクリックしましょう。
9.jpg

アニメーション」のタブがない場合 「ウィンドウ」→「アニメーション」→「アニメーション」をクリックしましょう。

--.jpg

②瞬きをさせたいので、「blink」として保存しましょう。
10.jpg

③「プロパティを追加」をクリックし、「sub_item」→「doll」→
 「Body」→「SkinnedMeshRenderer」からシェイプキー右にある「+」を
  クリックしましょう。
 ※アバターによって構成は違います。
10-1.jpg

④10フレーム目にBlink(とついでに耳)のシェイプキーを100にしましょう。
12.jpg

 20フレーム目にBlink(とついでに耳)のシェイプキーを0にしましょう。
13.jpg

 1:00の所にあるキーを右クリックし、「キーを削除」をクリックし、
 不要な設定を削除しましょう。
14.jpg

※エディター上では60fpsで動作するため、20フレーム目がおよそ0.167秒です。
タイムラインが「0:20」と書いていても20秒とは限らないので注意しましょう。

○腕ふりアニメーションの作成

①「アニメーション人形」が選択されている状態から、
 「アニメーション」タブより▽から「新しいクリップを作成」をクリックし
 適当に「udefuri」とまて保存しょう。
15.jpg

②「プロパティを追加」をクリックし、
 「sub_item」→「doll」→「Amature」→「Hips」→「Spine」→「Chest」→
 「Neck」→「Transform」→「回転」を追加しましょう。 
16.jpg

そんな感じに「arm」「elbow」「wrist」を追加しましょう
※アバターによって構成は違います。

17.jpg

③20フレーム目に「Neck」10「arm」 60「elbow」 20「wrist」10と設定し、
18.jpg

 40フレーム目に「Neck」 5「arm」 30「elbow」-10「wrist」-5と設定し、
19.jpg

 60フレーム目に「Neck」10「arm」 60「elbow」 20「wrist」10と設定し、
20.jpg

 80フレーム目に「Neck」 0「arm」-60「elbow」 0「wrist」 0と設定しましょう。
21.jpg

④ボーンを右クリックし、「補完」から「クォータニオン」を選びましょう。
 これを全てのオブジェクトに対して行います(忘れがち)。
22.jpg

○確認作業

①「アニメーション人形」のアニメーションコントローラーが作成されているので
 「アニメーション人形」ダブルクリックし、
 「blink」と「udefuri」の2つ登録されていることを確認しましょう。
23.jpg

②「アニメーション人形」に「Animator」が自動でアタッチされ、
 コントローラーに「アニメーション人形」が登録されていることを確認しましょう。
24.jpg

○プログラム

適当にプログラムを書いて

 --変数セット
math.randomseed (os.time())
local AnimeTime_Offset=math.random(5,50)/10 --ランダム数値を5~50の範囲を生成して1/10にして0.5~5秒を作る
local AnimeTime=AnimeTime_Offset+os.time()  --次回アニメーション動作時刻を作る
local frame_step=10 --10フレーム毎に処理するよう変数を設定する

function update()
   if vci.me.FrameCount %frame_step ==0 then   --frame_stepに設定したフレーム毎に処理を行う
       if os.time()>=AnimeTime then            --現在時刻がAnimeTimeで設定した時刻を超えたなら
           if math.random(0,10)>=9 then        --ランダム数値を0~10の範囲で生成して判定する
               vci.assets._ALL_PlayAnimationFromName('udefuri', false) --9を超えたら腕を振る
               AnimeTime_Offset=math.random(15,50)/10  --腕振りアニメーションは1.1秒程度あるので、1.5秒~5秒を作る
           else
               vci.assets._ALL_PlayAnimationFromName('blink', false)   --9を超えたら腕を振る
               AnimeTime_Offset=math.random(5,50)/10   --瞬きは一瞬なので再び0.5~5秒を作る
           end
           AnimeTime=AnimeTime_Offset+os.time()  --次回アニメーション動作時刻を作る
       end
   end
end

はいかわいい
2024113023282873.gif

○最後に

自分でアニメーションをポチポチするほか、
公開されているモーションデータをレコーディングすることも出来ます。
Takiさんのルームで勉強することが出来るのでご紹介までに。
2024-12-01 01-15-40.gif

後言い忘れてたけど、
オブジェクトの名前とか変更するとアニメーションが参照できなくなるので注意。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?