概要

このドキュメントでは、Unreal 4 EngineでCreatureランタイムを使用する方法について説明します。ランタイムの言語はC++です。書き出したJSONファイルを読み込んでシーンで再生する方法の例を説明します。

Unreal EngineでCreatureの使用

チュートリアル動画

Unreal

こちらをクリックして、CreatureとUnreal Engineとの統合に関する概要をご覧ください。このチュートリアルでは、CreatureMeshComponentフレームワークを紹介する新しいCreature UE4プラグインと、アニメーションの状態をスイッチするために使用されるBlueprint関数を使用しています。Creature UE4プラグインを初めてお使いの方は、このチュートリアル動画をご覧ください。

Unreal

こちらをクリックして、Creatureランタイムプラグインと、アニメーションセットを切り替えたり、キャラクタのボーンに従うコライダーオブジェクトを設定したりできるBlueprints関数の詳細に関するチュートリアル動画がご覧になれます。

Unreal

こちらをクリックして、複数のアニメーションを含む完全なドラゴンキャラクターがUE4に持ち込まれ、ビジュアルスクリプトシステム「Blueprints」およびCreature UE4プラグインを使用してどのように駆動されるかについての詳しいチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、Mac上でCreatureプラグインを設定する方法のチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、ランタイムイメージ/領域スワップと、あなたのゲーム内でのアンカーポイントの使用方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、ゲーム内でLive 2 Bone IK Posing機能を使用する方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、CreatureからエクスポートされたキャラクターをAnimated Mesh Region Orderingと一緒に再生する方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、UE4のSplineコンポーネントを使用してパスを作成し、それをキャラクターのモーションパスとして使用するためにCreatureにインポートする方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、CreatureのAlembic Exportオプションを使用してキャラクターをAlembicファイルとしてエクスポートし、それをUE4に持ち込む方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、足跡・特定のアニメーションフレームでのパーティクルを生成するCreatureプラグイン内のFrame Callback Triggers機能を使用する方法についてのチュートリアル動画をご覧になれます。

Unreal

こちらをクリックして、CreatureツールのEvent Authoring Editorを使用して、Frame Callback Triggersを作成する方法についてのチュートリアル動画をご覧になれます。エクスポートされたイベントトリガは、UE4から読み込むことができます。このチュートリアルでは、以前のチュートリアルを補完して、UE4の外部、CreatueのEditorからイベント作成を行う方法を示しています。

ランタイムを取得する

ランタイムをCreatureのGame Runtimesウィンドウから直接ダウンロードするか、リポジトリ(こちら)から取得することができます。あなたのカスタムエンジンでは、コアCreatureランタイムライブラリファイルを含むUE4ランタイムを取得する必要があります。

Unreal EngineでCreatureアニメーションを再生するさまざまな方法

方法1

1)あなたのUE4プロジェクトディレクトリ内にPluginsフォルダを作成します

2)githubリポジトリから、Creature_UE4/CreatureEditorAndPluginに移動します。

3)CreaturePluginディレクトリをゲームプロジェクトのPluginsディレクトリにコピーします。

4).uprojectファイルを右クリックし、Visual Studioプロジェクトを更新するためにUnreal Project Filesを生成します。

5)Visual Studioでプロジェクトをコンパイルして実行します。

方法2

ボーンモーターアニメーションのみを扱う場合は、キャラクターをFBXまたはAlembic形式にエクスポートし、Unreal Engineで通常のFBXまたはAlembicアニメーションとしてインポートしてください。

UE4 Creatureランタイムの使い方

UE4 Creatureランタイムを使う方法は2つあります:

1)CreatureMeshComponent.として空のアクターオブジェクトを作成し、それから再生のためにCreatureMeshComponentに追加します。

2)CreatureActorオブジェクトを作成し、それを再生に使用します。

UE4 CreatureランタイムをCreatureMeshComponentとして使用する

