この記事の3行まとめ
- Unityでスキンメッシュのアニメーション処理をECSによって実装する手法、QualiArtsがブログ記事で解説
- GameObjectベースの実装においてAnimatorなどが暗黙的に担っていた処理を、ECSで置き替える最小限の仕組みを構築する
- 処理に必要となるGameObject側のデータを変換してEntityに渡するといった一連の手順を解説している
QualiArtsは2026年6月30日(火)、『Unity ECSでスキンメッシュをアニメーションさせる』と題した記事を、自社ブログにて公開しました。
Unity上でECS(Entity Component System)を用いてスキンメッシュをアニメーションさせる最低限の処理を実装する手順を解説。これまでAnimatorやAnimator Controllerといったコンポーネントが暗黙的に担っていた処理を、ECSで代替する方法を紹介しています。
なお記事中での実行環境は、Unity 6.5、Entities 6.5.0、Entities Graphics 6.5.0です。
(画像はブログ記事より引用)
ECSとは、実装単位をIDとなる「Entity」、データ構造を定義する「Component」、Component同士の振る舞いを定義する「System」に分離する設計手法。並列処理の活用により、大量のオブジェクトを高速に処理できるといった特徴を持っています。
Unityでは、ECSに基づいた開発を行うための公式パッケージが提供されています。
(画像は「Entities」パッケージの公式ドキュメントより引用)
GameObjectベースでスキンメッシュのアニメーションを実装する場合、Unityでは主にAnimatorやAnimator Controllerを用いた再生手法が採用されます。再生時間を進めて状態遷移を扱い、AnimationClipからボーンの姿勢を評価、それらの情報を元にメッシュをSkinnedMeshRendererへ反映するまでの工程を、システム側が自動で制御するというものです。
記事では、この工程をECS上の「データ」と「System」に分類し、スキンメッシュをアニメーションさせるための最小限の仕組みを構築する流れを解説しています。
(画像はブログ記事より引用)
ECSではGameObjectを直接扱えないことから、情報を扱うにあたり「Baking」と呼ばれる変換処理が必要となります。ランタイムのSystemが直接データを参照するのではなく、必要な情報だけを「Baker」で変換します。
記事では大きく分けて「AnimationClip」「SkinnedMeshRenderer」「サンプリング設定の3つのデータを取得・変換しています。
Authoring ComponentがもつGameObject側の設定を「Baker」が読み取り、ランタイムで扱う「BlobAsset」「DynamicBuffer」「IComponentData」へ変換し、Entityに入力します。
(画像はブログ記事より引用)
実行中に変化しないアニメーションデータ(AnimationClipをECSで扱うにあたり行うサンプリングの間隔や、Clipの長さ、各ボーンにおける時刻ごとのローカル姿勢など)は「BlobAsset」として持たせます。
一方、Clip内の再生時刻や再生速度といった、Entitiyごとに変化する実行時の状態は「IComponentData」として持たせ、Systemで更新します。
またSkinnedMeshRendererから「どのボーンがどの順番でメッシュに対応しているか」といった情報を抽出し、Entityに紐づく配列のようなデータとして保持します。このような可変長データは「DynamicBuffer」で取り扱います。
データの変換に使用したAuthoring Componentの例。それぞれの名前は記事用に整理されている(画像はブログ記事より引用)
最後に、作成したデータを使用して、Systemによる実行時の更新処理を実装します。ここでは「各Entityの再生時間を進める」「ボーンの姿勢を反映する」「描画用のSkinMatrixを更新する」といった処理を行うようにします。
そのほかにも、Componentの処理をECSで実装した例などがコードサンプルとともに紹介されています。
詳細はブログ記事をご確認ください。
Unity ECSでスキンメッシュをアニメーションさせる