※一部画像は異なりますが、本記事の内容はUE4にも適用できます。
本記事では、Unreal Engineで、C++を用いてActorを実装する方法と、実装したActorを利用する方法について説明します。
※Unreal EngineでC++を使うためには、C++の導入(環境構築・プロジェクト設定)が必要です。
導入していない場合は、以下の記事を参考にしてください。
Actorの実装
C++での実装
以下の手順で、Actorを実装するためのヘッダファイルとソースファイルを作成します。
クラス名(Actor名)は、例としてMyActor
としています。
作成すると、ヘッダファイルとソースファイルには以下のコードが自動的に生成されています(コメントは省略しています)。
このコードには、Actorを実装するための必要最低限のコードが記述されています。
なお、クラス名(Actor名)の頭に「A」を付ける決まりになっているため、この例では「AMyActor
」というクラス名でコードが生成されています。
【ヘッダファイル(MyActor.h)】
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
};
【ソースファイル(MyActor.cpp)】
#include "MyActor.h"
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
}
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Blueprintとの比較
補足として、BlueprintでActorを実装する場合と比較します。
先ほど説明したC++で実装するための操作は、Blueprintにおける以下の操作と同じことを意味しています。
実装したActorの利用
C++で実装したActorは、Level上に配置します。
以下のとおり、C++で実装したActorを親クラスとして指定したBlueprintクラスアセットを作成し、作成されたActorをLevel上に配置して利用します。
補足
Blueprintで継承せずに、C++で作成したActorを直接Level上に配置することも可能です。
手順は以下の通りです。
ただし、この手順で配置したActorには、Scene Componentが追加されておらず、Actorを移動できません。
したがって、Componentを追加するためのコードを記述する必要があります。
(Componentを追加するための手順を示した関連記事は後述)
ソースコードの記述内容
今まで説明した手順で、C++のActorを実装し、それをLevel上に配置して利用できるようになりました。
ただし、これだけでは何の機能も持っていないため、ソースファイル・ヘッダファイルに対してソースコードを追記し、機能を追加します。
主に、以下のようなソースコードを追加していくことになります。
【ヘッダファイル(MyActor.h)】
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/StaticMeshComponent.h"
#include "MyActor.generated.h"
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// メンバ変数の定義
UPROPERTY(EditAnywhere)
int MyVar = 10;
// Componentの定義
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
TObjectPtr< class UStaticMeshComponent > MyComp;
public:
// コンストラクタの宣言
AMyActor();
protected:
// イベント(BeginPlay)の宣言
virtual void BeginPlay() override;
public:
// イベント(Tick)の宣言
virtual void Tick(float DeltaTime) override;
// メンバ関数の宣言
UFUNCTION(BlueprintCallable)
int MyFunc(int In1, int In2);
};
【ソースファイル(MyActor.cpp)】
#include "MyActor.h"
// コンストラクタの定義
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
// Componentの初期化
MyComp = CreateDefaultSubobject(TEXT("MyComp"));
RootComponent = MyComp;
}
// イベント(BeginPlay)の定義
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
// イベント(Tick)の定義
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// メンバ関数の定義
int AMyActor::MyFunc(int In1, int In2)
{
return In1 + In2;
}
各コードの意味・記述内容について別記事で紹介します。
【宣伝】
Unreal EngineのC++は、一般的なC++にはない独自の仕様が多く、難易度が高いため、体系的に学ぶのが効率的です。
Colory Gamesでは、Unreal EngineのC++を使う人を対象とした入門書をBOOTHで販売しています。
Unreal Engine上でC++を使って開発するために必要となる基礎知識を一冊の本にまとめています。
対話形式でわかりやすく、プログラミング未経験でも理解できる構成としており、体系的にUnreal Engine C++を学習できます。
【商品ページ(BOOTH)】 https://colory-games.booth.pm/items/4734728