12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unreal Engine (UE)Advent Calendar 2023

Day 2

今更触るSubSystem(c++初心者向け)

Posted at

はじめに

この記事はUnreal Engine (UE) Advent Calendar 2023 2日目の記事です。

おかず様の講演にでてくるSubSystemのBP拡張の作り方をC++を使ったことがない人が作ってみる記事になります。
image.png

環境
UE5.2
VisualStudio2022
必須プラグイン(?):VisualStudio Integration Tool

手順

プロジェクトを立て、ヘッダータブのツール>新規C++クラスからSubSystemを追加します。スクリーンショット (7).png
今回はGameInstanceSubSystemで作っていきますが、ほかのものでも手順は同じです。

VisualStudioが立ち上がったら、C++で制作していない場合は一度ビルドをかけます。
スクリーンショット (10).png

もしソリューションエクスプローラー(左か右にあるファイル構造が書いてあるタブ)にインストールが足りていない旨が出た場合はインストールを行ってください。

ヘッダータブの ビルド>(プロジェクト名)のビルド を実行してビルドを行います。(ビルドする際はUEを落とした状態で行ってください)

ビルド完了後何かしらのBPを開くと、すでに生成時につけたクラス名で検索かけるだけでSubSystemが生成されているのを確認できます。
image.png

これで呼び出すイベントの内容をBPで設定できるようC++側で書いていきます。
上の講演のスライドのコピペでほとんどいけます。
https://www.docswell.com/s/historia_Inc/5WVYJK-ue4-dataasset-subsystem-gameplayability/82
ほぼこのコードを張るだけ

先ほど制作したSubSystemのヘッダファイル(.hの方)を開きます。
image.png

もとから自動生成されているコードの#IncloudeとUCLASSの間に貼り付けます。

上の部分
UCLASS(Abstract, Blueprintable, MinimalAPI, meta = (ShowWorldContextPin))
class UMyGameInstanceSubsystemHelperBase : public UObject
{
	GENERATED_BODY()
};

image.png

次にもとからあったUCLASSの中のGENERATED_BODY()の下に

下の部分
public:
// 拡張用BPのプロパティ
UPROPERTY(Transient, BlueprintReadWrite)
UMyGameInstanceSubsystemHelperBase* SubsystemHelper;

image.png

貼り付けていきます。
.hの全体はこんな感じになっています。

全体
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"

/**
 * 
 */
UCLASS(Abstract, Blueprintable, MinimalAPI, meta = (ShowWorldContextPin))
class UMyGameInstanceSubsystemHelperBase : public UObject
{
	GENERATED_BODY()
};

UCLASS()
class SUBSYSTEM_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
public:
	// 拡張用BPのプロパティ
	UPROPERTY(Transient, BlueprintReadWrite)
	UMyGameInstanceSubsystemHelperBase* SubsystemHelper;

	
};

これはスライドにあるものを原文そのままもってきているだけですがもしコピペがダメな場合はスライドのPDFをダウンロードしてPDFからコピーしてください。

UMyGameInstanceSubsystemHelperBase(ハイライト部)は拡張用のBPのベースの名前となり、ハイライトの上下が同じ名前で[U + 好きな半角名]であれば自由に命名することができます。
image.png
こんな風に変えることができます。
image.png

続いてBPに書くイベントの関数を作っていきます。
先ほど追加した上側のUCLASSのGENERATED_BODY()下に関数を追加するコードを貼って行きます。

関数の追加
public:
// 処理の中身はBP側で書くことを宣言
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
void TestFunc();

image.png

文中のTestfuncはそのまま関数名となるため、自由に変更することができます。
また、複数宣言することで関数を増やすことができます

書き換え応用
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"

/**
 * 
 */
UCLASS(Abstract, Blueprintable, MinimalAPI, meta = (ShowWorldContextPin))
class UMyGISubsystemHelperBase : public UObject
{
	GENERATED_BODY()
public:
	// 処理の中身はBP側で書くことを宣言
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
	void First();
public:
	// 処理の中身はBP側で書くことを宣言
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
	void Second();
public:
	// 処理の中身はBP側で書くことを宣言
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
	void Third();
};

UCLASS()
class SUBSYSTEM_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
public:
	// 拡張用BPのプロパティ
	UPROPERTY(Transient, BlueprintReadWrite)
	UMyGISubsystemHelperBase* SubsystemHelper;

	
};

image.png

あとはビルドしてUEに戻ります。

UEに戻ると先ほど追加したMyGIsubsystemHelperBaseがアクターを制作の一覧に増えています。
image.png

Actorを作って開いています。
image.png
左側のマイブループリントタブから関数をオーバーライドで先ほどコードで作った関数をオーバーライドして中身を設定できます。

image.png

あとはレベルプリントやGameModeなどSubSystemの親に合わせてどこかしらに拡張BPの生成処理を書いてあげれば
image.png

image.png

どこからでも拡張BPの関数を呼び出せるようになりました!

終わりに

おそらく変数を格納したりするにはまたC++で書く必要があると思いますが、どこでも使える関数と思うとめっちゃ便利ですね。
あと一日分の野菜+一日分の鉄分調濃縮はまじめにおすすめです。PC大好きなエンジニアの皆さんはぜひ!アマゾンでまとめ買いすれば一本88円!

12
13
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
12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?