こんにちはっ🌟八ツ橋まろんです
Unityで3Dライブを作る際に、大量の観客を描画&アニメーションできるシステムを作ったのでその紹介です。
根底にある技術は『GPU ECS Animation Baker』アセットです。(URP/HDRP用)
Unityを使って大量のキャラクターをアニメーションさせたいとき、Skinned Meshの数(*1)がボトルネックとなり、ハイエンドPCで上手くやりくりしても3000体くらいが限界という記事を書きました。
*1 メッシュの変形による頂点位置の計算(スキニング)の処理が重い
これに対し、シェーダーアニメーション(*2)を使うことでスキニング処理を無くして、さらにECS(*3)を使って大量のオブジェクトを高速に扱えるのがGPU ECS Animation Bakerです。
*2 アニメーションをテクスチャデータに変換し、シェーダーの処理で頂点位置を計算してアニメーションする手法
*3 ECS(Entity Component System)は説明難しいので各自調べてね
GPU ECS Animation Bakerを使うと、スキニング処理がないおかげで処理がとても軽く、数千体以上のキャラクターを容易く描画&アニメーションできます。
通常、Unityではオブジェクトが数千個もあるとエディタの動作がとても重くなるのですが、GPU ECS Animation Bakerはシーン再生時のみ動作し、ECSによって大量のキャラクターを生成するため、動作が軽くなっています。
[GPU ECS Animation Bakerのサンプルシーン]
GPU ECS Animation Baker自体は
・ECSを使った大量のオブジェクト生成&描画
・シェーダーアニメーションを使った大量アニメーション
を提供してくれるのみです。(これ以上ないくらい十分ですが)
そのため、3Dライブを作るための"観客としての機能"は自分でスクリプトを書いて開発する必要があります。
例えば、
・観客の出現位置
・観客のモーション
・Timelineによるアニメーション制御
・サイリウムの色調整
などなど。
これらを手軽に制御できるように、ECSとGPU ECS Animation Bakerと格闘しながら観客システムを作りました。
特徴は以下の通りです
・観客数の制御
列数×行数で観客の数を指定できます。下の画像では30×30で900人います。
・テクスチャで出現位置や高さの制御
マスクテクスチャによって出現位置や高さを調整できます。下の画像ではドーナツ形に出現させて、後ろに行くほど高さが上がっています。
・方向の指定
ワールドの座標を指定して、その位置を向いた状態で出現します。下の画像では中央を向いた状態に配置されています。
・Timelineで観客のアニメーション制御、サイリウムの色制御
Timelineを使って観客のアニメーションをシームレスに変更できます。何秒かけて遷移するか、どのアニメーションに遷移するか、アニメーションの再生速度、再生オフセットなど、秒数や係数をMax/Minで指定して、キャラクター毎にランダムな秒数・係数で遷移します。
また、サイリウムの色もTimelineから変更できます。
・基本のアニメーションと観客モデル
観客のローポリモデル(△250)と、アニメーション14種類を作りました。
なぜこれほどローポリにしているのかというと、スキニングによる処理負荷の問題が解決した状態では、FPS低下の原因がポリゴン数になるからです。1万ポリゴンを1万体出すと1億ポリゴンになるので、さすがにFPSが下がります。下の画像ではカメラに映っているのは6000万ポリゴンで、46FPSまで落ちています。
ということで、GPU ECS Animation Bakerの紹介と、それを使った観客システムの紹介でした。
観客システムはこちらで支援者限定で配布しているので、ぜひお試しください
(利用規約はこちら)
、、、と言いたいところなのですが、GPU ECS Animation Bakerと、それに関わるパッケージの導入、SubSceneの使い方など、煩雑な問い合わせが予想されるため、対応に使う時間を考慮して1万円プランの設定にしています。
導入したい人は、プラン加入の上DMいただければ説明しますのでご連絡ください。
それではっ🌟