プレイヤーやゲーム システムによって服やモデルなどのアピアランスをカスタマイズできるキャラクターを Unreal Engine で作成する際は、Modular Character ブループリント を使ってキャラクターを構築することをお勧めします。
Modular Character ブループリントを使用することで、完全なキャラクターの単一のスケルタルメッシュ モデルをインポートするのではなく、ブループリント ロジックを介してスワップ可能な複数の スケルタルメッシュ アセット を使って、ランタイム時にキャラクターを構築できます。Modular Character ブループリントの使用は、モジュラー アピアランスを含むキャラクターを作成するうえでより柔軟性の高いオプションであり、メッシュ全体をスワッピングするよりも効率よく実行できます。

モジュラー キャラクターの設定メソッド
Unreal Engine ではモジュラー キャラクター システムを設定するメソッドがいくつか用意されており、それぞれのメソッドは異なるプロジェクトのニーズや範囲に対応しています。それぞれのメソッドの簡単な説明と長所/短所については次のとおりです。
-
Set Leader Pose Component (リーダー ポーズ コンポーネントの設定) を使うメソッドでは、スケルタルメッシュ オブジェクトに親スケルタルメッシュ オブジェクトをペアレント化することでキャラクターを構築し、アニメーションをその親で排他的に実行します。このメソッドではすばやい設定が可能ですが、分離されたアニメーション再生や物理レンダリングはサポートしておらず、レンダリング スレッド パフォーマンスの負荷が大きくなる場合があります。Set Leader Pose Component を使ったメソッドは、Unreal Engine で初めてモジュラー キャラクターを設定する場合に適した開始点と言えます。
-
Copy Pose from Mesh (メッシュからポーズをコピー) を使うメソッドは、分離された任意のアニメーション再生に加えて、キャラクターを形成するそれぞれのスケルタルメッシュ オブジェクト上で物理シミュレーションを構築する際に使用できる中間的なソリューションを提供しますが、ゲーム スレッドとレンダリング スレッドの両方におけるプロジェクトの計算プロセスの負荷が最も大きくなります。
-
ランタイム時にスケルタルメッシュ オブジェクトをマージするメソッド では、複数のスケルタルメッシュ オブジェクトを組み合わせて、ランタイム時にキャラクター全体をレンダリングすることで、ゲーム スレッドとレンダリング スレッドの両方で比較的小さなパフォーマンス負荷を伴う最も包括的なソリューションを提供します。ただし、このメソッドの設定には非常に手間がかかり、キャラクターのモーフ ターゲットを活用できないというデメリットも伴います。
次は、それぞれのメソッドの長所と短所、パフォーマンス負荷を示した表です。
リーダー ポーズ コンポーネント | メッシュからポーズをコピー (Copy Pose from Mesh) | スケルタルメッシュをマージ | |
---|---|---|---|
設定コスト | 最小 | 中 | 高 |
ゲーム スレッド負荷 | 最小 | 高 | 中 |
レンダリング スレッド負荷 | 高 | 高 | 低 |
物理 | 無 | AnimDynamics または RigidBody | 有 |
モーフ ターゲット | 有 | 有 | 無 |
前提条件
- 完全なキャラクターを形成する一連のスケルタルメッシュ アセットが必要になります。これらのアセットがない場合は、Unreal Engine マーケットプレイス の [Stylized Character Kit: Casual 01](https://www.unrealengine.com/marketplace/en-US/product/stylized-male-character-kit-casual?sessionInvalidated=true](https://www.unrealengine.com/marketplace/ja/product/stylized-male-character-kit-casual?sessionInvalidated=true) を使用できます。

リーダー ポーズ コンポーネント
Unreal Engine でモジュラー キャラクターを作成するメソッドの一つが リーダー ポーズ コンポーネント システムです。**リーダー ポーズ コンポーネント ブループリント呼び出し可能関数では、スキン メッシュ コンポーネント オブジェクトをリーダー スキン メッシュ コンポーネント オブジェクトの子として設定できます。たとえば、Torso (胴体) をリーダー ポーズ コンポーネントとして定義して、それにアニメーションを割り当てて、そのアニメーションをフォローする足、脚、手、頭をその Torso の子として追加できます。
リーダー ポーズ コンポーネントを使用する場合、子メッシュ オブジェクトは ボーン トランスフォーム バッファ (Bone Transform Buffer) を使用せず、個別にアニメーションも実行しません。子メッシュでは、リーダー ポーズ コンポーネントのボーン トランスフォーム バッファで再生されるアニメーションのみを実行できます。このシステムでは、軽量ながらも制限のあるアタッチメント システムが作成されます。
以下のセクションでは、Unreal Engine でリーダー ポーズ コンポーネントを使ってモジュラー キャラクターを作成する方法を示すワークフロー例に沿って説明します。
リーダー ポーズ コンポーネントを設定する
スケルタルメッシュ アセットを Unreal Engine プロジェクトにインポートした後に、コンテンツ ブラウザ の [+Add (+追加)] をクリックして [Blueprint Class (ブループリント クラス)] を選択し、新しいキャラクター ブループリントを作成します。[Pick Parent Class (親クラスを選択)] ウィンドウで [Character (キャラクター)] クラスを選択します。

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

[Components (コンポーネント)] パネルでそのメッシュ コンポーネントを選択し、[Details (詳細)] パネルの Skeletal Mesh Asset プロパティを使ってスケルタルメッシュを定義します。ゲームの構造によって変化しない、キャラクターの基本コンポーネント (頭など) を選択することが推奨されます。

キャラクターのすべての可視コンポーネントを変更する可能性がある場合は、空のスケルタルメッシュ オブジェクトをルート スケルタルメッシュとして作成し、このオブジェクトを基本アセットとして使用できます。空のスケルタルメッシュ オブジェクトには、ランタイム時に可視化されないごく少数のジオメトリ (それを中心に他の可視メッシュが向きを変えられるもの) を含めることができます。
ビューポート パネルで基本メッシュの位置を調整します。

[Components] パネルでそのメッシュを 右クリック し、オプション メニューから [Duplicate (複製)] を選択します。

複製したメッシュ コンポーネントを [Components] パネルで選択し、[Details] パネルの [Mesh (メッシュ)] セクションにある Skeletal Mesh Asset プロパティで、モジュラー キャラクターの別のセグメントを選択します。このワークフロー例では、胴体 (Torso) の頭のコンポーネントが複製されたメッシュ コンポーネントにスワップされています。

キャラクターのメッシュ コンポーネントが適切にエクスポートされていれば、そのメッシュは ビューポート パネル内で正しい位置にスナップされます。そうならない場合は、メッシュ コンポーネントを手動で揃える必要があります。

対応するメッシュ コンポーネントに一致するように、複製したコンポーネントの 名前を変更 します。

すべてのメッシュ コンポーネントをブループリントに追加し、キャラクターを形成するすべての構成要素が揃うまで、この手順を基本メッシュ コンポーネントから繰り返します。
(convert:false)
すべてのメッシュ コンポーネントをキャラクター ブループリントに追加して、ビューポート パネルでそれらを正しく配置したら、ブループリントの [Construction Script (コンストラクション スクリプト)] パネルを開きます。Construction Script ノードから Set Leader Pose Component ノードを作成します。

ブループリント内に含まれる各メッシュ コンポーネントのインスタンスをそれぞれグラフにドラッグします。

基本メッシュ コンポーネントを Set Leader Pose Component ノードの New leader Bone Component 入力ピンにつなげます。

残りのメッシュ コンポーネントを Set Leader Pose Component ノードの Target 入力ピンにつなげます。

キャラクター ブループリントを保存してコンパイルすると、モジュラー キャラクターが形成されて、プロジェクトに追加したり、アニメートしたり、制御したりできるようになります。

Leader Pose Component ノードを使ったキャラクターでは、ゲーム スレッド におけるキャラクターのパフォーマンス負荷は軽減しますが、レンダリング スレッド におけるキャラクターのレンダリング負荷は軽減されないことに注意してください。キャラクターは依然として同じ数のコンポーネントを個別にレンダリングしますが、コンポーネントに含まれる追加のセクションごとに追加のドロー コールが伴います。
また、リーダー ボーンの子メッシュ オブジェクトは、完全に一致する構造体を含むサブセットである必要があることにも注意してください。他の追加のジョイントを含めたり、ジョイントを省略したりすることはできません。追加のジョイントについてはボーン バッファ データは存在しないため、追加または省略されたジョイントは、参照ポーズを使ってレンダリングされます。
モジュラー キャラクター ブループリント内に含まれる子メッシュ オブジェクトでは、リーダー ポーズ コンポーネントから独立してユニークなアニメーションを実行したり、物理をシミュレートしたりすることはできません。
Copy Pose From Mesh
Unreal Engine でモジュラー キャラクターを構築する別のメソッドとして、Copy Pose from Mesh システムがあります。Copy Pose From Mesh は子メッシュのアニメーション ブループリント内で使用できる AnimGraph ノードで、別のスケルタルメッシュ コンポーネントからアニメーション ポーズをコピーすることができます。Copy Pose From Mesh では一致するボーンのみがコピーされ、それ以外のすべてでは参照ポーズが使用されます。
コピー ポーズ コンポーネントを設定する
スケルタルメッシュ アセットを Unreal Engine プロジェクトにインポートした後にキャラクター ブループリントを作成して、それぞれのメッシュ コンポーネントをブループリントに追加します。

基本メッシュ コンポーネントのアニメーション ブループリントを作成し、それをメッシュ コンポーネントの [Details] パネルで割り当てます。割り当てるには、Animation Mode プロパティを Use Animation Blueprint に設定し、Anim Class プロパティを使ってメイン アニメーション ブループリントを選択します。

このワークフロー例では、モジュラー キャラクター メッシュはテンプレート マネキンのスケルトン アセットを使用しており、サード パーソン テンプレート プロジェクト からの ThirdPerson_AnimBP
アニメーション ブループリントを使用するように割り当てることができます。
このアニメーション ブループリントを割り当てると、基本メッシュ (この例ではキャラクターの頭) がアニメートを開始し、その他のメッシュ コンポーネントはそれぞれの参照ポーズを出力します。

次に、モジュラー キャラクターの残りの子メッシュ コンポーネントのアニメーション ポーズを駆動するアニメーション ブループリント アセットを作成します。これを作成するには、コンテンツ ブラウザ の [+Add (+追加)] をクリックして [Animation (アニメーション)] > [Animation Blueprint (アニメーション ブループリント)] を選択します。次に、モジュラー キャラクターのスケルトン アセットを割り当てます。このワークフロー例では、マネキン キャラクターのスケルトンを使用しています。

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

アニメーション ブループリント内に、基本メッシュ コンポーネントへの参照変数を作成します。参照変数を作成するには、最初に [My Blueprint (マイ ブループリント)] パネルの [Variables (変数)] セクションに、Source Mesh Component
と呼ばれる新しい変数を、[+Add (+追加)] をクリックして [Skeletal Mesh Component (スケルタルメッシュ コンポーネント)] > [Object Reference (オブジェクト参照)] を選択することで作成します。

次に、アニメーション ブループリントの イベント グラフ で Cast to Blueprint ノードを作成して、アニメーション ブループリントをキャラクターのブループリントにリンクします。Try Get Pawn Owner ノードを作成して、その Return Value を Cast to Blueprint ノードの Object 入力ピンにつなげます。Cast to Blueprint ノードの 出力 ピンからドラッグして Get Mesh ノードを作成します。最後に、メッシュ変数の Set Variable ノードを作成して、Get Mesh ノードの 出力 ピンを Set Variable ノードの 入力 ピンにつなげます。

AnimGraph で、Copy Pose From Mesh ノードを作成します。参照変数をグラフに追加して、それを Copy Pose From Mesh ノードの Source Mesh Component 入力ピンにつなげます。最後に、Copy Pose From Mesh ノードの出力ポーズを Output Pose ノードにつなげます。

キャラクター ブループリント内で、新しいアニメーション ブループリントを使ってそれぞれの子メッシュ コンポーネントで実行するよう、それらの子メッシュ コンポーネントをそれぞれ設定します。このアニメーション ブループリントを設定するには、それぞれの子メッシュ コンポーネントを [Components] パネルで選択し、Animation Mode プロパティを Use Animation Blueprint に、Anim Class プロパティを子メッシュ アニメーション ブループリントに設定します。

Copy Pose From Mesh を使って複数のメッシュ コンポーネントにわたるアニメーションを同期する場合は、コピー元のスケルタルメッシュ コンポーネントがすでにティック済みであることを確認してください。そうでない場合は、最後のフレームのアニメーションをコピーすることになります。基本メッシュがティック済みであることを確実にするには、キャラクター ブループリントの [Comments (コメント)] パネルで、それぞれの子メッシュ オブジェクトを基本メッシュ コンポーネントにドラッグすることで、子メッシュ コンポーネントを基本メッシュ コンポーネントにペアレント化できます。

この親子関係は、基本メッシュのティックを子メッシュの評価の前提条件として設定することで、コード内でも設定することができます。詳細については、「ティックの依存関係」 ドキュメントを参照してください。
Copy Pose from Mesh メソッドを使ってモジュラー キャラクターを構築する場合は、それぞれのメッシュ コンポーネントの完全なアニメーション グラフにアクセスできるため、アニメーション再生の分離をより動的に制御できます。さらに、RigidBody または AnimDynamics ノードを使用することで、それぞれのメッシュ コンポーネントのライトの物理シミュレーションを個別に構築することができます。
ただし、Copy Pose From Mesh では、それぞれの子でアニメーション グラフの評価が実行される必要があるため、リーダー ポーズ コンポーネント システムを使用するよりもパフォーマンス負荷が大きくなることに注意してください。
スケルタルメッシュをマージ
Unreal Engine 内でモジュラー キャラクターを作成する際は、Merge Meshes ブループリント関数ノードを使用して、ランタイム時に複数のメッシュを単一のスケルタルメッシュにマージすることもできます。このメソッドでは、スケルタルメッシュの作成にかかる初期パフォーマンス負荷は大きくなりますが、複数ではなく単一のスケルタルメッシュをレンダリングするため、繰り返し発生するレンダリング負荷はその他のメソッドよりも小さくなります。
たとえば、3 つのコンポーネント (頭、ボディ、脚) で構成されるキャラクターが画面上に 50 体ある場合、これは 50 件のドロー コールとなります。スケルタルメッシュをマージしないと、それぞれのコンポーネントでのドロー コールによってキャラクターごとに 3 回の呼び出しが行われるため、合計で 150 件のドロー コールが生じます。
FSkeletalMeshMerge
を使用する場合、マージされたメッシュではメイン メッシュ コンポーネントに設定されたスケルトンのみを使用するため、メイン メッシュ コンポーネントに、キャラクターのアニメーションをすべて備えた完全なスケルトンが含まれている必要があります。特定のボディ部分に追加のジョイントがある場合も、メッシュを適切にマージするには、メイン メッシュ コンポーネントにすべてのアニメーションを含めて、そのコンポーネント上で実行させる必要があります。
また、マージされたメッシュでは同時に 1 つのアニメーションのみが実行されることと、マージされたメッシュへの モーフ ターゲット の転送はサポートされていないことにも留意することが重要です。ただし、FSkeletalMeshMerge::GenerateLODModel
を参照することで、モーフ ターゲットをマージされたスケルタルメッシュに適用するためのワークアラウンドを作成することも可能です。マージされたメッシュがランタイム時に作成された後に、ベース メッシュと任意のモーフとの間の FMorphTargetDelta
を計算することで、モーフ ターゲットを適用することができます。
さらに、FSkeletalMeshMerge
を使用する際は、ほとんどの場合、このメソッドを念頭に置いて、最初からコンテンツをカスタムビルドする必要があります。マージしたキャラクターに 1 つの共通 マテリアル を使用して、テクスチャ の アトラス を決定することを推奨します。こうすることで、テクスチャを切り取ってランタイム時に適用し、マージされたキャラクターを 1 つのメッシュとしてレンダリングするためのより動的なシステムを作成できます。
スケルタルメッシュのマージを設定する
スケルタルメッシュ アセットを Unreal Engine プロジェクトにインポートした後に、Skeletal Merging プラグイン を有効にします。このプラグインを有効にするには、メニュー バー から [Edit (編集)] > [Plugins (プラグイン)] に移動して、[Other (その他)] セクションで Skeletal Merge プラグインを見つけるか、検索バー を使って検索します。**プラグインを有効にしたら、エディタを再起動します。

エディタを再起動したら、コンテンツ ブラウザ の [+Add (+追加)] をクリックして、空のスケルタルメッシュ コンポーネントを含むキャラクター ブループリントを作成します。
次に、Skeletal Mesh Merge Parameters 変数をキャラクター ブループリントに追加します。この変数を作成するには、[My Blueprint (マイ ブループリント)] パネルの [Variables (変数)] セクションに移動して、[+ Add (+ 追加)] をクリックして新しい変数を作成し、その変数タイプを Skeletal Mesh Merge Parameters
変数として定義します。

この ブループリント を 保存 してコンパイルします。
[My Blueprint] パネルで Skeletal Mesh Merge Param 変数を選択し、その [Details] パネルを表示します。Skeleton プロパティを使って、キャラクターのスケルトンを定義します。

これで、Meshes to Merge プロパティの [+Add (+追加)] を使って、マージするメッシュを定義できるようになりました。キャラクターに含まれるそれぞれのメッシュに配列を作成し、それらのメッシュを定義します。

キャラクター ブループリントのイベント グラフ内で、Event Begin Play ノードからメッシュをマージするノードを作成して、Skeletal Mesh Merge Parameter 変数で定義したメッシュをマージできます。

次に、Set Skeletal Mesh Asset ノードを使って、空のスケルタルメッシュ コンポーネントを、生成したマージ済みのメッシュに置き換えることができます。既存のメッシュ ノードをターゲットとして設定し、生成したマージ済みのメッシュを新しいメッシュとして設定します。これで、マージされた新しいメッシュ上で再生されるアニメーションを空のメッシュ オブジェクト上で再生できます。

マージされたメッシュ ブループリントをレベルに追加して、アニメーションを再生するスケルタルメッシュ全体をリアルタイムで確認できます。

マージされたメッシュがカプセル コンポーネントと適切に揃っていない場合は、キャラクター ブループリントの ビューポート パネルで空のスケルタルメッシュ コンポーネントを移動することで、その位置を調整できます。
Skeletal Mesh Merge Parameter のリファレンス
次の表では、Skeletal Mesh Merge Parameter 変数の各プロパティとそれらの機能について説明します。
プロパティ | 説明 |
---|---|
Mesh Section Mappings | ソース メッシュのセクションを、マージされたセクション エントリにマッピングするための任意の配列です。 |
UVTransforms Per Mesh | 各メッシュ内の UV の変換に使用する任意の配列です。 |
Meshes to Merge | マージされるスケルタルメッシュです。 |
Strip Top LODs | 入力メッシュから削除するトップ LOD の数です。 |
Needs Cpu Access | パーティクル エフェクトのスポーンなどの理由で、マージ後のメッシュへの CPU によるアクセスが必要かどうかを設定します。 |
Skeleton Before | スケルトンの更新をマージ前またはマージ後に行うかを設定します (スケルトンを提供する必要があります)。 |
Skeleton | マージされたメッシュで使用されるスケルトンです。このプロパティを空にすると、マージされたメッシュで使用されるスケルトンを生成することができます。 |