広告あり

Unreal Engine コツコツ自習_プレイヤーの敗北を実装する【2Dゲーム】

UEコツコツ自習シリーズ
スポンサーリンク

簡単な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です。

プレイヤーの敗北実装完了

今回はここまでです。

次回は「効果音をつける」です。

前後記事

他の記事を探す

他の記事も気になる方は、以下の記事の目次を確認ください。

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