기존의 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);
}
}
UCLASS(BlueprintType, Blueprintable)
class SILLA_API USLQuestManager : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
/** Sky Manager */
UPROPERTY(EditAnywhere, BlueprintReadWrite)
AActor* SkyManagerActor;
};
액터를 찾아쓰는 방식보다는 액터가 BeginPlay 일때 자기 자신을 등록시킨다음
사용하는 곳에서 가져다 씀. 이때 같은 BeginPlay 순서가 보장이 안된다면 Delay Until Next Tick 을 사용함.