キャラクターの群衆用のアニメーション システムを作成する際は、Animation Sharing プラグイン を使うことでプロジェクトのパフォーマンス負荷を大幅に削減することができます。レベル内のそれぞれのキャラクターの アニメーション ブループリント を個別に評価するのではなく、一度の評価から得たアニメーションを多くのキャラクター間で共有することで、100 体のキャラクターから 1000 体のキャラクターの差によってパフォーマンス負荷の増加を最小限に抑えるシステムとなります。
Animation Sharing では、 Leader Pose (リーダー ポーズ) コンポーネント システム を利用することで、アニメーションが評価される一連のアニメーション ステート バケットを使用します。結果のポーズは、バケットの一部であるすべての子コンポーネントに転送されます。その後、ブレンディングと再生位置のランダム化技法を実装して、群衆のアニメーションの再生にさらなる多様性を持たせることができます。

次の図では、含まれるコンポーネントを示す番号付きの説明を通じてこのシステムの仕組みの概要を説明します。

-
個々の群衆アクタ (AActor)
-
Animation Sharing Setup の一部である
UAnimationStateProcessor
インスタンス -
Animation Sharing Setup を使用して初期化されたランタイム マネージャー
-
ユーザーが設定したステート (列挙型)
-
スケルタルメッシュ コンポーネントの形式を取るステートのランタイム表現
-
アニメーションを子スケルタルメッシュ コンポーネントと共有するために使用されるマスター ポーズ コンポーネント システム
前提条件
- Animation Sharing プラグイン を有効にする。メニュー バー から [Edit (編集)] > [Plugins (プラグイン)] に移動して、[Animation (アニメーション)] セクションで Animation Sharing プラグインを見つけるか、検索バー を使って検索します。プラグインを 有効 にしてエディタを再起動します。

-
1 体の群衆スケルタルメッシュ キャラクター。
-
キャラクターで再生する一連のアニメーション。
Animation Sharing を設定する
Animation Sharing プラグインをインストールしたら、Animation Sharing Setup アセットを作成します。新しいアセットを作成するには、コンテンツ ブラウザ の [+ Add (+ 追加)] をクリックして、[Animation (アニメーション)] > [Advanced (詳細設定)] > [Animation Sharing Setup] に移動します。

Animation Sharing Setup アセットには、指定されたアクタ間で共有されるすべての情報が含まれています。

Animation Sharing Setup アセットを開いて、[Detail (詳細)] パネルでそのプロパティを表示します。

スケルトンの設定 (Skeleton Setups)
Animation Sharing Setup アセットの Skeleton Setups プロパティでは、複数のスケルトンを対応するプロパティとともに割り当てて、アニメーション システムを共有するメッシュを定義できます。これは、アニメーションの共有中にアニメーションによって制御される複数のスケルタルとスケルタルメッシュがある場合に便利です。配列は Skeleton Setups プロパティの プラス記号 (+) を使って追加できます。

次の表では、Skeleton Setups でアセットに配列を追加した際に利用可能になる各プロパティとそれらの機能について説明します。
プロパティ | 説明 |
---|---|
Skeleton | レプリケートされるスケルトン アセット。Animation Sharing Setup は指定したスケルトンに固有のものです。 |
Skeletal Mesh | レプリケートされるスケルタルメッシュ。これはポーズのデバッグのみに使用されます。 |
Animation Blueprint for Blending | AnimSharingTransitionInstance の子であるアニメーション ブループリント。ステート間のブレンドを処理するには、これらのいずれかを作成して設定する必要があります。さらに、ブレンドが必要になるたびに、これらのうちの 1 つが生成されて実行され、トランジションを処理するための負荷がかかります。 |
Animation Blueprint for Additive Animation | 加算アニメーションに使用される AnimSharingAdditiveInstance の子であるアニメーション ブループリント。Animation Sharing Setup アセット内で Animation State を On Demand に設定して、Additive オプションを有効にする必要もあります。 |
State Processor Class | アクタがどのステートにあるかを判断するときに使用するインターフェース クラス。アニメーション ステートを追加するには、このクラスを設定する必要があります。 |
Animation States | これは、アクタが存在する可能性のあるすべてのステートを保持する配列です。各ステートはそれ自身のバケットです。 |
Skeleton プロパティと Skeletal Mesh プロパティを使用して、アニメーションを共有するスケルトン アセットとスケルタルメッシュ アセットをそれぞれ定義します。

