UE5.3を使用したゲーム制作備忘録を作成中!

モバイル向けゲームを作るため日々奮闘中!
同じ悩みを持つ人たちの、解決の糸口になれば幸いです。

詳細はこちら
PR
スポンサーリンク

Unreal Engine コツコツ自習_敵にプレイヤーを追跡させる【2Dゲーム】

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

簡単な2Dゲームを作ろう

2Dゲーム制作の練習シリーズです。

アンリアルエンジンで2Dゲーム制作方法をまとめていきます。

説明を省略したり、細かな数値設定などの説明をしない場合もありますので、ご参考程度で確認ください。

※作業環境:UEバージョン5.3.2 Windows11 VSCode

敵がプレイヤーを追跡

敵がプレイヤーの方向に向かって移動するようにしていきます。

コードを編集する

敵がプレイヤーを追いかけるコードを追加します。

Enemy.h

インクルードを追加します。

// 追加↓
#include "PlayerCharacter.h"
// ここまで↑

#include "Enemy.generated.h"

「public:」内に、プロパティを追加します。

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	UPaperFlipbookComponent* EnemyFlipbook;

// 追加↓
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	APlayerCharacter* Player;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	bool IsAlive = true;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	bool CanFollow = false;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float MovementSpeed = 50.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float StopDistance = 20.0f;
// ここまで↑

	AEnemy();

Enemy.cpp

インクルードを追加します。

#include "Enemy.h"

// 追加↓
#include "Kismet/GameplayStatics.h"
// ここまで↑

「AEnemy::BeginPlay(){}」内に、コードを追加します。

void AEnemy::BeginPlay()
{
	Super::BeginPlay();

// 追加↓
	if (!Player) // プレイヤーをまだ取得していない場合
	{
        AActor *PlayerActor = UGameplayStatics::GetActorOfClass(GetWorld(), APlayerCharacter::StaticClass()); // プレイヤーを取得する
		if (PlayerActor) // プレイヤーが存在するなら
	    {
            Player = Cast<APlayerCharacter>(PlayerActor); // キャストする
		    CanFollow = true; // 追跡モードをオン
	    }
    }
// ここまで↑

}

「AEnemy::Tick(float DeltaTime){}」内にコードを追加します。

void AEnemy::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

// 追加↓
	if (IsAlive && CanFollow && Player) // エネミーが生きていて、追跡モードオンで、プレイヤーが存在した場合
	{
		FVector CurrentLocaction = GetActorLocation(); // 現在の位置を取得する
		FVector PlayerLocation = Player->GetActorLocation(); // プレイヤーの位置を取得する

		FVector DirectionToPlayer = PlayerLocation - CurrentLocaction; // 座標を引いて
		float DistanceToPlayer = DirectionToPlayer.Length(); // 距離を計算する

		if (DistanceToPlayer >= StopDistance) // 停止距離より離れていれば
		{
			DirectionToPlayer.Normalize(); // 移動方向を取得する
			FVector NewLocation = CurrentLocaction + (DirectionToPlayer * MovementSpeed * DeltaTime); // 移動位置を計算する
			SetActorLocation(NewLocation); // 新しい位置に移動する
		}
	}
// ここまで↑

}

コードが編集できたので、保存してリフレッシュ&コンパイルします。

ブループリントを設定する

「BP_Enemy」を開いて、「Details」の「Enemy」の「Movement Speed」と「Stop Distance」の値を設定します。

・「Movement Speed」が移動速度を指定します。
・「Stop Distance」は、どこまで近づけるかを指定します。

対応するコード

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	APlayerCharacter* Player;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	bool IsAlive = true;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	bool CanFollow = false;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float MovementSpeed = 50.0f;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float StopDistance = 20.0f;

設定できたら、テストプレイします。

敵がプレイヤーを追いかけていればOKです。

敵の追跡行動実装完了

今回はここまでです。

次回は「魔法に当たり判定を付ける」です。

前後記事

他の記事を探す

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

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