【UE4】C++でランダムなQRコードみたいな模様を作る
こんにちは。今回は読み込むたびに毎回変わる、QRコードみたいな模様を作っていきたいと思います。
まず、c++の新規プロジェクト(基本コード)を作成します。
最初に設置されているFloorのscaleを10くらいに設定しておきます。
locationは(x,y)=(2500,2500)くらいです。
さて、どのように模様を作成していくかというと、ランダムに直方体のactorをspawnさせます。
なのでまず、spawnするactorのblueprint classを作成します。
次に、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
これで再生をすると・・・
毎回違った模様が出来上がります!
ここまで読んでいただきありがとうございました!