오늘의 코드카타
- n^2 배열 자르기
- 행렬의 곱셈
- 할인 행사
- 의상
- 기능개발
오늘의 공부
팀 프로젝트 진행 내용
1. Gameplay Cue에 Niagara System 출력되게 추가
// EGGameplayCue.h
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "SFX")
TObjectPtr<UNiagaraSystem> NiagaraSystem;
// EGGameplayCue.cpp
void UEGGameplayCue::HandleGameplayCue(AActor* Target, EGameplayCueEvent::Type EventType,
const FGameplayCueParameters& Parameters)
{
if (EventType == EGameplayCueEvent::Executed)
{
...
if (NiagaraSystem)
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(Target, NiagaraSystem, Location, FRotator::ZeroRotator, FVector(1.0f));
EG_LOG(LogKH, Warning, TEXT("Spawn Niagara System"));
}
}
...
}

2. 시퀀스 재생
PublicDependencyModuleNames.AddRange(new string[]
{
...
// Sequence
"MovieScene", "LevelSequence",
});
class EG_API AEGPlayerController : public APlayerController
{
GENERATED_BODY()
...
public:
UFUNCTION(Client, Reliable)
void ClientRPC_PlayEndingSequence(bool bIsWinner);
UFUNCTION(Server, Reliable)
void ServerRPC_NotifySequenceFinished();
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sequence")
TObjectPtr<ULevelSequence> CommonSequence;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sequence")
TObjectPtr<ULevelSequence> WinSequence;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sequence")
TObjectPtr<ULevelSequence> LoseSequence;
UPROPERTY()
ULevelSequencePlayer* CurrentSequencePlayer;
UFUNCTION()
void OnCommonSequenceFinished();
UFUNCTION()
void OnFinalSequenceFinished();
private:
bool bCachedIsWinner;
void PlayLevelSequence(ULevelSequence* Sequence, bool bIsFinal);
};
void AEGPlayerController::PlayLevelSequence(ULevelSequence* Sequence, bool bIsFinal)
{
if (!IsLocalController() || !Sequence)
{
return;
}
FMovieSceneSequencePlaybackSettings Settings;
ALevelSequenceActor* OutActor = nullptr;
CurrentSequencePlayer = ULevelSequencePlayer::CreateLevelSequencePlayer(GetWorld(), Sequence, Settings, OutActor);
if (CurrentSequencePlayer)
{
if (bIsFinal)
{
CurrentSequencePlayer->OnFinished.AddDynamic(this, &ThisClass::OnFinalSequenceFinished);
}
else
{
CurrentSequencePlayer->OnFinished.AddDynamic(this, &ThisClass::OnCommonSequenceFinished);
}
CurrentSequencePlayer->Play();
}
}
void AEGPlayerController::OnCommonSequenceFinished()
{
if (CurrentSequencePlayer)
{
CurrentSequencePlayer->OnFinished.RemoveDynamic(this, &ThisClass::OnCommonSequenceFinished);
CurrentSequencePlayer = nullptr;
}
if (bCachedIsWinner)
{
PlayLevelSequence(WinSequence, true);
}
else
{
PlayLevelSequence(LoseSequence, true);
}
}
void AEGPlayerController::OnFinalSequenceFinished()
{
if (CurrentSequencePlayer)
{
CurrentSequencePlayer->OnFinished.RemoveDynamic(this, &ThisClass::OnFinalSequenceFinished);
CurrentSequencePlayer = nullptr;
}
if (IsLocalController())
{
ServerRPC_NotifySequenceFinished();
}
}
정리 노트