O comando switch é usado para selecionar e executar um determinado bloco de código baseado no valor de uma variável. A variável pode ser do tipo inteiro ou uma enumeração.
O exemplo abaixo mostra um exemplo de comando switch. A variável Difficulty é do tipo int32 e ela pode armazenar os valores 1, 2 e 3, que representam a dificuldade do jogo. TotalEnemies também é uma variável do tipo int32. O valor da variável Difficulty irá determinar o valor da variável TotalEnemies.
switch ( Difficulty )
{
case 1:
TotalEnemies = 20;
break;
case 2:
TotalEnemies = 30;
break;
case 3:
TotalEnemies = 40;
break;
default:
UE_LOG(LogTemp, Warning, TEXT("Difficulty variable: Invalid value."));
break;
}
O comando break é usado para indicar o fim da seqüência de comandos de cada case. O comando default é opcional e é executado quando não for encontrado um valor correspondente.
No exemplo de uso veremos como usar o comando switch com uma enumeração.
Exemplo de uso:
Vamos criar uma enumeração chamada EDifficulty que será usada para representar a dificuldade no jogo. Crie o arquivo cabeçalho Difficulty.h e adicione este código:
#pragma once
#include "CoreMinimal.h"
#include "Difficulty.generated.h"
UENUM( BlueprintType )
enum EDifficulty
{
VeryEasy,
Easy,
Normal,
Hard,
VeryHard
};
No editor da Unreal, crie uma classe C++ com o nome EnemySpawner usando como classe pai a classe Actor. Esta classe possui uma variável do tipo int32 chamada TotalEnemies e uma variável de enumeração do tipo EDifficulty chamada GameDifficulty. O valor de TotalEnemies será definido na função BeginPlay() usando um comando switch com a enumeração GameDifficulty.
O arquivo EnemySpawner.h deve ter este conteúdo:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Difficulty.h"
#include "EnemySpawner.generated.h"
UCLASS()
class TUTOPROJECT_API AEnemySpawner : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AEnemySpawner();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
int32 TotalEnemies;
UPROPERTY(EditAnywhere, Category=EnemySpawner)
TEnumAsByte< EDifficulty > GameDifficulty;
UPROPERTY(VisibleAnywhere)
USceneComponent* RootScene;
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* StaticMesh;
};
Este é o conteúdo do arquivo EnemySpawner.cpp:
#include "EnemySpawner.h"
AEnemySpawner::AEnemySpawner()
{
// 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 AEnemySpawner::BeginPlay()
{
Super::BeginPlay();
switch ( GameDifficulty )
{
case EDifficulty::VeryEasy:
TotalEnemies = 10;
break;
case EDifficulty::Easy:
TotalEnemies = 20;
break;
case EDifficulty::Normal:
TotalEnemies = 30;
break;
case EDifficulty::Hard:
TotalEnemies = 40;
break;
case EDifficulty::VeryHard:
TotalEnemies = 50;
break;
}
FString Message = FString::Printf(TEXT("TotalEnemies: %d"), TotalEnemies);
if(GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, Message);
}
}
// Called every frame
void AEnemySpawner::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Compile o código C++ e adicione uma instância de EnemySpawner no nível. Você pode selecionar o valor de GameDifficulty na aba Details da instância.