액터 검색 및 순회 방법

기존의 GetAllActorsOfClass


//기존에 사용했던 방식. Spline 액터를 가져오려고 GetAllActorsOfClass 를 사용
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASLQuestSpline::StaticClass(), SaveQuestSplineArray);

World TActorItreractor를 사용한 방식

//월드를 가져와서
UWorld* World = GEngine->GetWorldFromContextObject(this, EGetWorldErrorMode::LogAndReturnNull);
	if (World == nullptr)
	{
		UE_LOG(LogTemp, Error, TEXT("World is null."));
		return;
	}
	
//찾을 ActorClass 를 지정해준 다음.
TSubclassOf<AActor> ActorClass = ASLQuestSpline::StaticClass();

for (TActorIterator<AActor> It(World, ActorClass); It; ++It)
{
	ASLQuestSpline* QuestSpline = Cast<ASLQuestSpline>(*It);
	if (QuestSpline)
	{
		if (QuestSplineMap.Contains(QuestSpline->Id) == false)
		{
			QuestSplineMap.Add(QuestSpline->Id, QuestSpline);
		}
		else
		{
			UE_LOG(LogTemp, Warning, TEXT("[%s] Already use QuestSpline Id = %i"), *QuestSpline->GetName(), QuestSpline->Id);
		}

		SaveQuestSplineArray.Add(QuestSpline);
	}
}

SkyManager 를 사용한 예


UCLASS(BlueprintType, Blueprintable)
class SILLA_API USLQuestManager : public UGameInstanceSubsystem
{
	GENERATED_BODY()

public:

	/** Sky Manager */
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	AActor* SkyManagerActor;

};

액터를 찾아쓰는 방식보다는 액터가 BeginPlay 일때 자기 자신을 등록시킨다음

Untitled

사용하는 곳에서 가져다 씀. 이때 같은 BeginPlay 순서가 보장이 안된다면 Delay Until Next Tick 을 사용함.