広告あり

Unreal Engine コツコツ自習_障害物を作成する【2Dゲーム】

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

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

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

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

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

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

障害物の作成

C++クラスを作成する

「Tools」の「New C++ Class…」を選択します。

「Actor」クラスを選択します。

ファイル名は「Obstacle」にします。

コードファイルが作成できたら、プロジェクトをリフレッシュしておきます。

それではコード編集していきます。

Obstacle.h

コード内はお好みで整理しておいてください。

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

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
// 追加↓
#include "Components/CapsuleComponent.h"
#include "PaperSpriteComponent.h"
// ここまで↑
#include "Obstacle.generated.h"

「public:」内にコードを追加します。

public:	

// 追加↓
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	UCapsuleComponent* CapsuleComp;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	UPaperSpriteComponent* ObstaclSprite;
// ここまで↑	

	AObstacle();

	virtual void BeginPlay() override;

	virtual void Tick(float DeltaTime) override;

// 追加↓
	UFUNCTION()
	void OverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool FromSweep, const FHitResult& SweepResult);
// ここまで↑	

};

Obstacle.cpp

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

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

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

AObstacle::AObstacle()
{
	PrimaryActorTick.bCanEverTick = true;

    // 追加↓
	CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComp"));
	SetRootComponent(CapsuleComp);

	ObstaclSprite = CreateDefaultSubobject<UPaperSpriteComponent>(TEXT("ObstacleSprite"));
	ObstaclSprite->SetupAttachment(RootComponent);
    // ここまで↑
}

重なったときに処理を実行するためのコードを追加します。

void AObstacle::BeginPlay()
{
	Super::BeginPlay();
// 追加↓
	CapsuleComp->OnComponentBeginOverlap.AddDynamic(this, &AObstacle::OverlapBegin);
// ここまで↑
}

ここでは、ブループリントでいう「OnComponentBeginOverlap」ノードの処理を示しています。

ヘッダーファイルで追加した「void OverlapBegin(~)」の関数定義を作成します。

// 定義を作成
void AObstacle::OverlapBegin(UPrimitiveComponent *OverlappedComponent, AActor *OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBodyIndex, bool FromSweep, const FHitResult &SweepResult)
{
    // 処理を追加↓
	APlayerCharacter* Player = Cast<APlayerCharacter>(OtherActor); // キャストする
	if (Player) // キャストに成功したら
	{
		GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::White, TEXT("Overlapped with player!")); // デバックを表示 
	}
    // ここまで↑
}

保存して、リフレッシュ&コンパイルをします。

C++クラスのファイルが作成できました。

ブループリントを作成する

新しくブループリントクラスを作成します。

検索バーに「obstacle」と入力すると、先ほど作成したクラスが出てきますので選択して「Select」をクリックします。

ファイル名は「BP_Block」にします。

ファイルを開きます。

「Components」に、コードで追加した内容が反映されていると思います。

対応するコード

	// CapsuleCompを追加
    CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComp"));
	SetRootComponent(CapsuleComp);

    // ObstaclSpriteを追加
	ObstaclSprite = CreateDefaultSubobject<UPaperSpriteComponent>(TEXT("ObstacleSprite"));
	ObstaclSprite->SetupAttachment(RootComponent);

「ObstaclSprite(ObstacleSprite)」を選択した状態で設定を変更していきます。

「Sprite」の「Source Sprite」を用意したスプライトファイルに変更します。

「Materials」の「Element 0」を「TranslucentUnlitSpriteMaterial」に変更します。

「Collision」の「Collision Presets」を「NoCollision」に変更します。

コリジョン設定は「CapsuleComp」のほうを使うのでこっちは無しにしています。

「Translucency Sort Priority」の値を変更してスプライトの表示順を決めます。

「CapsuleComp(CapsuleComp)」に移ります。

コリジョンの大きさを調整して、スプライトを覆う範囲にします。

「Collision Presets」を「OverlapAllDynamic」にします。

これで重なったことを伝える仕組みは出来上がりました。

レベルに配置してプレイしてみます。

接触する左上にメッセージが出ればOKです。

次に、プレイヤーを停止させる処理をコードに加えていきます。

重なったら止まるようにコードを編集する

Obstacle.cpp

接触したらプレイヤーを止めるようにコードを変更します。

void AObstacle::OverlapBegin(UPrimitiveComponent *OverlappedComponent, AActor *OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBodyIndex, bool FromSweep, const FHitResult &SweepResult)
{
	APlayerCharacter* Player = Cast<APlayerCharacter>(OtherActor);
	if (Player)
	{
// 編集↓
		// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::White, TEXT("Overlapped with player!")); 
		if (Player->CanMove) // プレイヤーが移動可能状態の場合
		{
			Player->CanMove = false; // 移動出来なくする
		}
// ここまで↑
	}
}

コンパイルし、プレイしてみます。

障害物に当たった瞬間にプレイヤーが停止するようになりました。

障害物の作成完了

今回はここまでです。

次回は「ゲームのリセットを実装する」です。

前後記事

他の記事を探す

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

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