簡単な2Dゲームを作ろう
2Dゲーム制作の練習シリーズです。
アンリアルエンジンで2Dゲーム制作方法をまとめていきます。
説明を省略したり、細かな数値設定などの説明をしない場合もありますので、ご参考程度で確認ください。
※作業環境:UEバージョン5.3.2 Windows11 VSCode
プレイヤーの敗北を実装
プレイヤーが敵に当たったときに、ゲームをリセットするようにしていきます。
「PlayerCharacter」のコードを編集する
「PlayerCharacter」のコードを編集していきます。
PlayerCharacter.h
デリゲートを追加します。
#include "PlayerCharacter.generated.h"
// 追加↓
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPlayerDiedDelegate);
// ここまで↑
「public:」内に、プロパティとデリゲートを宣言します。
// 追加↓
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
bool IsAlive = true;
// ここまで↑
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ShootCooldownDurationInSecond = 0.3f;
FTimerHandle ShootCooldownTimer;
// 追加↓
FPlayerDiedDelegate PlayerDiedDelegate;
// ここまで↑
関数も追加します。
void OnShootCooldownTimerTimeout();
// 追加↓
UFUNCTION()
void OverlapBegine(UPrimitiveComponent* OverlapperComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
// ここまで↑
};
PlayerCharacter.cpp
インクルードを追加します。
#include "Kismet/KismetMathLibrary.h"
// 追加↓
#include "Enemy.h"
// ここまで↑
追加した関数の定義を作成します。
// 関数定義
void APlayerCharacter::OverlapBegine(UPrimitiveComponent *OverlapperComponent, AActor *OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult)
{
AEnemy* Enemy = Cast<AEnemy>(OtherActor); // キャストする
if (Enemy && Enemy->IsAlive) // キャスト成功かつ敵が生きている場合
{
if (IsAlive) // プレイヤーが生存していれば
{
IsAlive = false; // プレイヤーの敗北を示す
CanMove = false; // 移動出来なくする
CanShoot = false; // 魔法を発射できなくする
PlayerDiedDelegate.Broadcast(); // プレイヤーが敗北したときの処理を実行する
}
}
}
「APlayerCharacter::BeginPlay(){}」にコードを追加します。
UEnhancedInputLocalPlayerSubsystem *Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
if (Subsystem)
{
Subsystem->AddMappingContext(InputMappingContext, 0);
}
}
// 追加↓
CapsuleComp->OnComponentBeginOverlap.AddDynamic(this, &APlayerCharacter::OverlapBegine); // 接触処理を設定する
// ここまで↑
}
「EnemySpawner」のコードを編集する
プレイヤーの敗北処理を作成して、デリゲートに関連付けるコードを追加していきます。
EnemySpawner.h
「public:」内に関数を追加します。
UFUNCTION()
void OnEnemyDied();
// 追加↓
UFUNCTION()
void OnPlayerDied();
// ここまで↑
};
EnemySpawner.cpp
追加した関数の定義を作成します。
// 関数定義
void AEnemySpawner::OnPlayerDied()
{
StopSpawning(); // 敵の生成を止める
TArray<AActor*> EnemyArray; // アクタの配列を作成する
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AEnemy::StaticClass(), EnemyArray); // すべての敵のクラスを配列に保管する
for (AActor *EnemyActor : EnemyArray) // 配列内のアクタを1つずつ処理する
{
AEnemy* Enemy = Cast<AEnemy>(EnemyActor); // キャストする
if (Enemy && Enemy->IsAlive) // キャスト成功かつ敵が生きていれば
{
Enemy->CanFollow = false; // 追跡をオフにする
}
}
MyGameMode->ResetLevel(false); // プレイヤーが敗北したので、レベルを再呼び出しする
}
「ResetLevel()」の関数は、以下の記事で作成しています。
「AEnemySpawner::BeginPlay(){}」にコードを追加します。
AActor *PlayerActor = UGameplayStatics::GetActorOfClass(GetWorld(), APlayerCharacter::StaticClass());
if (PlayerActor)
{
Player = Cast<APlayerCharacter>(PlayerActor);
// 追加↓
Player->PlayerDiedDelegate.AddDynamic(this, &AEnemySpawner::OnPlayerDied); // デリゲートに関数を関連付ける
// ここまで↑
}
保存して、リフレッシュ&コンパイルします。
テストプレイする
テストプレイします。
敵と接触したときに、ゲームがリセットされ、初めの状態に戻ればOKです。
プレイヤーの敗北実装完了
今回はここまでです。
次回は「効果音をつける」です。
前後記事
前回の記事
・スコア表示するUIを作成する
次回の記事
・効果音をつける
他の記事を探す
他の記事も気になる方は、以下の記事の目次を確認ください。