TArray: Arrays w C++

TArray to typ kontenera, który przechowuje jeden lub więcej elementów tego samego typu. Kontener to typ klasy, której instancje są kolekcjami innych obiektów. Inne przykłady kontenerów w Unreal C++ to TSet i TMap, które zostaną omówione w następnych artykułach.

Prostym sposobem zrozumienia koncepcji Array jest obejrzenie jej w edytorze Unreal. Ten kod tworzy Array o nazwie TownNames do przechowywania elementów typu FString

UPROPERTY(EditAnywhere, Category=ArrayTown)
TArray<FString> TownNames;

Poniższy obraz przedstawia tablicę w edytorze. Możesz dodawać elementy, klikając ikonę +. Liczby po lewej stronie to indeksy elementów tablicy. Pierwszy element tablicy ma indeks zerowy.

Dwie funkcje mogą służyć do dodawania elementów do tablicy przy użyciu C ++. Funkcja Add() dodaje elementy na końcu tablicy, a funkcja Insert() dodaje element w indeksie przekazanym jako parametr.

TownNames.Add(TEXT("Tarrin"));

TownNames.Insert(TEXT("Pitmerden"), 2);

Możesz czytać i modyfikować elementy Array za pomocą operatora [] i indeksu elementu.

FString FirstTown = TownNames[0];

TownNames[3] = TEXT("Penkurth");

Uważaj , jeśli użyjesz indeksu mniejszego niż 0 lub równego lub większego niż liczba elementów w tablicy, spowoduje to błąd w czasie wykonywania.

Aby sprawdzić liczbę elementów w tablicy, użyj funkcji Num():

int32 NumberOfElements = TownNames.Num();

Przykładowe użycie:

Utworzymy tablicę do przechowywania odniesień do instancji Actor, a następnie napiszemy na ekranie nazwy instancji, które zostały dodane do tablicy.

Utwórz klasę C ++ o nazwie TestTArray, używając klasy Actor jako klasy nadrzędnej. W pliku TestTArray.h dodaj deklarację komponentów i TArray, jak pokazano w tym kodzie:

#pragma once

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

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

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

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

	UPROPERTY(VisibleAnywhere)
	USceneComponent* RootScene;

	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* StaticMesh;
	
	UPROPERTY(EditAnywhere, Category=ArrayExample)
	TArray<AActor*> SelectedActors;

};

Oto zawartość pliku  TestTArray.cpp:

#include "TestTArray.h"

ATestTArray::ATestTArray()
{
  // 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 ATestTArray::BeginPlay()
{
  Super::BeginPlay();

  FString Message;
  
  if(SelectedActors.Num() > 0)
  {
    Message = FString::Printf(TEXT("Number of elements in the array: %d"), 
                              SelectedActors.Num());

    if(GEngine)
    {	
      GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
	  
      Message = FString::Printf(TEXT("--- Selected Actors ---"));
	  
      GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
	  
      for (AActor* ActorInstance : SelectedActors)
      {
        Message = FString::Printf(TEXT("Instance Name: %s"),
                                  *(ActorInstance->GetName()));
		
        GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
      }
    }	  
  }	    
}

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

W funkcji BeginPlay() używamy pętli for opartej na zakresie, aby iterować po elementach tablicy i zapisywać nazwę każdej instancji na ekranie.

Skompiluj kod C++ i dodaj wystąpienie TestTArray na poziomie. Możesz dodawać elementy do tablicy za pomocą zakładki Details instancji.

Uruchom grę i zobacz nazwy instancji Aktora na ekranie:


Źródło: https://romeroblueprints.blogspot.com/2020/12/tarray-arrays-in-c.html