これは、UE4 Creatureランタイムを使用する新しい方法です。これに関連する概念は、CreatureActorの使用法と非常によく似ています。詳細については、CreatureActorの使用法をお読みください。

このセクションでは、Creatureアニメーション再生用に空のアクターを設定する方法について説明します:

1)empty Actorを作成します

2)Blueprintsオブジェクトに変換します

3)Blueprint Editorを開き、コンポーネントを追加します

4)BlueprintsにCreatureMeshComponentオブジェクトを追加する

5)CreatureMeshComponentのコントロールはCreatureActorのコントロールと同じなので、詳細はCreatureActorのセクションをお読みください。

CreatureMeshComponentおよびCollectionClips

CollectionClipsのコンセプトは、エクスポートされた異なるJSONファイルにある複数のアニメーションを1つの巨大なクリップとして再生することを基本としています。

これにより、異なるリグとテクスチャでアニメーションを組み合わせることができ、異なるリグでテクスチャ表現が必要な状況で非常に強力なツールになります。CollectionClipsとその背後にあるコンセプトについての詳細は、複数キャラクターアニメーションの結合のセクションで説明しています。

CollectionClipsの使用に必要な手順は次のとおりです:

1)あなたのアセットパネル内で Right-Click -> Others -> CreatureAnimationAsset をクリックします。

2)あなたのjsonファイルを選択するようウィンドウが現れます。

3)作成したCreatureAniamationAssetでキャラクターの素材を Collection Material slot. にドラッグします。

結合したいjsonファイルの数と同じ数のCreatureAnimationAssetsを作成する必要があります。

次:

1)もう一度、Right-Click -> Creature -> Creature Animation Clips Storeを行います

2)Creature Animation Clip Storeをダブルクリックすると、新しいパネルが表示されます。

3)今度は、Clip List配列を埋めます。

Clip List配列を埋めるには:

1)最初に+(プラスサイン)をクリックして新しい要素を追加します。

2)結合したクリップに新しいクリップ名を付けます(例:MyCombinedClip

3)Shot Clip List配列で、作成したいクリップの実際の組み合わせを追加します。

Shot Clip Listを埋める:

1)+(プラスサイン)をクリックして新しい項目を追加します。

2)最初にSource Assetを選択します。これらは前に作成したCreatureAnimatioAssetsです。

3)その項目に実際のアニメーション名を入力します。これはjsonファイルのアニメーションクリップの実際の名前です。

Shot Clip Listには、作成する必要がある数の項目を追加します。

最後に、Blueprintsエディタで、Enable Collection Clipにチェックを入れ、コレクションクリップの機能を有効にします。 SetBluePrintActiveCollectionClip関数を呼び出すことで、再生するコレクションクリップを指定することができます。

CreatureMeshComponentでの新しいCreatureAssetの使用

CreatureMeshComponentは、アニメーションをランタイムに読み込む方法であるCreatureAssetと連動します。

CreatureAssetを作成するには:

1)Content Browserで右クリックします

2)Misc -> CreatureAnimationAssetに移動してアセットを作成します

3)エクスポートしたCreature JSONファイルを選択します

CreatureMeshComponentに移動し、CreatureAnimationAssetスロットを新しく作成したアセットに指定すると、完了です。

UE4 CreatureランタイムをCreatureActorとして使用する

UE4 Creature Runtimeの主なコンセプトは、ACreatureActorクラスを中心に展開されています。これは、あなたのCreatureアニメーションを再生するためにUE4シーンに追加するクラスです。

ACreatureActorヘッダーファイルを見て、以下のプロパティ/関数に注意してください:

