Character Movement ではヒューマノイド キャラクターがワールドを移動するためのロコモーション システムを提供します。Character Movement コンポーネント は Actor コンポーネント です。歩行、落下、水泳、飛行など Character クラスの動作モードを提供します。さらに、Character Movement コンポーネントはネットワーク ゲームプレイ向けの堅固な統合機能を備えており、デベロッパーがネットワークでの動作をカスタムで作成できるフレームワークを提供します。
この操作ガイドでは、Character クラスを作成し、その動きのロジックである Input をスクリプトで作成して、キャラクターがどのステートにあるかを判断し、対応するアニメーションを再生するアニメーション ブループリントを作成します。
新規プロジェクトを作成する
まず、 Epic Games Launcher にサインインして、 [New (新規)] > [Games (ゲーム)] > [Blank] > [Project (プロジェクト)] の順に選択して、 CharacterMovement という名前のプロジェクトを作成します。
キャラクターをアニメートするには、 Epic Games マーケットプレイス から無料でダウンロードできる Animation Starter Pack が必要です。[Free (無料)] ボタンをクリックして、Animation Starter Pack をダウンロードして、 Epic Games Library に追加します。[Free (無料)] ボタンをクリックして、アニメーション スターター パックを Epic Games ライブラリ に追加します。
ライブラリ から アニメーション スターター パック を検索して [Add to Project] をクリックします。次に [Select the Project to Add the Asset to] メニューから「CharacterMovement 」ファイルを見つけて選択したら [Add to Project] をクリックします。
プロジェクトに Animation Starter Pack を追加すると、 コンテンツ ブラウザ で表示されていることがわかります。
まず [New (新規)] > [Games (ゲーム)] > [Blank (ブランク)] > [C++] の順に選択して、「CameraComponents 」という名前のプロジェクトを作成します。
キャラクターをアニメートするには、Epic Games Marketplace から無料でダウンロードできる アニメーション スターター パック が必要です。[Free (無料)] ボタンをクリックして、アニメーション スターター パックを Epic Games ライブラリ に追加します。
ライブラリ から アニメーション スターター パック を検索して [Add to Project] をクリックします。次に [Select the Project to Add the Asset to] メニューから「CharacterMovement 」ファイルを見つけて選択したら [Add to Project] をクリックします。
アニメーション スターター パックをプロジェクトに追加すると、コンテンツ ブラウザ に表示されるようになります。
プレイヤー キャラクターを作成する
プレイヤーをコントロールするためには Character クラスが必要です。キャラクターは、ヒューマノイド キャラクターが自分のワールドを横断できるようにする移動システムを提供するための Character Movement コンポーネントを備えたポーンです。以下の手順に従って、キャラクターを設定します。
[Add/Import (追加/インポート)] ボタンをクリックして新規ブループリントの Character クラスを「BP_PlayerCharacter 」という名前で作成します。
Bp_PlayerCharacter をダブルクリックして [Class Defaults (クラスのデフォルト)] を開き、 [Components (コンポーネント)] タブで Mesh (CharacterMesh0) Skeletal Mesh コンポーネント を選択して、 [Details (詳細)] パネルに移動します。
Mesh カテゴリで Skeletal Mesh variable の横のドロップダウン矢印を選択して、ドロップダウン メニューから SK_Mannequin を選択します。
[Details (詳細)] パネルから [Transform (トランスフォーム)] カテゴリに移動して、メッシュの Location と Rotation を「0 」、「0 」、「-90 」 に設定します。
キャラクターの スケルタルメッシュ が以下の画像のように前を指している 矢印コンポーネント の方向を向いて表示されます。
[Components (コンポーネント)] タブ に移動して Mesh コンポーネントを選択し、 [Add Component (コンポーネントを追加)] をクリックして、ドロップダウン メニューで SpringArm を検索して選択し、 Spring Arm コンポーネント の名前を「SpringArmComp 」にします。
[Details (詳細)] パネルの [Camera Settings (カメラの設定)] カテゴリで Use Pawn Control Rotation をオンにします。
Use Pawn Control Rotation をオンにすると、カメラがスプリング アームを基準に回転します。
[Camera (カメラ)] カテゴリ で、 Socket Offset を「0」、「0」、「30 」に設定し、 [Transform (トランスフォーム)] カテゴリ に移動して、 SpringArmComp の Location を「0」、「0」、「50 」に設定します。
SpringArmComp を選択した状態で、 [Add Component (コンポーネントを追加)] ボタンをクリックして、ドロップダウン メニューで [Camera (カメラ)] を検索して選択し、 CameraComp という名前の Camera コンポーネントを追加します。
[Components (コンポーネント)] タブで、 Character Movement コンポーネント を選択して、 [Details (詳細)] パネル に移動し、 [Character Movement (Rotation Settings ) (キャラクターの動き(回転設定)] カテゴリで、 Use Controller Desired Rotation および Orient Rotation To Movement をオンにします。
Character Movement:Walking カテゴリで、 Ignore Base Rotation 変数をオンにします。
Ignore Base Rotation をオンに設定すると、キャラクターは現在のワールドの回転を維持し、自分が立っているベースの回転の変化を無視します。
[Character Movement Nav Movement] カテゴリの Movement Capabilities で、ドロップダウン メニューを選択して、追加の変数設定を表示し、ブール型 Can Crouch に移動して、このチェックボックスをオンにします。
コンパイル して 保存 します。
プレイヤーをコントロールするためには Character クラスが必要です。キャラクターは、ヒューマノイド キャラクターが自分のワールドを横断できるようにする移動システムを提供するための Character Movement コンポーネントを備えたポーンです。以下の手順に従って、キャラクターを設定します。
[C++ Class Wizard (C++ クラス ウィザード)] で、新規 Character クラスを「PlayerCharacter 」という名前で作成してから、「CameraCharactor.h
」ファイルに移動して、次のクラス定義を宣言します。
protected:
//スプリング アーム コンポーネントで、プレーヤーの背後のカメラを追います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class USpringArmComponent* SpringArmComp;
//プレイヤーはカメラを追います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class UCameraComponent* CameraComp;
「PlayerCharactor.cpp
」ファイルに移動して、次のクラス ライブラリを追加します。
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
APlayerCharactor::APlayerCharacter コンストラクタ メソッドで、次のコードを宣言します。
// クラス コンポーネントをインスタンス化します
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComp"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//キャラクター メッシュのトランスフォームの位置と回転を設定します。
GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -90.0f), FQuat(FRotator(0.0f, -90.0f, 0.0f)));
// デフォルト キャラクタのスケルタル メッシュ コンポーネントにクラス コンポーネントをアタッチします。
SpringArmComp->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(SpringArmComp,USpringArmComponent::SocketName);
//スプリング アームのクラス変数を設定します
SpringArmComp->bUsePawnControlRotation = true;
//キャラクター移動コンポーネントのクラス変数を設定します
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->bUseControllerDesiredRotation = true;
GetCharacterMovement()->bIgnoreBaseRotation = true;
コードを コンパイル します。
エディタ で C++ Classes フォルダ へ移動して、PlayerCharacter クラスをクリックし、C++ Class Actions ドロップダウン メニューで [Create Blueprint class based on PlayerCharacter] を選択します。ブループリントに「Bp_PlayerCharacter 」と名前を付けます。
BP_PlayerCharacter をダブルクリックすると class defaults が開きます。[Components] タブで Mesh (CharacterMesh0) Skeletal Mesh コンポーネント を選択して [Details] パネルを開きます。
Mesh カテゴリで Skeletal Mesh variable の横のドロップダウン矢印を選択して、ドロップダウン メニューから SK_Mannequin を選択します。
キャラクターの スケルタルメッシュ が以下の画像のように前を指している 矢印コンポーネント の方向を向いて表示されます。
コンパイル して 保存 します。
W、A、S、D などの入力キーが押されたときにキャラクターを動かすカスタム ロジックを設定する必要があります。
[Edit (編集)] > [Project Settings (プロジェクト設定)] > [Input (インプット)] に移動してから、 [Bindings (バインディング)] カテゴリで [Action Mappings (アクション マッピング)] の隣にある + マークをクリックして次を追加します。
アクション マッピング
キー値
Jump
Space Bar
Crouch
Left Ctrl
Sprint
Left Shift
[Bindings (バインディング)] カテゴリで [Axis Mappings] の隣にある [+] マークをクリックし、以下の 軸マッピング を追加します。
軸マッピング
キー値
スケール
MoveForward
W
1.0
S
-1.0
MoveRight
D
1.0
A
-1.0
Turn
Mouse X
1.0
LookUp
Mouse Y
-1.0
コンテンツ ブラウザ で Bp_PlayerCharacter をダブルクリックして [Class Defaults (クラスのデフォルト)] を開き、 [Event Graph] を右クリックして、ドロップダウン メニューで、 MoveForward を検索して選択します。
InputAxis MoveForward ノードの 実行ピン を引き出して、ドロップダウン メニュー から Add Movement Input ノードを検索して選択します。次に InputAxis MoveForward ノードの Axis Value ピンを引き出して、 Add Movement Input ノードの Scale Value ピンに接続します。
[Event Graph] で右クリックして、コンテキスト メニューで Get Control Rotation を検索して選択します。次に ローテータ型の Return Value ピンを引き出して、ドロップダウン メニューで Break Rotator を検索して選択します。
Break Rotator ノードの Z (Yaw ) ピンを引き出して、ドロップダウン メニューで Make Rotator を検索して選択します。次に Make Rotator ノードの Rotator の Return Value ピンを引き出して、ドロップダウン メニューで Get Forward Vector を検索して選択します。
Get Forward Vector ノードの Vector の Return Value ピンを引き出して、 Add Movement Input ノードの World Direction ピンに接続します。
もう一度グラフで右クリックして Input Axis Event として Move Right を検索し、選択します。
InputAxis MoveRight ノードの 実行ピン を引き出して、ドロップダウン メニュー から Add Movement Input ノードを検索して選択します。次に InputAxis MoveRight ノードの Axis Value ピンを引き出して、 Add Movement Input ノードの Scale Value ピンに接続します。
Make Rotator ノードの Rotator の Return Value ピンを引き出して、ドロップダウン メニューで Get Right Vector ノードを検索し、選択します。次に Vector の Return Value ピンを引き出して Add Movement Input ノードの World Direction ピンに接続します。
完成した Movement Input Events ブループリントのグラフは以下の画像のようになります。
[Event Graph] で 右クリック して InputAxis LookUp イベント ノードを検索し、選択します。次に右クリックして Add Controller Pitch Input ノードを検索して選択します。
Input Axis LookUp ノードから Axis Value ピンを引き出して、 Add Controller Pitch Input ノードの Val ピンに接続します。Input Axis LookUp ノードの 実行出力ピン を引き出して、 Add Controller Pitch Input ノードの 実行入力ピン に接続します。
[Event Graph] で右クリックして Input Axis Turn イベント ノードを検索して選択します。次に右クリックして Add Controller YawInput ノードを検索して選択します。
Input Axis Turn ノードの Axis Value ピンを引き出して、 Add Controller Yaw Input ノードの Val ピンに接続します。Input Axis Turn ノードの 実行出力ピン を引き出して、 Add Controller Yaw Input ノードの 実行入力ピン に接続します。
[Compile] と [Save] を順にクリックします。
作成中のブループリント
この時点では、ブループリント グラフは以下の画像のようになります。
W、A、S、D などの入力キーが押されたときにキャラクターを移動するカスタム ロジックを設定する必要があります。
[Edit] > [Project Settings] > [ Input] に移動してから、 [Bindings (バインディング)] カテゴリで [Action Mappings] の隣にある [+] マークをクリックし、以下の アクション マッピング を追加します。
アクション マッピング
キー値
Jump
Space Bar
Crouch
Left Ctrl
Sprint
Left Shift
[Bindings (バインディング)] カテゴリで [Axis Mappings] の隣にある [+] マークをクリックし、以下の 軸マッピング を追加します。
軸マッピング
キー値
スケール
MoveForward
W
1.0
S
-1.0
MoveRight
D
1.0
A
-1.0
Turn
Mouse X
1.0
LookUp
Mouse Y
-1.0
PlayerCharacter.h で以下のクラス メソッドを宣言します。
protected:
//前方/後方の入力を呼び出しました
void MoveForward(float InputAxis);
//左側/右側の入力を呼び出しました
void MoveRight(float InputAxis);
PlayerCharacter.Cpp で APlayerCharacter::MoveForward と APlayerCharacter::MoveRight クラス メソッドに以下のロジックを実行します。
void APlayerCharacter::MoveForward(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが前方かを見つけます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// 前方ベクターを取得します
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, AxisValue);
}
}
void APlayerCharacter::MoveRight(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが右側かを見つけます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// 右側ベクターを取得します
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// その方向に移動を追加します
AddMovementInput(Direction, AxisValue);
}
}
次に APlayerCharacter::SetupPlayerInputComponent メソッドに移動して、以下のコードを実装します。
//機能を入力にバインドするために呼び出されます
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent*)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward", this, &APlayerCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &APlayerCharacter::MoveRight);
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
}
コードを コンパイル します。
Work-In-Progress Code
PlayerCharacter.h
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayerCharacter.generated.h"
UCLASS()
class CHARACTERMOVEMENT_API APlayerCharacter : public ACharacter
{
GENERATED_BODY()
public:
// このキャラクターのプロパティのデフォルト値を設定します
APlayerCharacter();
protected:
// ゲームの開始またはスポーン時に呼び出されます
virtual void BeginPlay() override;
//スプリング アーム コンポーネントで、プレイヤーの背後のカメラを負います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class USpringArmComponent* SpringArmComp;
//プレイヤーはカメラを追います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class UCameraComponent* CameraComp;
//前方/後方の入力が呼び出されます
void MoveForward(float InputAxis);
//called for left/right side input
void MoveRight(float InputAxis);
public:
// フレームごとに呼び出されます
virtual void Tick(float DeltaTime) override;
// 機能を入力にバインドするために呼び出されます
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
PlayerCharacter.Cpp
#include "PlayerCharacter.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
// デフォルト値を設定します
APlayerCharacter::APlayerCharacter()
{
// Tick()を毎フレーム呼び出すように設定します。必要なければ、これをオフにしてパフォーマンスを向上させることができます。
PrimaryActorTick.bCanEverTick = true;
// クラスコンポーネントをインスタンス化します
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComp"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//キャラクタメッシュのトランスフォームの位置と回転を設定します
GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -90.0f), FQuat(FRotator(0.0f, -90.0f, 0.0f)));
// デフォルト キャラクタのスケルタル メッシュ コンポーネントにクラス コンポーネントをアタッチします。
SpringArmComp->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(SpringArmComp,USpringArmComponent::SocketName);
//スプリング アームのクラス変数を設定します
SpringArmComp->bUsePawnControlRotation = true;
//キャラクター移動コンポーネントのクラス変数を設定します
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->bUseControllerDesiredRotation = true;
GetCharacterMovement()->bIgnoreBaseRotation = true;
}
// ゲームの開始またはスポーン時に呼び出されます
void APlayerCharacter::BeginPlay()
{
Super::BeginPlay();
}
void APlayerCharacter::MoveForward(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが前方かを見つけます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// 前方ベクターを見つけます
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, AxisValue);
}
}
void APlayerCharacter::MoveRight(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが右側かを見付けます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// Get right vector
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// その方向に移動を追加します
AddMovementInput(Direction, AxisValue);
}
}
// フレームごとに呼び出されます
void APlayerCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// 機能を入力にバインドするために呼び出されます
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward",this, &APlayerCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &APlayerCharacter::MoveRight);
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
}
これで入力イベント Move Forward、Move Right、Look Up、および Turn のブループリント スクリプト ロジックが完成したので、今度は入力イベント Jump、Crouch、Sprint のアクション マッピングの実装を完成させる必要があります。
[Event Graph] を右クリックして、 All Actions for this Blueprint ドロップダウン メニューで、 Jump Action Event を検索して選択します。
InputAction Jump ノードの Pressed 実行ピン を引き出して、ドロップダウン メニューで Character 関数 Jump を検索して選択します。
InputAction Jump ノードの 実行ピン を Jump ノードの 実行ピン に接続します。
InputAction Jump ノードの Released 実行ピン を引き出して、ドロップダウン メニューで Character 関数 Stop Jumping を検索して選択します。
[Event Graph] を右クリックして、ドロップダウン メニューで、 Input Action Sprint を検索して選択します。
[Components (コンポーネント)] タブに移動して、 Character Movement コンポーネント をクリックして、 イベント グラフ にドラッグします。
Character Movement ピン を引き出して、ドロップダウン メニューで Set Max Walk Speed を検索して選択します。Max Walk Speed の float 値 を「1000 」に設定して、 InputAction Sprint ノードの Pressed 実行ピン を Set Max Walk Speed の 入力実行 ピンに接続します。
Character Movement ピン を引き出して、もう 1 つの Set Max Walk Speed ノードを検索して選択します。Max Walk Speed の float 値 を「600 」に設定して、 InputAction Sprint ノードの Released 実行ピン を Set Max Walk Speed の実行入力ピン に接続します。
[Event Graph] を右クリックして、ドロップダウン メニューで、 Input Action Crouch を検索して選択します。
InputAction Crouch ノードの Pressed 実行ピン を引き出して、ドロップダウン メニューで Character クラス関数 Crouch を検索して選択します。
InputAction Crouch ノードの Released 実行ピン を引き出して、Actions ドロップダウン メニューで Character クラス関数 Un Crouch を検索して選択します。
ブループリントを コンパイル して 保存 します。
完成したブループリント
完成したブループリントは以下の画像のようになります。
Move Forward 、Move Right 、Look Up 、Turn の入力イベントに対するコード スクリプト ロジックが完了しました。次に Jump 、Crouch 、Sprint に対する入力イベントの実装を完了する必要があります。
PlayerCharacter.h ファイルに移動して以下のクラス メソッドを宣言します。
protected:
//キャラクターの移動速度をスプリント値に設定します。
void BeginSprint();
//キャラクターの移動速度をデフォルトの速度に戻します。
void EndSprint();
//キャラクターに Crouch (しゃがむ) ように依頼します
void BeginCrouch();
//Request for Character to EndCrouch
void EndCrouch();
PlayerCharacter.cpp ファイルで**APlayerCharacter::BeginSprint and APlayerCharacter::EndSprint** クラス メソッドに対して次のロジックを実装します。
void APlayerCharacter::BeginSprint()
{
GetCharacterMovementComponent()->MaxWalkSpeed = 1000.0f;
}
void APlayerCharacter::EndSprint()
{
GetCharacterMovementComponent()->MaxWalkSpeed = 600.f;
}
APlayerCharacter::BeginCrouch メソッドと APlayerCharacter::EndCrouch メソッドに以下のロジックを実装します。
void APlayerCharacter::BeginCrouch()
{
Crouch();
}
void APlayerCharacter::EndCrouch()
{
UnCrouch();
}
APlayerCharacter:: ::SetupPlayerInputComponent メソッドに移動して以下のコードを宣言します。
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
PlayerInputComponent->BindAction("Jump",IE_Pressed,this,&ACharacter::Jump);
PlayerInputComponent->BindAction("Jump",IE_Released,this,&ACharacter::StopJumping);
PlayerInputComponent->BindAction("Crouch",IE_Pressed,this,&APlayerCharacter::BeginCrouch);
PlayerInputComponent->BindAction("Crouch",IE_Released,this,&APlayerCharacter::EndCrouch);
PlayerInputComponent->BindAction("Sprint",IE_Pressed,this,&APlayerCharacter::BeginSprint);
PlayerInputComponent->BindAction("Sprint",IE_Released,this,&APlayerCharacter::EndSprint);
}
コードを コンパイル します。
完成コード
PlayerCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayerCharacter.generated.h"
UCLASS()
class CHARACTERMOVEMENT_API APlayerCharacter : public ACharacter
{
GENERATED_BODY()
public:
// このキャラクターのプロパティのデフォルト値を設定します
APlayerCharacter();
protected:
// ゲームの開始またはスポーン時に呼び出されます
virtual void BeginPlay() override;
//スプリング アーム コンポーネントで、プレイヤーの背後のカメラを負います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class USpringArmComponent* SpringArmComp;
//プレイヤーはカメラを追います。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
class UCameraComponent* CameraComp;
//前方/後方の入力が呼び出されます
void MoveForward(float InputAxis);
//Called for left/right side input
void MoveRight(float InputAxis);
//キャラクターの移動速度をスプリント値に設定します。
void BeginSprint();
//キャラクターの移動速度をデフォルトの速度に戻します。
void EndSprint();
//キャラクターに Crouch (しゃがむ) ように依頼します
void BeginCrouch();
//Request for Character to EndCrouch
void EndCrouch();
public:
// フレームごとに呼び出されます
virtual void Tick(float DeltaTime) override;
// 機能を入力にバインドするために呼び出されます
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
PlayerCharacter.cpp
#include "PlayerCharacter.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
// デフォルト値を設定します
APlayerCharacter::APlayerCharacter()
{
// Tick()を毎フレーム呼び出すように設定します。必要なければ、これをオフにしてパフォーマンスを向上させることができます。
PrimaryActorTick.bCanEverTick = true;
// クラスコンポーネントをインスタンス化します
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComp"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
//キャラクタメッシュのトランスフォームの位置と回転を設定します
GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -90.0f), FQuat(FRotator(0.0f, -90.0f, 0.0f)));
// デフォルト キャラクタのスケルタル メッシュ コンポーネントにクラス コンポーネントをアタッチします。
SpringArmComp->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(SpringArmComp,USpringArmComponent::SocketName);
//スプリング アームのクラス変数を設定します
SpringArmComp->bUsePawnControlRotation = true;
//キャラクター移動コンポーネントのクラス変数を設定します
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->bUseControllerDesiredRotation = true;
GetCharacterMovement()->bIgnoreBaseRotation = true;
}
// ゲームの開始またはスポーン時に呼び出されます
void APlayerCharacter::BeginPlay()
{
Super::BeginPlay();
}
void APlayerCharacter::MoveForward(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが前方かを見つけます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// 前方ベクターを取得します
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, AxisValue);
}
}
void APlayerCharacter::MoveRight(float AxisValue)
{
if ((Controller != nullptr) && (AxisValue != 0.0f))
{
// どちらが右側かを見つけます
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// 右側ベクターを取得します
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// その方向に移動を追加します
AddMovementInput(Direction, AxisValue);
}
}
void APlayerCharacter::BeginSprint()
{
GetCharacterMovementComponent()->MaxWalkSpeed = 1000.0f;
}
void APlayerCharacter::EndSprint()
{
GetCharacterMovementComponent()->MaxWalkSpeed = 600.f;
}
void APlayerCharacter::BeginCrouch()
{
Crouch();
}
void APlayerCharacter::EndCrouch()
{
UnCrouch();
}
// フレームごとに呼び出されます
void APlayerCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// 機能を入力にバインドするために呼び出されます
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward",this, &APlayerCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &APlayerCharacter::MoveRight);
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
PlayerInputComponent->BindAction("Jump",IE_Pressed,this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump",IE_Released,this, &ACharacter::StopJumping);
PlayerInputComponent->BindAction("Crouch",IE_Pressed,this,&APlayerCharacter::BeginCrouch);
PlayerInputComponent->BindAction("Crouch",IE_Released,this,&APlayerCharacter::EndCrouch);
PlayerInputComponent->BindAction("Sprint",IE_Pressed,this, &APlayerCharacter::BeginSprint);
PlayerInputComponent->BindAction("Sprint",IE_Released,this, &APlayerCharacter::EndSprint);
}
Game Mode を設定する
GameMode はゲームのルールを一通り定義します。これらのルールには、ゲームの起動時にプレイヤーがスポーンするデフォルト ポーンが含まれます。作成したプレイヤー キャラクターをスポーンするためにこれらのルールを設定する必要があります。
コンテンツ ブラウザ で、 [Add/Import (追加/インポート)] ボタンをクリックして新しい Blueprint クラスを作成します。[Pick a Parent Class (親クラスを選択)] メニューが表示されたら、 [Game Mode Base (ゲーム モード ベース)] を選択して、新しい Gamemode クラスに「Bp_GameMode 」という名前を付けます。
Bp_GameMode をダブルクリックして、[Class Defaults (クラスのデフォルト)] を開き、 [Details (詳細)] パネルの [Classes (クラス)] カテゴリ に移動して、 [Default Pawn Class (デフォルト ポーン クラス)] で Bp_PlayerCharacter を選択します。
ブループリントを コンパイル して 保存 します。
[Edit] > [Project Settings] > [Maps & Modes] の順に選択し、Default Modes カテゴリで Bp_GameMode を選択します。
Game Mode はゲームのルールを一通り定義します。これらのルールには、ゲームの起動時にプレイヤーがスポーンするデフォルト ポーンが含まれます。作成したプレイヤー キャラクターをスポーンするためにこれらのルールを設定する必要があります。
エディタで C++ クラス フォルダへ移動します。CharacterMovementGameModeBase を右クリックし、[C++ Class] アクション メニューのドロップダウンから、[Create Blueprint class based on your CharacterMovementGameModeBase] を選択して「Bp_GameMode 」と名前を付けます。
Bp_GameMode をダブルクリックして クラス デフォルト を開き、[Details] パネルの [Classes] カテゴリ へ移動して Default Pawn Class に Bp_PlayerCharacter を選択します。
ブループリントを コンパイル して 保存 します。
[Edit] > [Project Settings] > [Maps & Modes] の順に選択し、Default Modes カテゴリで Bp_GameMode を選択します。
Locomotion ブレンド スペースを作成する
レベル内で動くための入力機能を備えるキャラクターを作成できたので、次は動きのステート (ダッシュ、ジョギング、しゃがみ歩き) に応じた ブレンド スペース を作成する必要があります。
ブレンド スペース は、2 つの入力の値に基づいてアニメーションをブレンドできる特別なアセットです。キャラクターの移動速度や方向に応じて、前後左右に動く独自のブレンド スペースを作成します。
コンテンツ ブラウザ で、 [Add/Import (追加/インポート)] > [Animation (アニメーション)] > [BlendSpace] をクリックします。スケルトンを選択するように求めるプロンプトが表示されたら、 UE4_Mannequin_Skeleton を選択して、ブレンド スペースに「Locomotion_BS 」という名前を付けます。
ダブルクリックして、 Locomotion_BS ブレンド スペースを開きます。[Asset Details (アセット詳細)] タブの [Axis Settings (軸設定)] カテゴリで、 [Horizontal Axis (横軸)] および [Vertical Axis (縦軸)] の横にある矢印を選択して、変数の詳細を表示します。
[Horizontal Axis (横軸)] 設定で、 Name 変数を Direction に変更して、 Minimum Axis Value を「-180 」に、 Maximum Axis Value を「180 」に設定します。
[Vertical Axis (縦軸)] 設定で、 Name 変数を Speed に変更して、 Maximum Axis Value を「1000 」に設定します。
コンパイル して 保存 します。
[Asset Browser (アセット ブラウザ)] に移動して、[Filters (フィルタ)] 検索バーに 「Idle_Rifle_Hip 」と入力して、 Idle_Rifle_Hip アセットを ブレンド スペース の Direction 0.0 および Speed 0.0 のポイントにドラッグアンドドロップします。
このステップを繰り返して、 Idle_Rifle_Hip のアセットを以下のポイントに挿入します。
Direction 180 , Speed 0 .
Direction 90 , Speed 0 .
Direction -90 , Speed 0 .
Direction -180 , Speed 0 .
[Asset Browser] タブで、[Filters] 検索バーに「_Ironsights 」と入力して、 Walk_Fwd_Rifle_Ironsights アセットを ブレンド スペース の Direction 0.0 および Speed 250 のポイントにドラッグアンドドロップします。
次に、 [Asset Browser] タブで、 [Filters ] 検索バーに「Walk_Lt_Rifle_Ironsights 」と入力して、 Walk_Lt_Rifle_Ironsights アセットを ブレンド スペース の Direction -90 および Speed 250 のポイントにドラッグアンドドロップします。
[Asset Browser] タブで、[Filters] 検索バーに 「Walk_Rt_Rifle_Ironsights」 と入力して、 Walk_Rt_Rifle_Ironsights アセットを ブレンド スペース の Direction 90 および Speed 250 のポイントにドラッグアンドドロップします。
[Asset Browser] タブで、[Filters] 検索バーに「Walk_Bwd_Rifle_Ironsights 」と入力して、 Walk_Bwd_Rifle_Ironsights アセットを ブレンド スペース の Direction 180 および Speed 250 のポイントにドラッグアンドドロップし、さらに Direction -180 および Speed 250 ドラッグアンドドロップします。
[Asset Browser] タブで、 [Filters ] 検索バーに「Jog_Fwd_Rifle 」と入力して、 Jog_Fwd_Rifle アセットを ブレンド スペース の Direction 0.0 および Speed 500 のポイントにドラッグアンドドロップします。
[Asset Browser (アセット ブラウザ)] に移動して、[Filters] 検索バーに「Jog_Lt_Rifle 」と入力して、 Jog_Lt_Rifle アセットを ブレンド スペース の Direction -90 および Speed 500 のポイントにドラッグアンドドロップします。
[Asset Browser] に移動して、[Filters] 検索バーに「Jog_Rt_Rifle 」と入力して、 Jog_Rt_Rifle アセットを ブレンド スペース の Direction 90 および Speed 500 のポイントにドラッグアンドドロップします。
[Asset Browser] で、[Filters] 検索バーに「Jog_Bwd_Rifle_Ironsights 」と入力して、 Jog_Bwd_Rifle_Ironsights アセットを ブレンド スペース の Direction 180 および Speed 500 のポイントにドラッグアンドドロップし、さらにもう 1 つの Jog_Bwd_Rifle_Ironsights アセットを Direction -180 および Speed 500 のポイントにドラッグアンドドロップします。
[Asset Browser] で「Sprint_Fwd_Rifle_Ironsights 」を検索して選択し、 Sprint_Fwd_Rifle_Ironsights アセットを ブレンド スペース の Direction 0 および Speed 1000 のポイントにドラッグアンドドロップして、ブレンド スペースを完成させます。
コンパイル して 保存 します。
完成した Locomotion_BS は以下の画像のようになります。
Crouch Locomotion ブレンド スペースを作成する
Locomotion ブレンド スペースが完成したので、次は Crouch Locomotion ブレンド スペースを作成する必要があります。
コンテンツ ブラウザ で、 [Add/Import (追加/インポート)] > [Animation (アニメーション)] > [BlendSpace] をクリックします。スケルトンを選択するように求めるプロンプトが表示されたら、 UE4_Mannequin_Skeleton を選択して、ブレンド スペースに「LocomotionCrouch_BS 」という名前を付けます。
ダブルクリックして、 Locomotion_BS ブレンド スペースを開きます。[Asset Details (アセット詳細)] タブの [Axis Settings (軸設定)] カテゴリで、 [Horizontal Axis (横軸)] および [Vertical Axis (縦軸)] の横にある矢印を選択して、変数の詳細を表示します。
[Horizontal Axis (横軸)] 設定で、 Name 変数を Direction に変更して、 Minimum Axis Value を「-180 」に、 Maximum Axis Value を「180 」に設定します。
[Vertical Axis (縦軸)] 設定で、Name 変数を Speed に変更して、 Maximum Axis Value を「300 」に設定します。
前の「Locomotion ブレンド スペースを作成する」セクションの手順を繰り返して、アセットをブレンド スペースの以下の値のポイントに配置します。
アニメーション アセットの名前
Speed
Direction
Crouch_Idle_Rifle_Hip
0
0, 90, -90, 180, -180
Crouch_Walk_Fwd_Rifle_Hip
300
0
Crouch_Walk_Lt_Rifle_Hip
300
-90
Crouch_Walk_Rt_Rifle_Hip
300
90
Crouch_Walk_Bwd_Rifle_Hip
300
180, -180
LocomotionCrouch_BS を保存してコンパイルします。
完成した LocomotionCrouch_BS ブレンド スペースは以下の画像のようになります。
Animation ブループリントを作成する
プレイヤーの現在のアクションに基づいて、どのようなキャラクター アニメーションを再生するかを決定する、 Animation ブループリント が必要です。さらに、 Walk ステートおよび Crouch ステートを作成して、ステート間の遷移を設定するためには、 ステート マシン を設定する必要があります。
コンテンツ ブラウザ で、 [Add/Import (追加/インポート)] > [Animation (アニメーション)] > [Animation Blueprint (アニメーション ブループリント)] をクリックします。スケルトンを選択するように求めるプロンプトが表示されたら、 UE4_Mannequin_Skeleton を選択して、アニメーション ブループリントに「PlayerCharacter_AB 」という名前を付けます。
PlayerCharacter_AB をダブルクリックして、アニメーション ブループリントを開きます。[My Blueprint (マイ ブループリント)] タブで、 Variables カテゴリ に移動して、横の + 記号を選択し Is Crouched および Is Jumping という名前の 2 つの ブール 変数を作成します。
[Event Graph (イベント グラフ)] タブをクリックして、 Try Get Pawn Owner ノードの Return Value ピンを引き出して、ドロップダウン メニューで Cast to BP_PlayerCharacter を検索して選択します。
Cast to BP_PlayerCharacter ノードの As BP_PlayerCharacter Return ピンを引き出して、 Get Is Crouched を検索して選択します。
[My Blueprint] タブに移動して、 Variable カテゴリから Is Crouched 変数を Get Is Crouched ノードの Return ピンにドラッグアンドドロップします。
Cast To BP_PlayerCharacter ノードの 出力実行ピン を引き出して、 Set Is Crouched ノードの 入力 実行ピンに接続します。
Cast to BP_PlayerCharacter ノードの As BP_PlayerCharacter Return ピンを引き出して、 All Actions ドロップダウン メニューで Get Pressed Jump を検索して選択します。
[My Blueprint] から、 Variable カテゴリに移動して、 Is Jumping 変数を Get Pressed Jump ノードの Return ピンにドラッグアンドドロップします。
Set Is Crouched ノードの 出力実行ピン を引き出して、 Set Is Jumping ノードの 入力実行ピン に接続します。
PlayerCharacter_AB アニメーション ブループリントを コンパイル して 保存 します。
Variables カテゴリで横の + 記号を選択して、 Speed および Direction という名前の 2 つの Float 型変数 を作成します。
Cast to BP_PlayerCharacter ノードの As BP_PlayerCharacter Return ピンを引き出して、 [Context Sensitive] チェックボックスを オン にして、 Get Velocity を検索して選択します。
Get Velocity ノードの Return Value ピンを引き出して、 Actions ドロップダウン メニューで Vector Length を検索して選択します。
[My Blueprint] タブで、 Speed 変数を Vector Length ノードの ベクター型の Return Value ピンにドラッグアンドドロップします。
次に、 Set Is Jumping ノードの 実行出力ピン を Set Speed ノードの 実行入力ピン に接続します。
Cast to BP_PlayerCharacter ノードの As BP_PlayerCharacter Return ピンを引き出して、 Get Actor Rotation を検索して選択します。
GetActorRotation ノードのローテータ型の Return Value ピンを引き出して、 Actions ドロップダウン メニューで Calculate Direction を検索して選択します。
次に、 Get Velocity ノードのベクター型の Return Value ピンを引き出して、 Calculate Direction ノードの Velocity 入力ピンに接続します。
[My Blueprint] タブで、 Direction 変数をクリックして、 Calculate Direction ノードの float 型の Return Value ピンにドロップします。
次に、 Set Speed ノードの 実行出力ピン を Set Direction ノードの 実行入力ピン に接続します。
Event Blueprint Update Animation ノードの 実行出力ピン を引き出して、 Cast To BP_PlayerCharacter ノードに接続します。
PlayerCharacter_AB アニメーション ブループリント を コンパイル して 保存 します。
完成した アニメーション イベント グラフ は以下の画像のようになります。
アニメーション ステート マシンを作成する
ステート マシン は、スケルタル メッシュのアニメーションを一連の ステート に編成するグラフィカルなビジュアリゼーションを提供します。そのステートは、ステート間のブレンド方法を制御する 遷移ルール によって管理されます。前のセクションで作成した異なるロコモーション ブレンド スペース間を遷移するには、ブール変数を使用します。
PlayerCharacter_AB アニメーション ブループリントで、 [Anim Graph (アニメーション グラフ)] に移動します。
AnimGraph を右クリックして、 Actions ドロップダウン メニューで、 Add New State Machine を検索して選択します。
State Machine ノードの名前を Locomotion に変更して、このノードをダブルクリックしてグラフを開きます。Entry ピンを引き出して、 Actions ドロップダウン メニューで Add State を選択します。
新しいステートに Movement という名前を付けて、ダブルクリックして Movement State ノードを開きます。[Asset Browser] に移動して、 Locomotion_BS を検索してクリックし、グラフにドラッグします。
[My Blueprint] タブから Speed Float 型変数をブレンド スペースの Speed vertical axis にドラッグします。
[My Blueprint] タブに戻って、 Direction Float 型変数をブレンド スペースの Direction horizontal axis にドラッグします。
アニメーション ポーズ 出力ピンを Output Animation Pose ノードの アニメーション ポーズ Result ピン に接続します。
コンパイル して 保存 します。
Locomotion のステート マシン に戻って、Movement ステート ノードをクリックアンドドラッグして、 Crouch Movement という名前のアニメーション ステートを新規に作成します。
Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
[My Blueprint] タブで、 Variables カテゴリに移動して、ブール値 Is Crouched を Result ノードの Can Enter Transition 入力ピン にドラッグします。
Locomotion ステート マシン グラフ に戻って、 Crouch Movement ステート をダブルクリックしてアニメーション グラフを開きます。[Asset Browser] で、 LocomotionCrouch_BS を検索してクリックし、グラフにドラッグします。
[My Blueprint] タブで、 Variables カテゴリに移動して、Speed float 型変数と Direction float 型変数を LocomotionCrouch_BS の各ピンにドラッグして、LocomotionCrouch_BS の アニメーション ポーズ を Output Animation Pose の Result ピンに接続します。
アニメーション ブループリントを コンパイル して 保存 します。
Locomotion アニメーション グラフ に戻って、 CrouchMovement アニメーション ステート をクリックしてドラッグし、 Movement アニメーション ステート に接続します。
Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
[My Blueprint] タブで、 Is Crouched ブール変数をアニメーション グラフにクリックアンドドラッグして、 Get Is Crouched を選択し、その 出力ピン を引き出して、[Actions] ドロップダウン メニューで NOT Boolean を検索して選択します。
次に、 ブール型 NOT の Return ピン を Can Enter Transition 入力ピンに接続します。
コンパイル して 保存 します。
アニメーション グラフ に戻って、 Movement アニメーション ステート をクリックしてドラッグし、 Add State を選択します。
この アニメーション ステート の名前を「Jump 」に変更してから、ダブルクリックしてアニメーション グラフを開きます。[Asset Browser] に移動して、 Jump_From_Jog を検索してから、クリックしてグラフにドラッグします。
Play Jump_From_Jog のアニメーション ポーズを Output Animation Pose の Result ピンに接続して、このアニメーション ステートを完成させます。
Locomotion アニメーション グラフ に戻って、 Movement to Jump Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
Transition Rule アニメーション グラフ 内で、 [My Blueprint] タブ に移動して、 Is Jumping ブール変数を Result ノードの Can Enter Transition 入力ピン にドラッグします。
Locomotion アニメーション グラフ に戻って、 Jump アニメーション ノードをクリックしてドラッグし、 Create a transition で Movement アニメーション グラフ ノードへの遷移を作成します。
Jump to Movement Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
[My Blueprint] タブで、 Is Crouched ブール変数と Is Jumping ブール変数をクリックして アニメーション グラフ にドラッグし、それらの出力ピンをそれぞれ引き出して、[Actions] ドロップダウン メニューで NOT Boolean を検索して選択します。
ブール型 NOT の出力ピン を引き出して、 AND Boolean を検索して選択します。
Is Crouched と Is Jumping NOT Boolean ノードの両方の出力ピンを AND Boolean ノードの入力ピン に接続して、 AND Boolean の出力ピン を Result ノードの Can Enter Transition 入力ピン に接続します。
Locomotion アニメーション グラフ に戻って、 Crouch ノードをクリックしてドラッグし、 Create a transition で Jump ノードへの遷移を作成します。
Crouch Movement to Jump Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
CrouchMovement to Jump 遷移ルール アニメーション グラフ 内で、 [My Blueprint] タブに移動して、 Is Jumping ブール変数をクリックして Result ノードの Can Enter Transition 入力ピンにドラッグします。
Locomotion アニメーション グラフ に戻って、 Jump ノードをドラッグして、 Create a transition で CrouchMovement ノードへの遷移を作成します。
Jump to Crouch Movement Transition rule ノードをダブルクリックして、 アニメーション グラフ を開きます。
[My Blueprint] タブで、 Is Crouched ブール変数と Is Jumping ブール変数をクリックして アニメーション グラフ にドラッグします。
Is Jumping ブール型出力ピン を引き出して、Actions ドロップダウン メニューで NOT Boolean を検索して選択し、 Is Crouched ブール値の出力ピン**を引き出して、 AND Boolean を検索して選択します。 Is Jumping NOT Boolean の出力ピン を AND Boolean の入力ピン に接続して、 AND Boolean の出力ピン を Result ノードの Can Enter Transition ピン** に接続して、遷移ルールを完成させます。
完成した Locomotion アニメーション グラフ は以下の画像のようになります。
AnimGraph に戻って、 Locomotion のポーズ出力ピン を Output Pose ノードの Result ピン に接続します。
コンパイル して 保存 します。
コンテンツ ブラウザ で Bp_PlayerCharacter をダブルクリックして [Class Defaults (クラスのデフォルト)] を開き、 [Components (コンポーネント)] タブで Mesh コンポーネント を選択して、 [Details (詳細)] パネルの [Animation (アニメーション)] カテゴリ に移動して、 Anim Class 変数ドロップダウン メニュー で、 PlayerCharacter_AB を検索して選択します。
結果
これでロジックをテストできるようになりました。ツールバーで [Play (PIE)] を選択すると、W、A、S、D キーでキャラクターの動きを制御できます。ダッシュするには、左の Shift キーを押しながらクリックします。しゃがむには、左の Ctrl キーを押しながらクリックします。ジャンプするには、スペース バーを押します。