팀플, 알고리즘 1문제
currentSpline->GetLocationAtDistanceAlongSpline(
currentSplineDistance,
ESplineCoordinateSpace::World
);
Spline은 맵에 그려둔 길이다. 캐릭터가 이 길을 따라 움직일 수 있다. 위 함수는 "Spline 위에서 currentSplineDistance만큼 이동한 지점의 월드 위치를 가져와라"라는 뜻이다.
0.0f는 Spline의 시작점
currentSpline->GetSplineLength()는 끝 지점
currentCharacter = GetWorld()->SpawnActor<ACharacter>(
Data.characterClass,
spawnLocation,
spawnRotation,
spawnParams
);
Actor 안의 Spline 시작 위치(0.0f)를 가져와서 스폰했다.
현재 월드에 Data.characterClass 캐릭터를 spawnLocation / spawnRotation 위치에 생성하고 그 포인터를 currentCharacter에 저장한다.
SpawnParams.Owner = this;는 “이 매니저가 스폰한 액터다” 정도의 소유자 표시.
void ShowTransition(TFunction<void()> action);
나중에 실행할 코드를 적어놓는 람다같은 것.
여기서 void()뜻은 인자값, 리턴값 없다는 것.
rootWidgetInstance->ShowTransition([this, pc, rootWidgetInstance]()
{
pc->SetViewTargetByTag("CharacterSelectCamera", 0.0f);
if (IsValid(ScreenSwitcher) == true)
{
ScreenSwitcher->SetActiveWidgetIndex(1);
}
});
이런식으로 ShowTransition이 끝나면 뒤 {} 안의 코드를 실행해달라는 것이다.
void UOutGameRootWidget::ShowTransition(TFunction<void()> action)
{
pendingTransitionAction = MoveTemp(action);
if (IsValid(TransitionWidget) == true)
{
TransitionWidget->PlayFadeOut();
}
}
이렇게 pendingTranstionAction에 저장만 해둔다.
이 작업의 흐름은PlayFadeOut() 후 Animation이 끝나면 Broadcast()하여
HandleTransitionFadeOutFinished()를 실행한다.
void UOutGameRootWidget::HandleTransitionFadeOutFinished()
{
if (pendingTransitionAction)
{
pendingTransitionAction();
pendingTransitionAction = nullptr;
}
if (IsValid(TransitionWidget) == true)
{
TransitionWidget->PlayFadeIn();
}
}
여기서 pendingTransitionAction()에 아까 람다를 담았으니까 여기서 실행을 해준다.
결국 TFFunction<void()>를 사용한 이유는
FadeOut 끝나고 할 일이 매번 다르고 FadeOut이 진행되는 검은화면 시점에 세팅을 끝내두고 싶기때문에 사용했다.