アニメーション ステート列挙型 (Animation State Enumeration)
群衆キャラクターのポーズを選択するには、Animation Sharing Setup アセットでアニメーション ステートを選択する Enumeration アセット を作成する必要があります。Enumeration アセットを作成するには、コンテンツ ブラウザ の [+ Add (+ 追加)] をクリックして [Blueprints (ブループリント)] > [Enumeration (列挙型)] を選択します。

Enumeration アセットに 名前 を付けて 開きます。

次に、[+ Add Enumerator (+ 列挙子を追加)] ボタンをクリックして、それぞれの Display Name プロパティに定義を入力します。このワークフロー例では、Idle
アニメーションと Run
アニメーション用の 2 つの列挙子が作成されています。

Animation Sharing キャラクターのブループリント
群衆キャラクターを表現するキャラクター ブループリントを作成します。コンテンツ ブラウザの [+ Add (+ 追加)] をクリックして、[Blueprint Class (ブループリント クラス)]> [Character (キャラクター)] を選択します。

群衆キャラクター ブループリントに 名前 を付けて 開きます。

Skeletal Mesh Asset プロパティのドロップダウンを使ってキャラクターのメッシュを割り当てます。

このキャラクター ブループリントの イベント グラフ で、Enumeration アセットのステートを変数またはゲームプレイ ステートに基づいて設定するロジックを構築できます。このワークフロー例では、Enum ステートの変更にキー押下関数の Keyboard Event 5 が使用されています。

Event Begin Play ノードのロジックに Get Animation Sharing Manager ノードを作成します。次に Register Actor を作成して、Sharing Manager ノードの Return Value ピンを Register Actor ノードの Target ピンにつなげます。Self 参照変数を作成して In Actor ピンにつなげます。最後に、キャラクターのスケルトンを Sharing Skeleton として設定します。

Animation Sharing State Processor
AnimationSharingStateProcessor
クラスは、Enumeration アセットを使ってどのアニメーションを再生するかを制御するために、Animation Sharing Setup アセットのアニメーション ステートを設定する際に使用できる特殊なブループリント クラスです。
AnimationSharingStateProcessor
ブループリントを新しく作成するには、コンテンツ ブラウザ の [+ Add (+ 追加)] をクリックして [Blueprint Class (ブループリント クラス)] を選択します。

検索バー を使って AnimationSharingStateProcessor
クラスを見つけて選択し、[Select (選択)] ボタンをクリックします。

このブループリントに 名前 を付けて、ブループリント エディタ で開きます。

Animation Sharing State Processor ブループリントは、プロトタイプ作成のみに使用してください。ブループリント実装とは対照的に、ネイティブ実装を使用することでランタイムのパフォーマンスが大幅に向上します。
ブループリントの [Class Defaults (クラスのデフォルト)] パネルで [Animation State Enum] のドロップダウン メニューを開き、目的の Enumeration アセットを選択します。

Enumeration アセットを追加したら、Animation Sharing State Processor ブループリントの 2 つの オーバーライド関数 を使って、選択したアニメーションを群衆キャラクター間で参照して実行できます。

- Process Actor State 関数を使って、Sharing Animation キャラクターのブループリントと Enum アセットのステートを参照できます。

- Enum クラスを返すために、Animation Sharing State Processor のネイティブ実装とのインターフェースとして Get Animation State Enum を使用します。
Animation Sharing State Processor ブループリントを作成したら、それを Animation Sharing Setup アセットの State Processor Class プロパティに割り当てることができます。

