[UE4]c++覚え書き

UE4のc++をよく忘れるので未来の自分用に、忘れないようにメモです。またue4のC++の記事が少ないので、誰かの役に経てば幸いです。     (ただ、ue4のC++は基本的にue4公式のドキュメントを参考にするのがよいと思います。BPでFunctionを調べて名前で検索すると、importするヘッダーファイルとFunctionの定義がわかります。)

・Enumの定義

Enumの注意点として、要素を増やすとBPで呼んでる場所で高頻度でエラーが出ます。その場合、ノードの繋ぎ直しや、ue4の再起動を行う必要性があります。

UENUM(BlueprintType)
enum class ESelectableActorType : uint8
{
    Orange		UMETA(DisplayName = "Orange"),
    Apple		UMETA(DisplayName = "Apple"),
    Lemon		UMETA(DisplayName = "Lemon"),
    Max		    UMETA(Hidden),
};

・GameModeの取得

MyGameMode* gameMode = Cast<MyGameMode>(GetWorld()->GetAuthGameMode());

・PlayerPawnの取得

includeするヘッダーファイルはGameplayStaticsになります。

#include "Kismet/GameplayStatics.h"

auto playerPawn= Cast<AHogePlayerPawn>(UGameplayStatics::GetPlayerPawn(this, 0));

・コンポーネントの表示非表示を行う

第二引数で、その子オブジェクトも一緒に非表示にするか設定できます。(子オブジェクトも同時に表示切替できるの知らず、全ての子オブジェクトの参照とってきて消してました)

UStaticmeshComponent* hoge->SetVisibility(true,true);

また、アクター自体の表示非表示の切り替えは

AActor* actor->SetHiddenInGame(true);

ちなみに、setvisibilityの方はunityでいうとrenderをオフにする感じなので、コリジョンは残ってます。その場合、setcollision enableしてあげないといけません。

hoge->SetCollisionEnabled(ECollisionEnabled::NoCollision);

・Rayを飛ばす

Rayを飛ばすには、LineTraceSingleByChannelを使います。こちらに公式のドキュメントがあるので参考に。

https://docs.unrealengine.com/en-US/API/Runtime/Engine/Engine/UWorld/LineTraceSingleByChannel/index.html

	FVector start = _Camera->GetComponentLocation();
	FVector end = start + (FVector(0, 0, -1) * 1000);

	FCollisionQueryParams traceParams;

	FHitResult hit;
	GetWorld()->LineTraceSingleByChannel(hit, start, end, ECC_Visibility, traceParams);
	if (hit.bBlockingHit)
	{
            //do something
	}

・デリゲートを利用する

BPのイベントディスパッチャーをC++で定義できます。この記述だとマルチキャストになります。またBlueprintAssignableのプロパティを追加することで、BPからイベントに処理をバインドする事が可能です。

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSelectedEvent);

UCLASS(Blueprintable, BlueprintType)
class FLOODVR_API USelectableComponent : public UStaticMeshComponent
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintAssignable)
		FOnSelectedEvent OnSelectedEvent;
};

呼び出す際は、以下のように呼び出すことが可能です。

OnSelectedEvent.Broadcast();

・オリジナルコンソールコマンドを追加する

ヒストリさんが丁寧にまとめてくれてますのでこちらをみるといいと思います。

・C++で作成したComponentをBlueprintで作成可能にする

C++で作成したcomponent系を継承したクラスはBlueprint化できません。ヘッダーファイルにBlurprintableを追加してあげると、作成できるようになります。


UCLASS(Blueprintable, BlueprintType)
class FLOODVR_API USelectableComponent : public UStaticMeshComponent
{

}

・VideoTextureを作成する

https://docs.unrealengine.com/ja/Engine/MediaFramework/HowTo/FileMediaSource/index.html

・ProjectPackageするときの注意点

公式のドキュメントにもありますが、Packageするときに、そのまま焼いてしまうとexeファイルが肥大化します。そのためプロジェクトセッティングの項目からいくつか設定する所があります。

[Create compressed cooked packages (圧縮されたクック済みのパッケージを作成)] を有効にする。これらをするだけで、僕の場合、大体プロジェクトサイズは半分なりました。

画像1

また、Packageに必要なLevelのみをこちらのindexに追加しましょう。これをしてあげないと全てのレベルがパッケージ化されてしまうので、とんでもなく時間がかかります。

画像2



この記事が気に入ったらサポートをしてみませんか?