基本プロパティ

  • creature_filename: あなたのCreatureキャラクターのJSONファイルを指すエディター内で設定できる文字列です

  • animation_speed: ゲーム実行時にアニメーションが再生される速度を決定します。デフォルト値は1.0で、それが通常の速度となります。アニメーションを2倍速で実行するには、この値を2.0に設定します

  • start animation name: 再生を開始するときに開始するアニメーションの名前。

  • smooth_transitions: これをtrueに設定すると、Blueprints関数SetBluePrintBlendActiveAnimationを使ってスムーズな遷移が可能になります。これをTrueに設定する際、アニメーションを設定するためにSetBluePrintBlendActiveAnimation()を使用しなければなりません。

  • bone data length factor: これはGetBluePrintBoneXform機能と共に使用されます。添付のボーンコライダーの出力変換を拡大/縮小、長さを変更します。あなたのキャラクターのスケルトンにボーンコライダーを合わせる際、この値を使って調整してみてください。

  • bone data size: これはGetBluePrintBoneXform機能と共に使用されます。これは、添付のボーンコライダーの出力変換を拡大/縮小、高さを変更します。あなたのキャラクターのスケルトンにボーンコライダーを合わせる際、この値を使って調整してみてください。。

  • region overlap z delta: この変数は、キャラクタ内のすべてのリージョン/レイヤーにzオフセット値を追加します。3Dエンジンで2Dアセットを作成するためにこれは必要となります。あなたのリグのすべての新しい領域にこのz delta値が追加されます。この変数には正または負の小さな値を設定する必要があります(0.01または-0.01)。カメラがどこにあるか、またはキャラクターが向いている場所に応じて、正または負の値を選択します。例えば、キャラクターが左から右(通常180度の回転)に切り替わる場合、レイヤー/リージョンが正しい順序でレンダリングされるように、この値を反転または無効にする必要があります。

  • animation frame: この変数は、再生中の現在のアニメーションフレームを返します

デバッグ/描画の問題

あなたのキャラクターが何の理由もなく消えてしまう経験をしましたか?キャラクターのアニメーション再生に問題がありますか?いくつかのデバッグのために以下の変数を試してみてください:

  • creature_debug_draw: あなたのキャラクターのワイヤーフレーム境界領域をレンダリングします

  • creature bounds scale: あなたのキャラクターの境界領域を拡大/縮小します。この値を大きくして、キャラクターがレンダリングエンジンによって選択されないようにします

  • creature bounds offset: 境界領域をオフセットするベクトル値を置く理由は、あなたのパイプラインセットアップを二重に変換するために、キャラクターの中心になっていないあるからです

最後に、Settings->Renderinに移動し、オクルージョンカリングをオフにします。

アニメーション関数

  • SetBluePrintActiveAnimation(AnimationName): これは指定されたアニメーション名で呼び出すことができるBlueprints関数です。この関数を呼び出すと、指定した名前の新しいアニメーションに切り替わります。

  • SetBluePrintBlendActiveAnimation(AnimationName, Delta): これは指定されたアニメーション名で呼び出すことができるBlueprints関数です。この関数を呼び出すことで、キャラクターをスムーズな遷移で指定された名前の新しいアニメーションに切り替えることができます。2番目のパラメータは、現在のアニメーションが次のアニメーションにどのくらい速く移行するかを示しています。デルタに0<値<1を設定します。

  • SetBluePrintAnimationCustomTimeRange(AnimationName, startTime, endTime): これはアニメーションクリップのカスタム開始時刻と終了時刻を設定するBlueprints関数です。

  • SetBluePrintAnimationLoop(flag): アニメーションのループをオン/オフします。

  • SetBluePrintAnimationPlay(flag): これは、アニメーションを開始/停止します。

  • GetBluePrintAnimationFrame(): 現在のアニメーションフレームを返します。

  • SetBluePrintAnimationResetToStart(): アニメーションを開始フレームにリセットします。

  • SetBluePrintAnimationPlayFromStart(): 開始フレームからアニメーションを再生します。

  • SetBluePrintRegionAlpha(FString region_name_in, uint8 alpha_in): 指定された領域のアルファ/不透明度の値を設定します

  • void SetBluePrintRegionCustomOrder(TArray order_in): あなたのキャラクターの領域を並べ替えることができます。すべての領域名を含む文字列の入力配列を提供しますが、あなたのカスタム順序で並べ替えられます。この配列のサイズがあなたのキャラクターの領域の総数と同じであることを確認してください