アニメーション ステート (Animation States)
Animation Sharing State Processor ブループリントを Animation Sharing Setup アセットに割り当てたら、Animation States プロパティの プラス記号 (+) をクリックして、State プロパティのドロップダウン メニューで Enum の値を選択することで、アニメーション ステート配列を作成できます。

それぞれのアニメーション ステート配列で、再生するアニメーション シーケンスを定義するために、プラス記号 (+) を使って Animation Setups 配列を追加します。

次の表では、アニメーション ステート配列の各プロパティとそれらの機能について説明します。
プロパティ | 説明 |
---|---|
State | ドロップダウン メニューを使って、どの Enumeration ステートでアニメーション ステート配列を有効にするかを定義します。利用可能なオプションは、割り当てた Animation State Processor の Animation State Enum プロパティに応じて継承されます。 |
Animation Setups | ここでは、再生するアニメーション シーケンスや適用するランダム化などの Animation States プロパティを設定できます。Animation States プロパティに加えたそれぞれの Animation Setups 配列では、次のプロパティが利用可能になります。
|
On Demand | 有効な場合はこのステートが オンデマンド として分類されて、必要に応じてユニークなアニメーションを開始できます。これによって、オンデマンド アニメーションごとにユニークなインスタンスが生み出されます。最大値に達すると、最も近いアニメーションにスナップします。 |
Additive | 有効な場合は、ステートが 加算 アニメーション ステートになります。On Demand も有効に設定している必要があります。また、ブレンドを処理するために Additive Animation ブループリント が必要になります。 |
Blend Time | ステートにブレンドするときのブレンドの長さを設定できます。 |
Maximum Number Of Concurrent Instances | ステートに対して作成されるインスタンスの数 (プラットフォーム固有)。 |
Requires Curves | 有効な場合は、このアニメーション ステートをフォロワー コンポーネントで正しく機能させるために、カーブまたはモーフ ターゲットが必要になります。 |
スケーラビリティ設定 (Scalability Settings)
Animation Sharing Setup アセットのプロパティの [Scalability Setting (スケーラビリティ設定)] セクションでは、膨大な数のアクタ間でアニメーションを共有する方法を定義します。

次の表では、Scalability Settings の各プロパティとそれらの機能について説明します。
プロパティ | 説明 |
---|---|
Use Blend Transitions | 有効な場合は、アニメーションによってあるステートから別のステートに遷移するためのブレンドが再生されます。 |
Blend Significance Value | 遷移をブレンドするかどうかに関連する重要度の値を設定できます。「0」の値では重要度がまったく考慮されず、「1」の値では重要度が最初に考慮されます。 |
Maximum Number Concurrent Blends | 同時に実行可能なブレンドの数を設定できます。この制限を超えている各アニメーションは最も近いものにスナップします。 |
Tick Significance Value | Significance Manager で使用される値を設定できます。指定した値を超えるものはティックされません。 |
アニメーション ブループリントの設定
アニメーション ステート間のブレンドを処理するには、現在のアクティブなポーズ From Component
と、Animation Sharing システムに入力されるポーズ To Component
を参照して、アニメーション ブループリントを設定する必要があります。これには、Anim Sharing Transition Instance と呼ばれるアニメーション ブループリントの特殊なクラスが必要になります。アニメーション ブループリントを作成するには、コンテンツ ブラウザ で [Animation (アニメーション)] > [Animation Blueprint (アニメーション ブループリント)] を選択します。

キャラクターのスケルトンを選択して、AnimSharingTransitionInstance
をこのアニメーション ブループリントのクラスとして定義して [Create (作成)] をクリックします。

このアセットに 名前 を付けて開きます。

