【UE4】C++でランダムなQRコードみたいな模様を作る

こんにちは。今回は読み込むたびに毎回変わる、QRコードみたいな模様を作っていきたいと思います。

まず、c++の新規プロジェクト(基本コード)を作成します。
f:id:tyojugiga:20191003221151p:plain

最初に設置されているFloorのscaleを10くらいに設定しておきます。
locationは(x,y)=(2500,2500)くらいです。
f:id:tyojugiga:20191003221947p:plain


さて、どのように模様を作成していくかというと、ランダムに直方体のactorをspawnさせます。
なのでまず、spawnするactorのblueprint classを作成します。
f:id:tyojugiga:20191003222250p:plain

次に、actorをランダムにspawnさせるためのc++のactorクラス作成してコードを書きます。

spawnActor.h

#pragma once

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

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

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

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

	UPROPERTY(EditAnywhere)
		int x;

	UPROPERTY(EditAnywhere)
		int y;

	UPROPERTY(EditAnywhere)
		float w;

	UPROPERTY(EditAnywhere)
		float h;

	UPROPERTY(EditAnywhere)
		float randomChange;

	UPROPERTY(EditAnywhere)
		TSubclassOf<AActor> ActorToSpawn;
};


spawnActor.cpp

#include "spawnActor.h"
#include "Engine/World.h"

// Sets default values
AspawnActor::AspawnActor()
{
 	// 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 AspawnActor::BeginPlay()
{
	Super::BeginPlay();
	UWorld* world = GetWorld();

	

	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			float rnd = FMath::FRandRange(0.0f, 100.0f);

			if (randomChange>=rnd)
			{
				FVector loc((float)j * w, (float)i * h, 120.0f);
				FRotator rot(0.0f, 0.0f, 0.0f);

				world->SpawnActor(ActorToSpawn, &loc, &rot);
			}
		}
	}
}

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

}


ヘッダーファイルでUPROPERTY(EditAnywhere)を宣言することで、UE4側から変数の編集が可能になります。


c++コードがbuildできたら、UE4側でC++のactorクラスをfieldにdrug & dropします。
すると先ほどUPROPERTY(EditAnywhere)で宣言した変数が見れると思いますので自分の好きな値を入力し、TSubclassOf ActorToSpawnに最初に作成したblueprint actor classをattachします。
f:id:tyojugiga:20191003223902p:plain


これで再生をすると・・・

f:id:tyojugiga:20191003224121p:plainf:id:tyojugiga:20191003224126p:plainf:id:tyojugiga:20191003224129p:plain

毎回違った模様が出来上がります!

ここまで読んでいただきありがとうございました!