ご挨拶
はいどうも
自分のアバターをアニメーションで動かしたいと思ってくる。思うよね?
ということで今回はアニメーション人形を作りましょう。
※アバターの改変やストアに公開すると2次配布に当たる可能性があるため、
作成には規約の確認と自己責任でお願いします。
○環境
今回はUnity2022.3.22f1、UniVRM0.124、UniVCI42.1で作成。
最近気がついたけどUniVRMはちゃんと指定したバージョンを使おうね!
ちゃんと依存関係があるのでコンソールに色々とエラーメッセージが表示されちゃうぞ。
(何回かやった)
必須ではないけど追加設定
アニメーションのデータなどはデフォルトではテキスト形式で保存されます。
そのため、モーションデータからのアニメーションを作成するとデータ量が大きくなり
読込みに凄い時間が掛かります。
「編集」→「プロジェクト設定」から、
エディター「アセットのシリアル化」から「ForceBinary」を選びましょう。
データがバイナリかされるので色々と捗ります。
○下準備
②ヒエラルキーより「アニメーション人形」等の名前を付け、
「VCI Object」をアタッチし、VCIとして必要な情報を色々と入力しましょう。
③「アニメーション人形」の下に「sab_item」を作成し、
アバターを貼り付け「doll」とでもしましょう。
(スクショ撮るとき名前間違えてるけど)
④念のため、アバターが入っている「doll」を右クリックし、
「プレハブ」→「全てを展開」をしておきましょう。
⑤「sab_item」で「VCI Sub Item」をアタッチし、必要な情報を入力しましょう。
(重力OFF、キネマティックONは忘れがち)
その後「Box Collder」をアタッチし、コライダーサイズを設定しましょう。
ルームなどで接触判定が不要ならトリガーをONにしましょう。
⑥インポートしたアバターはTポーズしているので、
アームの角度を60度/-60度にしておきましょう。
※アバターによって構成は違います。
○瞬きアニメーションの作成
①「アニメーション人形」を選択し、
「アニメーション」タブから「作成」をクリックしましょう。
③「プロパティを追加」をクリックし、「sub_item」→「doll」→
「Body」→「SkinnedMeshRenderer」からシェイプキー右にある「+」を
クリックしましょう。
※アバターによって構成は違います。
④10フレーム目にBlink(とついでに耳)のシェイプキーを100にしましょう。
20フレーム目にBlink(とついでに耳)のシェイプキーを0にしましょう。
1:00の所にあるキーを右クリックし、「キーを削除」をクリックし、
不要な設定を削除しましょう。
※エディター上では60fpsで動作するため、20フレーム目がおよそ0.167秒です。
タイムラインが「0:20」と書いていても20秒とは限らないので注意しましょう。
○腕ふりアニメーションの作成
①「アニメーション人形」が選択されている状態から、
「アニメーション」タブより▽から「新しいクリップを作成」をクリックし
適当に「udefuri」とまて保存しょう。
②「プロパティを追加」をクリックし、
「sub_item」→「doll」→「Amature」→「Hips」→「Spine」→「Chest」→
「Neck」→「Transform」→「回転」を追加しましょう。
そんな感じに「arm」「elbow」「wrist」を追加しましょう
※アバターによって構成は違います。
③20フレーム目に「Neck」10「arm」 60「elbow」 20「wrist」10と設定し、
40フレーム目に「Neck」 5「arm」 30「elbow」-10「wrist」-5と設定し、
60フレーム目に「Neck」10「arm」 60「elbow」 20「wrist」10と設定し、
80フレーム目に「Neck」 0「arm」-60「elbow」 0「wrist」 0と設定しましょう。
④ボーンを右クリックし、「補完」から「クォータニオン」を選びましょう。
これを全てのオブジェクトに対して行います(忘れがち)。
○確認作業
①「アニメーション人形」のアニメーションコントローラーが作成されているので
「アニメーション人形」ダブルクリックし、
「blink」と「udefuri」の2つ登録されていることを確認しましょう。
②「アニメーション人形」に「Animator」が自動でアタッチされ、
コントローラーに「アニメーション人形」が登録されていることを確認しましょう。
○プログラム
適当にプログラムを書いて
--変数セット
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
○最後に
自分でアニメーションをポチポチするほか、
公開されているモーションデータをレコーディングすることも出来ます。
Takiさんのルームで勉強することが出来るのでご紹介までに。
後言い忘れてたけど、
オブジェクトの名前とか変更するとアニメーションが参照できなくなるので注意。