Sharing Transition アニメーション ブループリントの AnimGraph 内を右クリックして、「From Component」トランジション変数を検索します。次に Copy Pose From Mesh ノードを作成して、From Component の出力をつなげます。Blend Poses by bool ノードを作成して、その True Pose 入力ピンに Copy Pose From Mesh ノードの出力をつなげます。

グラフ内を右クリックして「To Component」トランジション変数を検索します。次に Copy Pose From Mesh ノードを作成して、To Component の出力をつなげます。Copy Pose From Mesh ノードの出力を Blend Poses by bool ノードの False Pose 入力ピンにつなげます。

グラフ内を右クリックして「Blend Bool」トランジション変数を検索し、それを Blend Poses by bool ノードの Active Value 入力ピンにつなげます。再びグラフ内を右クリックして、Animation Sharing Setup アセットの Blend Time プロパティを参照するための「Blend Time」変数を検索して作成し、それを True Blend Time ピンと False Blend Time ピンにつなげます。次に、Blend Poses by bool ノードの出力を Output Pose ノードにつなげます。

Sharing Transition State アニメーション ブループリントを Animation Sharing Setup アセットに加えます。

これで、複数のキャラクターでアニメーションを共有する場合にアニメーションの再生を遷移できるようになりました。
Anim Sharing Additive Instance
加算アニメーションを使用する場合は、共有加算アニメーションを処理するためのアニメーション ブループリントを設定する必要があります。これには、AnimSharingAdditiveInstance
クラスと呼ばれるアニメーション ブループリントの特殊なクラスが必要になります。
加算アニメーションとしてマークするには、各加算アニメーションのアニメーション ステート配列に含まれる Animation Sharing Setup アセットの On Demand と Additive プロパティを有効にする必要があります。

Additive Animation Sharing アニメーション ブループリントを作成するには、コンテンツ ブラウザ で [Animation (アニメーション)] > [Animation Blueprint (アニメーション ブループリント)] を選択します。

キャラクターのスケルトンを選択して、AnimSharingAdditiveInstance
をこのアニメーション ブループリントのクラスとして定義して [Create (作成)] をクリックします。

このアセットに 名前 を付けて 開きます。

Addictive Animation ブループリントの AnimGraph 内を右クリックして Base Component 加算変数を作成します。Base Component 変数から Copy Pose From Mesh ノードを作成して、Base Component 変数をつなげて、Copy Pose From Mesh の出力を Apply Mesh Space Additive ノードにつなげます。

再び AnimGraph を右クリックして Sequence Player ノードを作成します。その Sequence Player ノードを選択して、[Details (詳細)] パネルの Sequence プロパティで Expose As Pin を選択することで、その Sequence プロパティをピンとしてグラフ内に公開します。

AnimGraph 内を右クリックして Additive Animation 加算変数を作成し、それを Sequence Player ノードの Sequence ピンにつなげます。次に Sequence Player ノードの出力を Apply Mesh Space Additive ノードの Additive ピンにつなげます。最後に、Apply Mesh Space Additive ノードの出力を Output Pose ノードにつなげます。

Additive Animation ブループリントを Animation Sharing Setup アセットに追加できます。

これで、共有アニメーションを加算アニメーションとしてブレンドできるようになりました。
Anim Sharing State Instance
共有アニメーションをキャラクター間で実行するには、Anim Sharing State Instance アニメーション ブループリント クラスを使用できます。Anim Sharing State アニメーション ブループリントを使用すると、AnimBP 動作を加えて、次の 2 つのプロパティをデフォルトで公開できます。
-
Animation to Play
-
Permutation Time Offset
Anim Sharing アニメーション ブループリントを作成するには、コンテンツ ブラウザの [+ Add (+ 追加)] を使って [Animation (アニメーション)] > [Animation Blueprint (アニメーション)] 選択して、新しいアニメーション ブループリント アセットを作成します。

スケルトン アセットを選択してドロップダウン メニューから AnimSharingStateInstance
クラスを選び、[Create (作成)] をクリックします。

