C++ – Gorosuke's Lab https://gorosuke.net Mon, 30 Jun 2025 01:47:24 +0000 ja hourly 1 https://wordpress.org/?v=6.9.4 https://gorosuke.net/wp-content/uploads/2025/05/cropped-KashiwaNoKi-32x32.png C++ – Gorosuke's Lab https://gorosuke.net 32 32 GENERATED_BODYに赤波線でエラーが…対処法 / 備忘録 | UE5, C++ https://gorosuke.net/ue5-cpp-generated-body-error-fix/ Mon, 30 Jun 2025 01:47:24 +0000 https://gorosuke.net/?p=308 解決法

結論から言います!

  1. #include (ヘッダーファイル名).generated.hを消してしまった
  2. #include (ヘッダーファイル名).generated.hより下にincludeを書いてしまった

が主な原因で、

  1. 手書きで#include “MyActor.generated.h”のように付け加える
  2. #include “Kismet/BlueprintFunctionLibrary.h”みたいなのを追加したい場合は、include “MyActor.generated.h”より上に付け加える

で大体の場合は解決するかなーと思います!

Error: #include found after .generated.h file – the .generated.h file should always be the last #include in a header

みたいなエラー原因もログとして一応出ますが。。。初心者の時は焦りますよね笑

消してしまった場合

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
// 本来あるべき#include "MyActor.generated.h"が消えている…!

UCLASS()
class LEARNINGUE5_API AMyActor : public AActor
{
    GENERATED_BODY()

public:    
    // Sets default values for this actor's properties
    AMyActor();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:    
    // Called every frame
    virtual void Tick(float DeltaTime) override;

};

原因はいろいろあるでしょうけど、generated.hを間違って消してしまった場合…とりあえず「#include "(ヘッダーファイル名).generated.h"」を足すことで解決するかもしれません
ここでincludeの(ヘッダーファイル名)に入るのはクラスの名称「例: AMyActor」ではなく、現在のファイル名を書きましょう

これで解決しなかったら…さらに下の解決法も試していきます
# generated.hより下に#includeを足さない

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"

#include "Kismet/BlueprintFunctionLibrary.h // ここはOK
#include "MyActor.generated.h" 
#include "Kismet/BlueprintFunctionLibrary.h // ここはダメ

UCLASS()
class LEARNINGUE5_API AMyActor : public AActor
{
    GENERATED_BODY()

public:    
    // Sets default values for this actor's properties
    AMyActor();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:    
    // Called every frame
    virtual void Tick(float DeltaTime) override;

};

何か足してきたいときは下に下にと増やしていきたい気持ちもあり、generated.hより下に足してしまうなんてこともよくあります。ですが、こちらもエラーの原因となるので、generated.hよりも上にincludeを足しましょう。

ファイル名を変更した

ファイル名を変更した場合は少しややこしい事態になるのですが

  1. 元のファイル名に戻す
  2. #include (現在のファイル名).generated.hにする

のどちらかで解決すると思います。
“プロジェクト名\Intermediate\Build\Win64\UnrealEditor\Inc\LearningUE5\UHT”
に該当のヘッダーがあるのですが、こことのずれで起こるエラーです
ずっと変更後にしたい!という場合は、IntermediateとBinariesフォルダを削除してプロジェクトを開きなおすとビルドが始まるので、(includeの現在のファイル名をちゃんと現在のにしていれば)エラーは解消されるはずです。

送信中です

]]>
“存在しない”を設定できるTOptional型について | UE5, C++ https://gorosuke.net/ue5-cpp-toptional/ Mon, 30 Jun 2025 01:40:08 +0000 https://gorosuke.net/?p=305 前書き

例えば何かを生成する関数があったとして、正常に生成された場合はその値を返せばよいのですが、その生成に失敗した場合に「仮のインスタンス/値」を返すのを避けたい場面に遭遇します。

オプション型というのはそのような「値が無い/参照がない」という状態を作り出すために使えます。

Unreal C++ / TOptional<型名>

UnrealのC++にはTOptionalというクラスが用意されています。

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/uLangCore/uLang/Common/Misc/TOptional

使い方は非常に簡単で

TOptional<int32> Number;
TOptional<int32> Number = 56

と宣言します。

値を消す / 値を設定

//リセット
Number.Reset(); 

//値を設定
Number.Emplace(20);
Number= 20;
値を設定する場合、もしくは値を消す場合は上記の方法で行えます。
リセット関数を呼び出すと、number変数内は空になります。これは無というイメージなので、そのまま値を使おうとすると無いものを取り出すとしてエラーが発生します。
値を設定する場合は、Emplace関数か=で出来ます。

値を取り出して実際に使う場合は

パターン1

if(Number.IsSet())
{
    Use(Number.GetValue());
}

のようにIsSet関数で中身が存在するかをチェックし、その後GetValue関数で生の値を取り出すみたいな感じです。
ここでIsSet関数を呼び出さずにGetValue()を使ってしまうと、値が設定されてる場合は通常に動作するのですが、入ってない場合はエラーを吐いてクラッシュしてしまいます…。

パターン2

Use(Number.Get(0); //numberが空の場合は0が代わりに入る。

のように、引数付きのGet関数を呼び出す方法も存在します。こちらはnumberの中身が空の場合、代わりに引数に渡したデフォルト値が入るよう取り出します。

関数の戻り値

上記が主な使い方ですが、関数の戻り値としても見ていきます。

TOptional<int32> GetNumber()
{
    if(Conditional)
    {
        return 10;
    }
    else
    {
        return TOptional<int32>();
    }
}

と書く…といいたいのですが、こちらについてはあまり自身は無いです。無い状態を表すもの(nullptrのような)が見つからなかったので、何も設定していないTOptionalを返してる感じです(もし詳しい方がいれば教えていただけると助かります…)

送信中です

]]>
FStringを特定の文字で区切り配列に入れる | UE5/C++ https://gorosuke.net/ue-cpp-fstring-division/ Sat, 10 May 2025 10:02:37 +0000 https://gorosuke.net/?p=81 前書き

Unreal EngineのC++で、「.」や「,」で文字を区切り、分割したものを配列に入れたい場面に遭遇するはずです。その際に便利な機能として「ParseIntoArray」という関数を紹介します。

使い方

	FString TargetText = "this,text,is,sample";
	TArray<FString> Result;

	TargetText.ParseIntoArray(Result, TEXT(","));

	for (FString Text : Result)
	{
		// this
		// text
		// is
		// sample
		// で配列内に分割される。
	}

FStringに対して、(その変数などに).PraseIntoArrayという関数を呼び出せば分割処理が行われます。第一引数には結果として収納する配列を入れます。今回はResultというTArray<string>の配列を作成し入れました。第二引数には実際に「どの文字で分割するか」を指定します。

結果は配列の中に入るため、forやその他処理で利用しましょう。

送信中です

]]>