4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UE4 でアクターのモーションを制御する方法

Posted at

環境

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 で、モーションを再生の命令を出している。
アセットのパスが間違ってなければ、上記コードで動くと思う。

まとめ

アクターでスケルタルメッシュにモーションさせる場合は、以下のコンポーネントを
メンバに追加し、初期化して、モーション再生命令を出す。

  • スケルタルメッシュ
  • スケルタルメッシュコンポーネント
  • アニメーションシーケンス
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?