Character Movement ではヒューマノイド キャラクターがワールドを移動するためのロコモーション システムを提供します。Character Movement コンポーネント は Actor コンポーネント です。歩行、落下、水泳、飛行など Character クラスの動作モードを提供します。さらに、Character Movement コンポーネントはネットワーク ゲームプレイ向けの堅固な統合機能を備えており、デベロッパーがネットワークでの動作をカスタムで作成できるフレームワークを提供します。
Unreal でのネットワーク レプリケーションに関するその他のドキュメントについては、「Networking (ネットワーキング)」を参照してください。
この操作ガイドでは、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 をオンにします。
-
[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 変数をオンにします。
-
[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 を選択します。
-
キャラクターの スケルタルメッシュ が以下の画像のように前を指している 矢印コンポーネント の方向を向いて表示されます。
-
コンパイル して 保存 します。
Input Key マッピングと Input Movement イベントを作成する
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);
}
Input Key マッピングと Input Action イベントを作成する
これで入力イベント 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 は、スケルタル メッシュの最終ポーズを評価するために使用します。
-
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 キーを押しながらクリックします。ジャンプするには、スペース バーを押します。