10.06 - TIL

김혁·2025년 10월 6일

TIL

목록 보기
32/84

오늘의 코드카타

오늘의 공부

팀 프로젝트 진행 내용

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",
});
  • PlayerController.h
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);
};
  • LevelSequence 재생 함수
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();
	}
}
  • Sequence 종료 시에 발생하는 함수
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();
	}
}

정리 노트

profile
게임 개발자를 향해..

0개의 댓글