zer0から始めるプログラミング生活

unreal EngineやUnityのTipsを書いていきます。

【Unreal C++】①C++クラス作成&Component追加【UE4】

だいぶUnreal C++に慣れてきたので、備忘録として書いていこうと思います。
ver4.18を使用しています。

C++クラス作成

新しいC++クラスの追加は「コンテンツブラウザの新規追加→新しいC++クラスを追加→親クラスを選択→名前をつける→クラスを作成」で作成できます。

親クラスにActorを選択し、hogeActorと名前をつけました。

hoge.h

#pragma once

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

UCLASS()
class hogeProject_API AhogeActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AhogeActor();

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

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

};

以上のコードは作成時に自動的に書いてくれています。

ちなみにver4.15からの仕様変更でCoreMinimal.hのincludeが必須に
詳しくは↓
miyahuji111.hatenablog.com


.cpp

#include "hogeActor.h"


// Sets default values
AhogeActor::AhogeActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	
}

// Called when the game starts or when spawned
void AhogeActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AhogeActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

cppの方も以上のコードが作成時に自動的に書いてくれています。

PrimaryActorTick.bCanEverTick をtrueにしておくと、Tick処理が呼び出されます。
必要ないときはfalseにしておいたほうが高速に動くようです。

コンポーネントはコンストラクタに書いていきます。
*BeginPlayなど他の場所に書くとクラッシュします。(error吐いてほしい...)

Component追加

.h

UPROPERTY(EditAnywhere)
USceneComponent* Scene;

UFUNCTION()
void hogeFunc();

UPROPERTY()は変数のオプションを指定できます。

オプション 説明
EditAnywhere エディタ(BP,Level)内で編集○
VisibleAnywhere エディタ内で表示○、編集☓
BlueprintReadWrite BPで読み取り○、変更○
BlueprintReadOnly BPで読み取り○、変更☓
Category=" " カテゴリを指定

他にもありますが、とりあえず良く使いそうなものだけ。

.cpp

Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
RootComponent = Scene;
Widget = CreateDefaultSubobject<UWidgetComponent>(TEXT("Widget"));
Widget->SetupAttachment(RootComponent);
WidgetInteraction = CreateDefaultSubobject<UWidgetInteractionComponent>(TEXT("WidgetInteraction"));
Widget->SetupAttachment(RootComponent);

CreateDefaultSubobjectでコンポーネントを作成します。<>内はクラス名。TEXT内の("")はエディタ内で表示される名前です。
RootComponentで最上層のコンポーネントに設定します。
SetupAttachment(hoge)でhogeの下の層に設定します。

何か間違っていることがあればご指摘頂けると幸いです。