このアニメーション ブループリントに 名前 を付けて開きます。

AnimGraph 内を右クリックして Sequence Player ノードを作成します。Sequence Player ノードの [Details (詳細)] パネルで、Sequence プロパティと Start Position プロパティのピン タイプのドロップダウン メニューから Expose As Pin を選択することで、それらのプロパティをピンとしてグラフ内に公開します。グラフ内を右クリックして Animation to Play アニメーション共有変数を作成し、それを Sequence Player ノードの Sequence ピンにつなげます。

グラフ内を右クリックして Permutation Time Offset アニメーション共有変数を作成し、それを Sequence Player ノードの Start Position ピンにつなげます。最後に、Sequence Player ノードの出力を Output Pose ノードにつなげます。

Animation Sharing Instance のグラフのネイティブ実装では、このステートによって現在制御されているすべての AActor(s)
を返す GetInstancedActors
が公開されます。これにより、既存のすべての Notifies が適切に処理されて、ユニークなそれぞれのインスタンスに継承されることが確実になります。
これは、HandleNotify をオーバーライドして、それに従って処理することで達成されます。
Animation Sharing Setup アセット内の、アニメーション再生オフセットをランダム化するそれぞれのアニメーション ステートで、そのブループリント プロパティに Animation Sharing アニメーション ブループリントを割り当てます。次に、Num Randomized Instances プロパティの値を設定します。

Animation Sharing Manager
Animation Sharing をランタイムで実行できるようにするには、キャラクターまたはレベル ブループリント内の Animation Sharing Setup アセットをポイントする Animation Sharing Manager ノードを作成する必要があります。Animation Sharing Manager ノードを作成したら、グラフ内のドロップダウン メニューを使って Animation Sharing Setup アセットを定義します。このワークフロー例では、Create Animation Sharing Manager ノードがレベル ブループリントに追加されています。

次の表では、Animation Sharing Manager ノードをターゲットとする呼び出し可能な追加の関数と、それらの機能について説明します。
関数 | 説明 |
---|---|
Animation Sharing Enabled | アニメーション共有が有効かどうかを返します。 |
Get Animation Sharing Manager | Animation Sharing Manager を返します (何も設定されていない場合は「null」を返します) 。 |
Register Actor | 指定の共有スケルトンに従って、アクタを Animation Sharing Manager に登録します。 |
これで、群衆キャラクターをレベルに追加して、アニメーション ステートが変わる際のアニメーション再生を監視できるようになりました。
Animation Sharing デバッグ
プレイ イン エディタ (PIE) シミュレーション時には、便利なビューポート デバッグ レンダリング機能を有効にして、Animation Sharing プラグインが機能する様子や、アニメーションが選択される方法を確認できます。

次の表では、Animation Sharing システムを Unreal Engine でデバッグする際に使用できる一連のコンソール コマンドについて説明します。
コマンド | 説明 |
---|---|
a.Sharing.ToggleVisibility |
Leader Pose コンポーネントの可視性を切り替えます。デバッグ レンダリングは、レベルの原点 (0, 0, 0) に配置されます。アニメーションを共有するキャラクターは、アクティブ ポーズを使用している場合は 緑色 で、ブレンドしている場合は 青色 でレンダリングされます。非アクティブなポーズは 赤色 のポーズになります。マゼンタ色 の線は、キャラクターが共有しているアクティブなポーズをポイントします。 |
a.Sharing.ScalibilityPlatform |
プラットフォームごとのスケーラビリティ設定を取得する際に、どのプラットフォームを使用するかを制御します。 |
a.Sharing.Enabled |
Animation Sharing システムを有効にするかどうかを切り替えます。0 ではシステムが無効になり、1 では有効になります。 |
a.Sharing.DebugStates |
デバッグ レンダリングで表示されるアニメーション ステートの数を切り替えます。このコマンドに与えられた値により、レンダリングするデバッグ ステートの数が設定されます。 |