アニメーションイベント

  • BlueprintAnimationStart(frame): 上書きできるBlueprintイベント。アニメーションが開始される時トリガされます。

  • BlueprintAnimationEnd(frame): 上書きできるBlueprintイベント。これは、アニメーションが終了する時トリガされます。

カスタムアニメーションフレームコールバックイベント/トリガ

足音・アニメーションの特定フレームにあるパーティクルのミッションなど、キャラクターサウンドエフェクトで使用するカスタムのフレームコールバックイベントを作成してトリガーすることができます。

この設定は非常に簡単です。利用可能なコールバックは2種類あります:

  • CreatureFrameCallback: これによりアニメーション内の特定のフレームでコールバックをトリガーすることができます
  • CreatureRepeatFrameCallback: これは反復コールバックであり、指定されたすべてのXフレームを指定されたオフセットで繰り返します

定期的なフレームコールバックを作成するBlueprintのレイアウトを次に示しています:

UE4

ご覧のとおり、SetBluePrintFrameCallbacks関数をCreatureFrameCallback構造体の配列で呼び出す必要があります。配列内の各構造体に関する正しい詳細を記入することを忘れないでください。

同様に、リピートコールバックトリガーは次のようにセットアップされます:

UE4

コールバックがセットアップされた後、ゲームプレイコードがcallback delegatesに気づかせるだけです:

UE4

デリゲート内のNameパラメータ入力をゲームプレイコードに認識させる必要があります。コールバックがトリガされたときに実行される動作/方法を解析、決定するためにNameパラメータを使用します。

カスタムアニメーションフレームのコールバックイベント/Creatureエディターを使用するトリガ

これで、Creatureエディター自体でイベントを直接作成し、エンジンにエクスポートすることができます。

  1. まず、Creature内でEvent Triggers編集ウィンドウを開きます: UE4

  2. カスタムイベントに追加します。イベントは、あなたがいるアニメーションの現在の時間/フレームで追加されます: UE4

  3. キャラクターをエキスポートし、 .mdata Creature Meta Assetをシーンにインポートします。これについては、このドキュメントのアニメーション領域の順序というセクションで説明しています。

  4. あなたのCreatureMeshComponentに新しいCreature Meta Assetを指定します。

  5. **EventBeginPlay()で、LoadBlueprintFramCallBacksAsset()**を呼び出して、作成したイベントを読み込みます。

前のセクションで説明した必要なコールバックデリゲートを接続して、通常どおりに処理します。

ボーンイントロスペクションと衝突

  • GetBluePrintBoneXform(boneName, doWorldTransform) これはキャラクターのボーンの変形を返すBlueprints関数です。 doWorldTransformフラグをオンにするとワールドスペース内の位置が返されます。戻り値はFTransformの形式です。これを使用してコライダーオブジェクトを配置することができます。

ステップ3.1: ACreatureActorオブジェクト

最初の手順は、シーンにACreatureActorオブジェクトを追加することです。このオブジェクトのプロパティは、Materialsグループの下に表示されます:

UE4

Creature FilenameをキャラクターJSONファイルのパスに設定します。再生したい開始アニメーションクリップにStart Animation Nameを設定します。Animation Speedで異なる値を設定して、アニメーションの再生速度を決定できます。アニメーションの切り替え中にスムーズなトランジションを使用する場合は、Smooth Transitionsをオンにすることを忘れないでください。

最後に、キャラクターのテクスチャーにとって適切な素材を設定し、キャラクターを画面上に正しく表示するようにしてください。

ステップ3.2: Blueprintでのアニメーションの切り替え

UE4

ACreatureActorオブジェクトにはBlueprintsシステムに公開されたメソッドがあります。特に興味深いのは、SetBluePrintBlendActiveAnimation(AnimationName、Delta)の機能です。アニメーションクリップ間でキャラクターをスムーズに切り替えることができる機能です。

