環境
UE 4.10.0
Visual Studio 2015
概要
Unreal Engine 4 を触ってみて動作を確認する
C++ プログラム上でモーションを制御する方法についてのまとめ
本文
スケルタルメッシュとは?
モーション制御の前に UE4 のメッシュについて確認
UE4 では、メッシュは 2 種類あるようだ
雑な説明をすれば、以下のような大別ができる
-
スタティックメッシュ
こちらは、静的メッシュのようだ
ボーンの入っていないメッシュを扱う際はこちらを使用するようだ -
スケルタルメッシュ
こちらは、動的メッシュのようだ
ボーンが入っており、モーションで制御するメッシュを扱う際はこちらを使用する
ようです
モーションデータを準備する
サンプルを実装する前に、モーションデータをどうしようかと思っていたらマー
ケットプレイスに「アニメーションスターターパック」というのが無料であった
ので、これを使用するようにした。マーケットプレイスからダウンロードして、
プロジェクトに追加すればすぐに使用できる。
アクターにプログラム上でコンポーネントを追加する
プログラム上でやる事は、必要なコンポーネントを追加し、アセットからの参照を
解決し、アニメーションの再生命令を出すの3つです。以下、サンプルです。
[ヘッダー]
UCLASS()
class TEST20160104_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor(const class FObjectInitializer& ObjectInitializer);
virtual void BeginPlay() override;
virtual void Tick( float DeltaSeconds ) override;
private:
USkeletalMeshComponent* mSkeletalMeshComponent;
USkeletalMesh* mSkeletalMesh;
UAnimSequence* mAnimSequence;
};
[コード]
AMyActor::AMyActor(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, mSkeletalMeshComponent(nullptr)
, mSkeletalMesh(nullptr)
, mAnimSequence(nullptr)
{
PrimaryActorTick.bCanEverTick = true;
// メッシュ初期化
static ConstructorHelpers::FObjectFinder<USkeletalMesh> meshAsset(TEXT("/Game/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin.SK_Mannequin"));
if (meshAsset.Succeeded())
{
mSkeletalMesh = meshAsset.Object;
mSkeletalMeshComponent = ObjectInitializer.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("MeshComponentMeshName"));
if (mSkeletalMeshComponent)
{
RootComponent = mSkeletalMeshComponent;
mSkeletalMeshComponent->SetSkeletalMesh(mSkeletalMesh);
}
}
// アニメーション初期化
static ConstructorHelpers::FObjectFinder<UAnimSequence> animAsset(TEXT("/Game/AnimStarterPack/Idle_Pistol.Idle_Pistol"));
if (animAsset.Succeeded())
{
mAnimSequence = animAsset.Object;
}
}
void AMyActor::BeginPlay()
{
Super::BeginPlay();
if (mSkeletalMeshComponent)
{
mSkeletalMeshComponent->PlayAnimation(mAnimSequence, true);
}
}
コードの解説
まずは、ヘッダの解説。
スケルタルメッシュ、スケルタルメッシュコンポーネント、アニメーションシーケンス
の 3 つをメンバとして追加する。スケルタルメッシュの表示は、スタティックメッシュ
とほぼ同じ。他にモーション再生の為のインスタンスを追加する。
次は、コードの解説。
コンストラクタでは、スケルタルメッシュのアセットのパスを指定し、インスタンスを
初期化する。モーションのアセットのパスを指定し、インスタンスを初期化する。
BeginPlay で、モーションを再生の命令を出している。
アセットのパスが間違ってなければ、上記コードで動くと思う。
まとめ
アクターでスケルタルメッシュにモーションさせる場合は、以下のコンポーネントを
メンバに追加し、初期化して、モーション再生命令を出す。
- スケルタルメッシュ
- スケルタルメッシュコンポーネント
- アニメーションシーケンス