独習 Unity アプリ開発

独習でスマフォ向けアプリ開発を勉強中

【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 アクタークラスを作成した。このアクターを親にして、フィールド枠のブロックを生成して子アクターとする。

 

計算結果から定数を定義。

  1. const float ATetrisField::BLOCK_SIZE = 100.0f;
  2. const float ATetrisField::FIELD_OFFSET_X = 1622.22;
  3. const float ATetrisField::FIELD_OFFSET_Y = 200;
  4. const float ATetrisField::ORTHO_WIDTH = 4444.44;

 

ゲーム開始時点でフィールド枠を生成するために、BeginPlay () メソッドの中からInit() 関数をコールするようにする。

後は、Unity の時と同じように左右と下にブロックで枠を作る。

  1. void ATetrisField::Init() {
  2.     // Set Field Base position to Bottom Left
  3.     SetActorLocation(
  4.         FVector(
  5.             FIELD_OFFSET_X - ORTHO_WIDTH*0.5,
  6.             0,
  7.             FIELD_OFFSET_Y - (ORTHO_WIDTH*9.0/16.0)*0.5));
  8.  
  9.     // Create Field Area
  10.     // Bottom Wall
  11.     for (int x = 0; x < (FIELD_WIDTH+FIELD_SIDE_WIDTH*2); x++) {
  12.         CreateBlocks(FVector(x*BLOCK_SIZE, 0, 0));
  13.     }
  14.  
  15.     // Left and Right Wall
  16.     for (int y = 0; y < (FIELD_HEIGHT+FIELD_BOTTOM_WIDTH); y++) {
  17.         CreateBlocks(FVector(0, 0, y*BLOCK_SIZE));
  18.         CreateBlocks(FVector*1;
  19.     }
  20. }
  21.  
  22. void ATetrisField::CreateBlocks(FVector pos) {
  23.     // Folder name should be Game instead of Content    
  24.     FString path =
  25.         FString(TEXT("/Game/TetrisLikeTest1/BluePrints/BP_Block.BP_Block_C"));
  26.     
  27.     TSubclassOf<class AActor> blockbp =
  28.         TSoftClassPtr<AActor>(FSoftObjectPath(*path)).LoadSynchronous();
  29.     
  30.     AActor* pBlockActor = GetWorld()->SpawnActor(blockbp);    
  31.     pBlockActor->AttachToActor(this, FAttachmentTransformRules::KeepRelativeTransform);
  32.     TObjectPtr<USceneComponent> pSceneComponent = pBlockActor->GetRootComponent();
  33.     pSceneComponent->SetRelativeLocation(pos);
  34.     BlockActors.Add (pBlockActor);
  35. }
  36.  

 

 

上記を実行した結果がこちら。

Tetris Field

 

次の記事


Unreal Engine で テトリス風ゲームを作ってみる#5 - 独習 Unity アプリ開発

 

目次に戻る

*1:FIELD_WIDTH+FIELD_SIDE_WIDTH)*BLOCK_SIZE, 0, y*BLOCK_SIZE