システムの使用は非常に簡単です。 BluePrintにあなたのキャラクターを参照する関数を追加するだけです。次に、以下を設定します:

  • Name In: 切り替え先のアニメーションクリップの名前
  • Factor: 現在のアニメーションがターゲットアニメーションにブレンドされる速度(0 < 値 <1)

この機能のexec slotをあなたのゲームプレイロジックの残りの部分にリンクして、あなたのキャラクターがアニメーションの状態を変えるのを見てみてください。

ステップ3.3 ゲームアイテム/領域でスワップアウトする

ランタイムを使用してキャラクタの特定のメッシュ領域を切り替えたり/スワップアウトすることができます。帽子・靴・武器など、キャラクターアイテムの切り替えを実行する際に便利です。

切り替えの準備

1)Enable Image Swapが、Creatureエディターでスワップしたい領域に対して有効になっていることを確認してください

2)また、関心領域のSprite Frame ManagerからA Single Image Swap Knotを設定していることを確認してください

3)ある領域でスワップしたい他のスプライトについては、Sprite Frame Managerを開き、Tag値を書き留めてください:

UE4

タグ値は常にマイナスです。この値は、後でゲームアイテムスワッピングでランタイムに入れる数値です。

実行時に

UE4

前のセクションから欲しいTagと一緒にSetBluePrintRegionItemSwap関数を呼び出します。この関数がトリガされると、メッシュ領域は、希望のTag値に対応する新しいイメージを持ちます。

ステップ3.4 複数キャラクターアニメーションの結合

CreatureCollectionActorは、あなたがCreatureActorのコレクションを一緒にストリングし、それらが Single Animation Clip. の一部であるかのように次々にアニメーションを再生できるActorオブジェクトです。

これは1つのキャラクターを表す2つ以上の異なるリグを持ち、1つの統合された単一アニメーションクリップであるかのように2つの異なるアニメーションからアニメーションを連続して再生したい際に便利です。

使い方

1 あなたがコントロールしたい個々のCreatureActorsを最初に作成する必要があります。

2 CreatureCollectionActor を作成し、必要なCreatureActorsを CreatureCollectionActor の下に置きます。これは、子アクターが親CreatureCollectionActorに従って変換するようになっています。

UE4

3 コレクションクリップの構築を始めます: コレクションクリップは、 (CreatureActor、CreatureActorAnimationClip) のペアのシーケンスで構成されています。"例: このアクターをこのクリップで最初にプレイし、その後あのアクターをあのクリップで再生する"

CollectionClip自体には名前が与えられます。この名前は、異なるアクターからアニメーションクリップのコレクションを表すために使用する名前です。

下の写真では、“clip1“という新しいCollectionClipを作成しています。 Cyclops_IDLEというアニメーションを持つ最初のChild1アクターを“clip1“に追加しています 次に、Cyclops_HIT_1というアニメーションを持つ2番目のChild2アクターを"clip2"に追加します。

UE4

4 実際にあなたの新しいCollectionClipを再生し、1つの大きなアニメーションクリップのように扱いましょう!通常のクリップではSetBluePrintActiveClipのようなBlueprint関数を設定し、作成したクリップ間で切り替えることができるようにします。コレクションクリップの再生が完了するとトリガーするCreatureAnimationEndEventのようなイベントもあります:

UE4

ステップ3.5 アンカーポイント

あなたのキャラクターをアニメーション化する時、同じ起点にそれらを中心に置いていないことが多々あります。アンカーポイントは、特定のアニメーションクリップに対してキャラクターの相対的な起点を指定することができます。これにより、必要に応じて異なるキャラクターアニメーションを中央に配置することができます。

1)Creature EditorAnimate -> Set Anchor Pointを実行する

2)キャラクターの周りにRed Spinning Boxをドラッグしてアンカーポイントを設定します: UE4

3)UE4では:

