LoginSignup
0
0

More than 1 year has passed since last update.

ブロック崩しを作りながら学ぶ Unreal Engine #8 マスターデータ

Posted at

概要

マスターデータとはそのゲームにおいて不変のデータの事です。
マスターデータは、ブロック崩しで言えば、「あるステージでのブロック配置」、「ブロックを破壊した時に加算されるスコア」などがそれにあたります。逆に「現在のスコア」などプレー中に変化するデータはマスターデータではありません。この記事では Unreal Engine 上でマスターデータを扱う方法を、ブロック崩し作成を通して解説します。

環境

Windows 11
Unreal Engine 5.03
エディタ言語 英語

シリーズ記事

[UE4] ブロック崩しを作る #1 壁とボール
[UE4] ブロック崩しを作る #2 バーとブロック
[UE4] ブロック崩しを作る #3 C++
[UE4] ブロック崩しを作る #4 PlayerController (C++)
[UE4] ブロック崩しを作る #5 Debug (C++)
[UE4] ブロック崩しを作る #6 スコアUI (C++)
[UE4] ブロック崩しを作る #7 デリゲート(C++)

参考リンク

こちらを参考にさせて頂きました。ありがとうございます。

【UE4】DataTableの使い方-その① ~基本編~【★~★★】
UE4 DataTableからのパラメータ取得とJSONインポートについて
UE4 レベルブループリントのメモ
[UE4] C++で動的にアクターを生成(スポーン)する方法で一番実用的だった方法

BP編

構造体を作成

Content Drawer で右クリック
Blueprints → Structure を選択
作成された Structure を LevelDefinedStruct にリネーム
image.png

構造体を編集

LevelDefinedStruct をダブルクリックして編集画面を開く
以下の操作で SS にあるような構造体を設定する

  • 新規変数を追加 … + Add Variable ボタンをクリック
  • 変数名を変更 … テキストボックスを編集する
  • 変数の型を変更 … コンボボックスから選択
    image.png

Data Table を作成

Content Drawer で右クリック
Miscellaneous → Data Table を選択
(作成時に構造体を指定する必要があるので LevelDefinedStruct を選択)
image.png

Data Table を編集

作成した DataTable をダブルクリックして編集画面を開く
以下の操作で SS にあるような Data Table を設定する

  • 行追加 … 上部の Add ボタン
  • 選択行を削除 … 上部の Remove ボタン
  • 選択行を編集 ... 下部の Row Editor タブ画面から
    image.png

Data Tabel をゲームで読み込み

以下をゲームに実装します。これらは レベルブループリント上に実装する事にします。

  1. Data Tabel から初期ブロック配置を読み込み
  2. 読み込んだブロック配置通りにブロックを配置

レベルブループリントを開く

上部メニューから Open Level Blueprint を選択
image.png

レベルブループリントに実装

以下のノードを作成し、それぞれ SS にあるよう接続し BP を実装します。

  • Get Data Table Row Names ノード (DataTable の RowName をすべて取得する)
    • Table には作成した DataTabel を指定
  • For Each Loop ノード
  • Get Data Table Row LevelDataTable ノード (RowName の Rowデータを取得)
    • Table には作成した DataTabel を指定
  • Break LevelDefinedStruct ノード (Rowデータを LevelDefinedStruct に変換)
  • Make Vector ノード (Vector を生成)
  • Spawn Actor BP Block ノード (BP_Block 配置)
    image.png

ゲーム実行

前回まで作成していたブロック崩しから配置したブロックを全部削除します。
レベルBP をコンパイルして実行すると DataTable の座標通りにブロックが配置されるようになります。

image.png

C++編

同じことを BP ではなく C++ から行ってみます。

DataTabel 用の構造体(C++)を作成

上部メニュー Tools → New C++ Class..
image.png
親クラスに None を指定して Next
image.png
Name を Levelnfo に
image.png

Visual Studio が起動

  • LevelInfo.cpp は削除します
  • LevelInfo.h を以下のようにします
  • ビルド (ライブコーディングが有効な時は UEエディタ上で Ctrl + Alt + F11 します)
LevelInfo.h
#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "Engine/DataTable.h"
#include "LevelInfo.generated.h"

USTRUCT(BlueprintType)
struct FLevelInfo : public FTableRowBase
{
    GENERATED_USTRUCT_BODY()

public:

    FLevelInfo()
        : y(0.0f)
        , z(0.0f)
    {}

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float y;

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float z;
};

DataTable を作成

Content Drawer で右クリック
Miscellaneous → Data Table を選択
(作成時に構造体は FLevelInfo を選択)

DataTable を編集

BP編と同じようにブロック座標データを編集

Data Tabel をゲームで読み込み

レベルブループリントに実装

上部メニュー Tools → New C++ Class..
LevelScriptActor を選択して Next
MyLevelScriptActor が作成される
image.png

MyLevelScriptActor を以下のようにしてコンパイル

MyLevelScriptActor.h
#pragma once

#include "CoreMinimal.h"
#include "Engine/LevelScriptActor.h"
#include "Engine/DataTable.h"
#include "MyLevelScriptActor.generated.h"

/**
 * 
 */
UCLASS()
class BREAKBLOCKCPP_API AMyLevelScriptActor : public ALevelScriptActor
{
	GENERATED_BODY()
	
protected:
	virtual void BeginPlay() override;

	UPROPERTY(Category = "Test", EditAnywhere, BlueprintReadWrite)
	class UDataTable* MyDataTable;
};
MyLevelScriptActor.cpp
#include "MyLevelScriptActor.h"
#include "LevelInfo.h"

void AMyLevelScriptActor::BeginPlay()
{
    Super::BeginPlay();
 
    if (MyDataTable != nullptr)
    {
        auto _Names = MyDataTable->GetRowNames();
        for (int _Lp = 0; _Lp < _Names.Num(); _Lp++)
        {
            auto _Record = MyDataTable->FindRow<FLevelRow>(_Names[_Lp], FString());

            FString path = "/Game/BP_Block.BP_Block_C";
            TSubclassOf<class AActor> sc = TSoftClassPtr<AActor>(FSoftObjectPath(*path)).LoadSynchronous();
            if (sc != nullptr)
            {
                AActor* a = GetWorld()->SpawnActor<AActor>(sc);
                a->SetActorLocation(FVector(0, _Record->y, _Record->z));
            }
        }
    }
}

レベルブループリント の親クラスを MyLevelScriptActor に差し替え

上部メニューから Open Level Blueprint を選択してレベルブループリントを開く
上部メニューの Class Settings をクリック
表示された Details から Parent Class を MyLevelScriptActor に変更
image.png

上部メニューから Class Defaults をクリック
表示された Details から My Data Table を NewDataTable にセット
image.png

ゲーム実行

これで BP と同じようにプレイすると DataTable の座標通りにブロックが配置されるようになります。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0