【UE5 C++】Unreal Engine で テトリス風ゲームを作ってみる#4
前回のつづき
前回は、テトリミノの落下動作とブロックとの衝突判定について確認した。今回は、フィールドの作成とカメラ設定について確認する。
Unreal Engine Version 5.3.2
カメラ画角の設定(OrthoWidth)
Unity では、高さ(OrthographicSize)を指定することで画角サイズを決定したが、Unreal Engine では、幅(OrthoWidth)を指定することで画角サイズを決定する。そこで、Unity の時とは計算方法を変更して、縦方向の高さを決定してから、それにアスペクト比を掛けることで横方向の幅を決定する。
上図から、
-
- Aspect比 = 16:9 = 1.7777
- OrthoWidth = 4444.44 (Unit)
- Offset X = 1622.22 (Unit)
- Offset Y = 200 (Unit)
となる。また、カメラアクターの位置を座標(0,0)にしている都合上、Field 原点は画角の幅/2, 高さ/2 だけマイナス方向にずらした位置となる。
TetrisField.cpp の抜粋
Field を表現するためField アクタークラスを作成した。このアクターを親にして、フィールド枠のブロックを生成して子アクターとする。
計算結果から定数を定義。
- const float ATetrisField::BLOCK_SIZE = 100.0f;
- const float ATetrisField::FIELD_OFFSET_X = 1622.22;
- const float ATetrisField::FIELD_OFFSET_Y = 200;
- const float ATetrisField::ORTHO_WIDTH = 4444.44;
ゲーム開始時点でフィールド枠を生成するために、BeginPlay () メソッドの中からInit() 関数をコールするようにする。
後は、Unity の時と同じように左右と下にブロックで枠を作る。
- void ATetrisField::Init() {
- // Set Field Base position to Bottom Left
- SetActorLocation(
- FVector(
- FIELD_OFFSET_X - ORTHO_WIDTH*0.5,
- 0,
- FIELD_OFFSET_Y - (ORTHO_WIDTH*9.0/16.0)*0.5));
- // Create Field Area
- // Bottom Wall
- for (int x = 0; x < (FIELD_WIDTH+FIELD_SIDE_WIDTH*2); x++) {
- CreateBlocks(FVector(x*BLOCK_SIZE, 0, 0));
- }
- // Left and Right Wall
- for (int y = 0; y < (FIELD_HEIGHT+FIELD_BOTTOM_WIDTH); y++) {
- CreateBlocks(FVector(0, 0, y*BLOCK_SIZE));
- CreateBlocks(FVector*1;
- }
- }
- void ATetrisField::CreateBlocks(FVector pos) {
- // Folder name should be Game instead of Content
- FString path =
- FString(TEXT("/Game/TetrisLikeTest1/BluePrints/BP_Block.BP_Block_C"));
- TSubclassOf<class AActor> blockbp =
- TSoftClassPtr<AActor>(FSoftObjectPath(*path)).LoadSynchronous();
- AActor* pBlockActor = GetWorld()->SpawnActor(blockbp);
- pBlockActor->AttachToActor(this, FAttachmentTransformRules::KeepRelativeTransform);
- TObjectPtr<USceneComponent> pSceneComponent = pBlockActor->GetRootComponent();
- pSceneComponent->SetRelativeLocation(pos);
- BlockActors.Add (pBlockActor);
- }
上記を実行した結果がこちら。
次の記事
Unreal Engine で テトリス風ゲームを作ってみる#5 - 独習 Unity アプリ開発
*1:FIELD_WIDTH+FIELD_SIDE_WIDTH)*BLOCK_SIZE, 0, y*BLOCK_SIZE