UE4

SetBluePrintUseAnchorPointstrueで呼び出すことで、アンカーポイント関数をアクティブにします。

ステップ3.6 ゲームリアルタイムIK

UE4でIK Constraintsを設定することで、キャラクターの2本のボーンにIKライブを実行できます。 参照Blueprintsグラフを見てみましょう:

UE4

1)まず、CreatureBoneIK構造体を作成します。構造体には以下のプロパティを持っています:

  • First Bone Name : IKシステムの最初のボーンの名前

  • Second Bone Name : IKシステムの2番目のボーンの名前

  • Target Pos : ワールドスペースで2つのボーンを配置するターゲットポジション

  • Positive Angle : IKシステムが正または負の角度をターゲットにしているかどうか

2)次に、前の手順で作成したCreatureBoneIK構造体を使用して、SetBlueprintBonesIKConstraint関数を呼び出します。Event tickトリガー中にこの関数を呼び出すと、ゲームプレイ中にボーンをターゲット位置に更新します。

IK Constraintsを削除するには、単にRemoveBlueprintBonesIKConstraintを呼び出します。

ステップ3.7 ゲームライブボーンの位置変更

次の設定で、ゲーム内のボーンライブの位置を上書きすることができます:

UE4

1)まず、CreatureBoneOverride構造体を作成します。以下のプロパティを持ちます:

  • Bone Name : ボーンの名前

  • Start Pos : ワールドスペースでのボーンの開始位置

  • End Pos : ワールドスペースでのボーンの終了位置

2)次に、新しい配列を作成し、前の手順で作成したボーンオーバーライド構造体をこの配列に接続します。

3)ステップ2で作成した配列でSetBlueprintBonesOverride関数を呼び出します。

アニメーション領域の順序

Animated Region Ordering機能を使用してあなたのキャラクターをCreatureから作成した場合、追加のファイルが生成されます。このファイルの拡張子は .mdata です。 Creature Meta Assetを作成し、新しいアセットを .mdata ファイルに向けます。その後、Blueprintアクターの CreatureMeshComponent に入り、 Creature Meta Asset スロットを新しく作成したアセットを指すように設定します。これにより、あなたのキャラクターのAnimated Region Orderingがアクティブになります。

アドバンスユーザー: Core Creatureランタイムライブラリの理解

上記では、Creature UE4ランタイムの使用方法について説明しましたが、core Creature静的ランタイムライブラリを修正したり、機能を追加する必要がある場合があります。以下では、静的ランタイムライブラリがどのように機能するかを詳しく見ています。

あなたが注目すべきファイルは次のとおりです:

  • MeshBone.cpp & MeshBone.h - これはCreatureランタイムのポーズエンジンです。スケルトン全体、それに対応するボーン、およびメッシュ領域にアクセスできます。

  • CreatureModule.cpp & CreatureModule.h - Creatureのキャラクターを管理し、アニメーションファイルに読み込んだキャラクターをポーズするレイヤーです。

Creatureアニメーションを再生するために、UE4 ACreatureActorクラスがCreatureModuleを呼び出していることに気づくでしょう。

読み込みと初期化の仕方

dragonTest.jsonと呼ばれるエクスポートされたドラゴンのアニメーションファイルがあるとしましょう。character-dragon.pngと呼ばれる対応するテクスチャアトラスもあると仮定します。 最初にファイルアセットを読み込むことから始めます:

CreatureModule::CreatureLoadDataPacket json_data;
CreatureModule::LoadCreatureJSONData(filename, json_data);

上のコードはJSONデータをディスクからメモリに読み込みます。次に、これらの読み込んだアセットを利用できる実際のオブジェクトを作成しましょう:

auto cur_creature = std::shared_ptr<CreatureModule::Creature>(new CreatureModule::Creature(json_data));

creature_manager = new CreatureModule::CreatureManager(cur_creature);
creature_manager->CreateAnimation(json_data, "default");
creature_manager->CreateAnimation(json_data, "second");  

