For Loops oraz TActorRange

W języku C ++ pętla jest używana do powtórzenia bloku kodu, gdy określony warunek jest prawdziwy. Jednym z rodzajów pętli jest instrukcja for .

Poniższy kod przedstawia przykład użycia instrukcji for. W TotalEnemies przechowuje zmienna liczba wrogów, które muszą być tworzone na poziomie. Licznik zmiennej jest zwiększana z każdym wykonaniem dla pętli. Blok kodu pętli for zostanie powtórzony, gdy wartość Counter jest mniejsza niż wartość TotalEnemies. Dziesięć instancji klasy AEnemyActor zostanie utworzonych w losowych miejscach na poziomie.  

int32 TotalEnemies = 10;
int32 Counter;
float XPosition;
float YPosition;
	
FVector  SpawnLocation;
FRotator SpawnRotation = FRotator(0.0f, 0.0f, 0.0f);
	
for(Counter = 0; Counter < TotalEnemies; Counter++)
{
  XPosition = FMath::RandRange(-1000, 1000);
  YPosition = FMath::RandRange(-1000, 1000);
		
  SpawnLocation = FVector(XPosition, YPosition, 130.0f);
		
  GetWorld()->SpawnActor<AEnemyActor>(AEnemyActor::StaticClass(),
                                      SpawnLocation, SpawnRotation );
}

Instrukcja for ma odmianę zwaną pętlą for opartą na zakresie . W tym typie for deklarowana jest zmienna przechowująca bieżący element grupy elementów. Blok kodu będzie powtarzany, aż wszystkie elementy zostaną użyte. Pętla for oparta na zakresie ma następujący format: 

for(variable : range_expression) 
{

}

Kontenery Unreal TArray, TMap i TSet współpracują z pętlą for opartą na zasięgu.

Unreal Engine ma szablon C++ o nazwie TActorRange, który zawiera wyrażenie zakresu reprezentujące wystąpienia danej klasy, które są obecne na poziomie. Poniższa pętla for oparta na zakresie wykorzystuje TActorRange do przełączania widoczności wszystkich instancji klasy APointLight na poziomie.

for (APointLight* PointLightInstance : TActorRange<APointLight>( GetWorld() ) )
{	
  PointLightInstance->GetLightComponent()->ToggleVisibility();
}

APointLight klasa zawiera LightComponent, który ma ToggleVisibility() funkcji.

W APointLight instancje mogą być ruchome , dzięki czemu mogą one mieć ich widoczność modyfikowane, jak zobaczymy w przykładzie użytkowania.

Przykładowe użycie:

W tym przykładzie będziesz potrzebować projektu C++, który ma szablon trzeciej osoby. Dodamy kilku aktorów Point Light do poziomu i przełączymy ich widoczność, naciskając klawisz Enter.

Najpierw utwórzmy mapowanie wejściowe o nazwie PressSwitch, które zostanie uruchomione, gdy gracz naciśnie klawisz Enter.

W edytorze poziomów wejdź do menu Edit -> Project Settings … i w kategorii Engine wybierz opcję Input. Kliknij symbol + obok pozycji Odwzorowania akcji , wprowadź nazwę PressSwitch dla nowego mapowania akcji i wybierz klawisz Enter. Do mapowania akcji dla projektu będzie wyglądać następująco:

Teraz zamierzamy zmodyfikować kod C++. Otwórz plik nagłówkowy klasy postaci utworzony przez szablon trzeciej osoby . Domyślna nazwa pliku to ProjectNameCharacter.h . Na przykład nazwa mojego projektu to TutoProject, a nazwa pliku nagłówkowego to TutoProjectCharacter.h.

W pliku nagłówkowym dodaj deklarację funkcji ToggleLights() poniżej funkcji SetupPlayerInputComponent():

protected:
  // APawn interface
  virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
                                                                             override;
  // End of APawn interface

  void ToggleLights();

W pliku Character cpp musisz dodać następujące wiersze #include na początku pliku:

#include "Engine/PointLight.h"
#include "Components/LightComponent.h"
#include "EngineUtils.h"
#include "Engine/World.h"

W funkcji SetupPlayerInputComponent() , Input PressSwitch zostanie powiązany z funkcją ToggleLights() po funkcji Input ResetVR . Zmień nazwę ATutoProjectCharacter na nazwę klasy Character twojego projektu i nie zapomnij umieścić operatora & przed nazwą. Służy do zwracania adresu pamięci funkcji. 

PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this,
                                 &ATutoProjectCharacter::OnResetVR);

PlayerInputComponent->BindAction("PressSwitch", IE_Pressed, this,
                                 &ATutoProjectCharacter::ToggleLights);

Na końcu pliku cpp utwórz funkcję ToggleLights() z poniższą zawartością. Nie zapomnij zmienić nazwy klasy, która znajduje się przed operatorem „ :: ”.

void ATutoProjectCharacter::ToggleLights()
{ 
  for (APointLight* PointLightInstance : TActorRange<APointLight>( GetWorld() ) )
  {
    PointLightInstance->GetLightComponent()->ToggleVisibility();
  }	
}

Skompiluj kod C ++. Aby przetestować nasz przykład, musimy dodać instancje Point Light na poziomie. Przejdź do zakładki Place Actor , kategoria Basic . Przeciągnij kilka Point Light i upuść je na jednej ze ścian poziomu. 

Wybierz każdą z instancji Point Light i zmień właściwość na Movable.

Uruchom grę i podejdź do instancji Point Light. Naciśnij klawisz Enter, aby wyłączyć i włączyć Point Light.


Źródło: https://romeroblueprints.blogspot.com/2020/12/for-loops-and-tactorrange.html