Macro UENUM()

Enum to typ danych zawierający zestaw nazwanych stałych. Wartość zmiennej, której typ jest wyliczeniem, jest ograniczona do zestawu stałych zdefiniowanych w wyliczeniu. UENUM() makro pozwala na tworzenie wyliczeń, które można wykorzystać w edytorze Unreal i Blueprints.

W Unreal Engine wyliczenia mają przedrostek E w C ++. Aby zaimplementować wyliczenie w C ++, utwórz plik nagłówkowy ( .h ) z nazwą wyliczenia, na przykład TeamColor.h. Poniższy kod przedstawia przykład UENUM(), którego można użyć w Blueprints.

#pragma once

#include "CoreMinimal.h"
#include "TeamColor.generated.h"

UENUM( BlueprintType )
enum ETeamColor
{
  Blue,
  Red,
  Green	 UMETA( DisplayName = "GREEN" ),
  Yellow
};

Specyfikator BlueprintType umożliwia użycie wyliczenia jako typu zmiennej w Blueprint. Makro UMETA (DisplayName = “”) służy do zmiany nazwy stałej, która będzie wyświetlana w Edytorze.

Na tym obrazie zmienna o nazwie ItemTeamColor jest tworzona przy użyciu wyliczenia ETeamColor jako typu:

Zmienna typu Enum jest wyświetlana na karcie Details wystąpienia jako menu rozwijane, w którym użytkownik może wybrać wartość.

Aby zdefiniować zmienną typu wyliczenia w C ++, użyj tego szablonu:

TEnumAsByte< ETeamColor > ItemTeamColor;

Poniższy wiersz pokazuje, jak przypisać wartość do zmiennej typu wyliczeniowego:

ItemTeamColor = ETeamColor::Red;

Uwaga : Jeśli edytor Unreal nie wyświetla ostatniego elementu wyliczenia, zrestartuj edytor Unreal.

Przykładowe użycie:

Stwórzmy enum EItemSize , które można wykorzystać w innych klasach, aby określić rozmiar instancji w grze. Utwórz plik nagłówkowy ItemSize.h i dodaj ten kod:

#pragma once

#include "CoreMinimal.h"
#include "ItemSize.generated.h"

UENUM( BlueprintType )
enum EItemSize
{
  Small,
  Medium,
  Large
};

Użyj EItemSize e w klasie C ++. W edytorze Unreal utwórz klasę C ++ o nazwie HealthPack, używając klasy Actor jako klasy nadrzędnej. Plik HealthPack.h powinien mieć następującą zawartość:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ItemSize.h"
#include "HealthPack.generated.h"

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

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

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

  int32 HealthPoints;
	
  UPROPERTY(EditAnywhere, Category=HealthPack)
  TEnumAsByte< EItemSize > PackSize;
	
  UPROPERTY(VisibleAnywhere)
  USceneComponent* RootScene;

  UPROPERTY(VisibleAnywhere)
  UStaticMeshComponent* StaticMesh;

};

Stworzyliśmy zmienną PackSize, która jest wyliczeniem typu EItemSize. Możesz wybrać wartość PackSize w edytorze. 

W pliku HealthPack.cpp mamy tworzenie komponentów w konstruktorze. StaticMesh zostanie wybrany w Unreal Editor. W funkcji BeginPlay() wartość zmiennej HealthPoints jest przypisywana na podstawie wartości PackSize.

#include "HealthPack.h"

AHealthPack::AHealthPack()
{
  // Set this actor to call Tick() every frame.
  PrimaryActorTick.bCanEverTick = true;

  RootScene = CreateDefaultSubobject<USceneComponent>("RootScene");
  RootComponent = RootScene;

  StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMesh");
  StaticMesh->SetupAttachment(RootScene);
}

// Called when the game starts or when spawned
void AHealthPack::BeginPlay()
{
  Super::BeginPlay();
	
  if(PackSize == EItemSize::Small)
  {
    HealthPoints = 25;
  } 
  else if(PackSize == EItemSize::Medium)
  {
    HealthPoints = 50;
  }
  else if(PackSize == EItemSize::Large)
  {
    HealthPoints = 100;
  }

  FString Message = FString::Printf(TEXT("HealthPoints: %d"), HealthPoints);
                                    
  if(GEngine)
  {
    GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, Message);
  }  
}

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

W następnym artykule użyjemy instrukcji switch do wybierania akcji na podstawie wartości wyliczenia.

Skompiluj kod C ++ i dodaj instancję HealthPack na poziomie. Możesz wybrać wartość PackSize na karcie Details instancji.


Źródło:https://romeroblueprints.blogspot.com/2020/11/the-uenum-macro.html