上記の例では、JSONファイルに2つのアニメーションクリップがあります: defaultsecondです。従って、creature_managerオブジェクトから2つのアニメーションを作成して再生できるようにする必要があります。

読み込みが完了したので、再生用のアクティブなアニメーションを設定できます:

creature_manager->SetActiveAnimationName("default");

これにより、現在アクティブなアニメーションとしてdefaultを設定します。 LoadAnimation()AddLoadedAnimationLoadCreatureACreatureActorで見てみると、再生のためにキャラクターを設定するためにこれらのステップを正確に実行することに気づくでしょう。

CreatureManagerとCreatureクラス

あなたのエンジンにCreatureキャラクターを再生して表示するには、再生/ポージングのメカニズムだけでなく、最終的なCreatureキャラクターメッシュのトポロジー、ポイント、テクスチャー座標にアクセスする必要があります。

-CreatureManager - アニメーションと読み込んだキャラクターを管理するクラスです。このクラスを使用して、一定のデルタタイムだけアニメーションを進めます。ゲームループまたはレンダラーは、この"game tick"毎に、このクラスの更新機能と対話する必要があります。

-Creature - これは読み込んだCreatureを含むクラスです。CreatureManagerからアクセスできます。このクラスには、ゲームエンジンが画面に表示するために必要なすべてのジオメトリ/レンダリングデータが含まれます。

アニメーションアップデートとアドバンス

すべてのゲームエンジンにはアップデート/ゲームティックコールがあります。この場合、次のように実行します:

void ACreatureActor::Tick(float DeltaTime)
{
	if (creature_manager)
	{
		creature_manager->Update(DeltaTime * animation_speed);
		UpdateCreatureRender();
	}
}

Creatureキャラクターを特定のデルタタイムで更新するようにマネージャーに指示する。これは、アニメーションをdelta値だけ進めます。

メッシュを表示する

Creatureオブジェクトは、インデックス、uvs、およびポイントを返します。これらの属性は、キャラクターメッシュをレンダリングするのに十分です。どのように行われているか下記で見てみましょう:

void ACreatureActor::UpdateCreatureRender()
{
	auto cur_creature = creature_manager->GetCreature();
	int num_triangles = cur_creature->GetTotalNumIndices() / 3;
	glm::uint32 * cur_idx = cur_creature->GetGlobalIndices();
	glm::float32 * cur_pts = cur_creature->GetRenderPts();
	glm::float32 * cur_uvs = cur_creature->GetGlobalUvs();

	TArray<FProceduralMeshTriangle>& write_triangles = mesh->GetProceduralTriangles();

	static const FColor White(255, 255, 255, 255);
	int cur_pt_idx = 0, cur_uv_idx = 0;

	for (int i = 0; i < num_triangles; i++)
	{
		int real_idx_1 = cur_idx[0];
		int real_idx_2 = cur_idx[1];
		int real_idx_3 = cur_idx[2];

		FProceduralMeshTriangle triangle;

		cur_pt_idx = real_idx_1 * 3;
		cur_uv_idx = real_idx_1 * 2;
		triangle.Vertex0.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex0.Color = White;
		triangle.Vertex0.U = cur_uvs[cur_uv_idx];
		triangle.Vertex0.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_2 * 3;
		cur_uv_idx = real_idx_2 * 2;
		triangle.Vertex1.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex1.Color = White;
		triangle.Vertex1.U = cur_uvs[cur_uv_idx];
		triangle.Vertex1.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_3 * 3;
		cur_uv_idx = real_idx_3 * 2;
		triangle.Vertex2.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex2.Color = White;
		triangle.Vertex2.U = cur_uvs[cur_uv_idx];
		triangle.Vertex2.V = cur_uvs[cur_uv_idx + 1];

		write_triangles[i] = triangle;

		cur_idx += 3;
	}

	mesh->ForceAnUpdate();
} 

