簡単な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; // 移動出来なくする
}
// ここまで↑
}
}
コンパイルし、プレイしてみます。
障害物に当たった瞬間にプレイヤーが停止するようになりました。
障害物の作成完了
今回はここまでです。
次回は「ゲームのリセットを実装する」です。
前後記事
前回の記事
・GameModeクラスを作成する
次回の記事
・ゲームのリセットを実装する
他の記事を探す
他の記事も気になる方は、以下の記事の目次を確認ください。