Unreal Engine : C++でキャラクターをアニメーションさせて動かす

UE4のC++とbrueprintを併用して、mixamoの好きなキャラクターをコントローラーを使ってアニメーション付きで前後左右にワールド内を自由自在に動かしてみようと思います。左右の動きがぎこちないのは、ターンを設定していないためです。

スポンサーリンク

C++キャラクタークラス

先ず、コンテンツ→C++クラス→プロジェクト名フォルダに入ってから右クリックで新しいクラスを作成します。


新しいクラスはキャラクターを選択します。

クラス名はそのままでもいいし、好きな名前に変えてもどちらでもいいです。


Visual Studioが立ち上がったらMyCharacter.hファイルに以下のように書き込みます。

public:
	// Sets default values for this character's properties
	AMyCharacter();

	// カメラブームはプレイヤー後方でカメラ位置を調整します
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "True"))
	class USpringArmComponent* CameraBoom;

	// カメラを追います
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "True"))
	class UCameraComponent* FollowCamera;

	//前後に動かす
	void MoveForward(float Value);

	//左右に動かす
	void MoveRight(float Value);

MyCharactr.cppに以下のように書き込みます。

#include "MyCharacter.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"

// Sets default values
AMyCharacter::AMyCharacter()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;

// カメラブームを作成(衝突時プレイヤー方向に引っ張る)
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(GetRootComponent());
CameraBoom->TargetArmLength = 600.f; // ブームの長さ
CameraBoom->bUsePawnControlRotation = true; // コントローラに合わせてアームを回転する

FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
//ブームの終端にカメラを取り付けてコントローラ動作をブームに調整させる
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
FollowCamera->bUsePawnControlRotation = false;
}

この後、Ctrl+Shift+Bを押してビルドします。

スポンサーリンク

キャラクターブループリント

コンテンツフォルダ内にBlueprintフォルダを新たに作成して、C++キャラクタークラスのMyCharacterをベースにしたブループリントを以下のようにして新規に作成します。

ここではファイルネームをMyCharacter_BPにしていますが何でもいいです。新規ファイルを作成するフォルダーには新たに作成したBlueprintフォルダを選択します。

スポンサーリンク

キャラクターメッシュの取得と設定

mixamoに行って好きなキャラクターを選んでダウンロードします。

ダウンロードしたキャラのメッシュを、コンテンツフォルダ内に新たに作成したCharacterフォルダの中にインポートします。設定は全てデフォルトのままでOKです。何もせずに全てインポートを押しましょう。

ダウンロードしたキャラのメッシュをスケルタルメッシュに設定します。

かなりでかいので、拡大・縮小を全て0.4にして、キャラがカプセルに収まるように縮小します。

キャラの向きを、Eキーを押して90度回転させ、水色の矢印の方向に合わせます。

スポンサーリンク

アニメーション

再びmixamoに行って選択したキャラのアニメーションをダウンロードします。ダウンロードするアニメーションはidle, walk, runの3種類です。検索窓に3つのキーワードを入力して好みのアニメーションを選ぶだけです。注意が必要なのはダウンロード時にスキン無し(without skin)を選択することと、in placeにチェックを入れることです。

Characterフォルダ内に新たにAnimationフォルダを作成して、そこでブレンドスペース1Dを作成します。

スケルトンはダウンロードしたキャラのスケルトンを選択します。

ファイル名は何でもいいです。次に、ダウンロードしたアニメーションをインポートします。スケルタルメッシュはダウンロードしたキャラのスケルタルメッシュを選択します。

ブレンドスペース1Dファイルを開いてインポートしたアニメをブレンドさせます。左端にIdle、真ん中にwalk、右端にrunを配置します。

キャラを前後左右に動かせるようにするために、Character.cppに以下のように入力します。

void AMyCharacter::MoveForward(float Value)
{
	if (Controller != nullptr && Value != 0.f)
	{
		//前後方向(X軸)を検出する
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);

		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		AddMovementInput(Direction, Value);
	}
}

void AMyCharacter::MoveRight(float Value)
{
	if (Controller != nullptr && Value != 0.f)
	{
		//左右方向(X軸)を検出する
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);

		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		AddMovementInput(Direction, Value);
	}
}
スポンサーリンク

軸マッピングの設定

コントローラーを使ってキャラを前後左右に動かせるように、コントローラーボタンにキャラの移動軸を割り振ります。先ず、設定→プロジェクト設定を選択します。

プロジェクト設定に入ったら、エンジン項目にあるインプットを選択します。

インプット画面で、バインディング項目の軸マッピングの追加(+ボタン)を押します。


軸マッピングを以下のように設定します。

Character.cppに以下のように入力して、軸マッピングとC++関数をバインドします。

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	check(PlayerInputComponent);

	PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);
}
スポンサーリンク
スポンサーリンク

コメント

タイトルとURLをコピーしました