ご覧のとおり、レンダリングパイプラインにポイント、uvs、およびインデックスを送信し、データを一連の三角形として描画するという単純な動作です。

カスタム時間/フレーム範囲

現在アクティブなアニメーションのカスタム時間/フレーム範囲を設定できます。再生範囲を10〜20のフレーム範囲に制限したい場合、次の操作を行います:

auto all_animations = creature_manager->GetAllAnimations();
all_animations["myAnimation"]->setStartTime(10);
all_animations["myAnimation"]->setEndTime(20);

アニメーションブレンディング

2つのアニメーションクリップをブレンドするには、次の手順を実行します:

creature_manager->SetBlending(true);
creature_manager->SetBlendingAnimations("default", "second");
creature_manager->SetBlendingFactor(0.5); // 0 to 1 blends between the 2 clips

自動ブレンドによるスムーズなトランジション

あるアニメーション状態から次のアニメーション状態にスムーズに移行したい場合は、ランタイムでAuto Blending機能を使用できます。

Auto Blendingを有効にするには、まず次の操作を行います:

creature_manager->SetAutoBlending(true);

すべてのアニメーションをあなたのcreature manager objectに追加した後。

Auto Blendingを使用するには:

creature_manager->AutoBlendTo(NEW_ANIMATION_NAME, 0.1f);

キャラクターがNEW_ANIMATION_NAME.というターゲットアニメーションにスムーズに移行します。2番目のパラメータは、遷移のタイムデルタを決定します。範囲は0.0〜1.0です。

ボーンの位置を変更する

場合によっては、キャラクターのボーンの位置を直接変更する必要があります。例えば、ボーンの位置をラグドール物理のスプリング/ジョイントに接続されたいくつかの剛体に従わせることができます。独自のカスタム要件に合わせてボーンの位置を設定する必要がある場合、次の操作を行う必要があります。まず、カスタムボーンオーバーライドメソッドを記述します。yのボーンをある量だけ置き換える例を次に示します:

// This is an example of how you can use a callback function to modify the position of the bones
// on your character. In this example, we will displace all the bones by a fixed amount in y.
void
HelloWorld::bonesModifyCallback(std::unordered_map<std::string, meshBone *>& bones_map)
{
    for(auto& bone_data : bones_map)
    {
        auto cur_bone = bone_data.second;
        auto cur_start_pos = cur_bone->getWorldStartPt();
        auto cur_end_pos = cur_bone->getWorldEndPt();
    
        cur_start_pos.y -= 5;
        cur_end_pos.y -= 5;
    
        cur_bone->setWorldStartPt(cur_start_pos);
        cur_bone->setWorldEndPt(cur_end_pos);
    }
}

また、CreatureManagerにカスタムボーン修正コールバックを使用するように伝える必要があります:

// Example of how to register a callback function to modify the bones
std::function<void (std::unordered_map<std::string, meshBone *>&) > cur_callback =
    std::bind(&HelloWorld::bonesModifyCallback, this, std::placeholders::_1);
creature_manager_2->SetBonesOverrideCallback(cur_callback);

ポイントキャッシュによる再生パフォーマンスの高速化

ポーズエンジンのコストを支払わずに再生アニメーションのスピードを上げたい場合、特定のアニメーションでポイントキャッシュを有効にすることができます。

ポイントキャッシングは本質的にアニメーションの頂点を保存し、再生がポーズエンジンをバイパスできるようにします。非常に複雑なスケルトンと変形を伴うキャラクタリグは、ポイントキャッシングによって大きな利益を得ます。

特定のアニメーションでポイントキャッシングを有効にするには、次のようにします:

my_creature_manager->MakePointCache("myAnimationName");

キャッシュはキャラクタではなく、アニメーションに固有のものであることに注意してください。つまり、複数のキャラクターをインスタンス化した場合、そのアニメーションの単一キャッシュのコストのみを支払うことになります。これにより、メモリ節約と再生パフォーマンスの高速化が実現します。