레벨을 이동해보겠습니다
레벨을 이동시켜줄 콜리전을 가지고있는 액터를 만들어주었습니다.
오버랩 상호작용할 boxCollision과 루트컴포넌트 씬 컴포넌트를 선언해주고 만들어주었습니다
UPROPERTY(EditAnywhere, Category = "MySettings")
class UBoxComponent* boxCollision;
UPROPERTY(EditAnywhere, Category = "MySettings")
class USceneComponent* sceneComp;
ATeleporterCristal::ATeleporterCristal()
{
PrimaryActorTick.bCanEverTick = true;
sceneComp = CreateDefaultSubobject<USceneComponent>(TEXT("sceneComp"));
RootComponent = sceneComp;
boxCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxCollision"));
boxCollision->SetupAttachment(RootComponent);
}
사용할 콜리전의 크기를 조절 사용할 블루프린트액터나 메시를 할당해주었습니다
오버랩 처리를 해주겠습니다 부딪힌 대상이 SwordCharacter면 반응하며 targetLvelPath의 이동경로로 이동합니다
UFUNCTION()
void OnBeginOverlapCollision(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UPROPERTY(EditAnywhere, Category = "MySettings")
FString targetLevelPath;
void ATeleporterCristal::BeginPlay()
{
Super::BeginPlay();
boxCollision->OnComponentBeginOverlap.AddDynamic(this, &ATeleporterCristal::OnBeginOverlapCollision);
}
void ATeleporterCristal::OnBeginOverlapCollision(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
FString hitActorName = OtherActor->GetName();
if (hitActorName.Contains(TEXT("SwordCharacter")))
{
UGameplayStatics::OpenLevel(this, FName(*targetLevelPath));
}
}
해당 경로는 레벨의 레퍼런스 복사 이후 /Game 앞의 경로를 지워주고
맨뒤의 필요없는 .~~ 를 지워주시고 넣어주시면되겠습니다
그럼 해당 경로의 맵으로 이동하게됩니다
레벨을 전환할때 페이드 아웃과 페이드 인을 만들어보도록 하겠습니다
사용할 위젯을 생성
보더를 추가한뒤 색상을 검정으로 설정
페이드인과 페이드아웃의 애니메이션을 만듭니다
위젯과 코드를 연동해주도록 하겠습니다
UPROPERTY(meta = (BindWidget))
class UBorder* Border_Fade;
UPROPERTY(meta = (BindWidgetAnim), Transient)
class UWidgetAnimation* FadeIn;
UPROPERTY(meta = (BindWidgetAnim), Transient)
class UWidgetAnimation* FadeOut;
UFUNCTION()
void PlayFadeIn();
UFUNCTION()
void PlayFadeOut();
void UFadeInOutWidget::PlayFadeIn()
{
PlayAnimation(FadeIn);
}
void UFadeInOutWidget::PlayFadeOut()
{
PlayAnimation(FadeOut);
}
위젯애니메이션 만드는법은 전 이전 글을 참고바랍니다
2025.04.04 - [Unreal5 프로젝트 다이어리] - Unreal 캐릭터 - 위젯애니메이션
Unreal 캐릭터 - 위젯애니메이션
스킬의 위젯블루프린트 애니메이션을 통해 스킬쿨타임을 시각적으로 보여주는걸 만들어보자해당 애니메이션을 원하는객체를 선택후좌측하단에 있는 애니메이션을 열고+애니메이션 해서 노드
lucodev.tistory.com
페이드아웃부터 해보겠습니다
위젯을 참조할 fadeWidget그리고 인스턴스 그리고 레벨을 오픈할 함수를 만들어줍니다
UPROPERTY(EditAnywhere, Category = "MySettings")
TSubclassOf<class UFadeInOutWidget> fadeWidget;
UFadeInOutWidget* fadeWidgetInstance;
UFUNCTION()
void OpenLevel();
오버랩의 함수를 변경해주겠습니다
오버랩되었을때 플레이어컨트롤러에 위젯인스턴스를 AddToViewport해서
페이드아웃 위젯을 띄우고 FadeOut 애니메이션이 끝나면 델리게이트 이벤트로 OpenLevel함수를 호출
레벨을 이동시킵니다
void ATeleporterCristal::OnBeginOverlapCollision(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
FString hitActorName = OtherActor->GetName();
if (hitActorName.Contains(TEXT("SwordCharacter")))
{
APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
if (PC)
{
fadeWidgetInstance = CreateWidget<UFadeInOutWidget>(PC, fadeWidget);
if (fadeWidgetInstance)
{
fadeWidgetInstance->AddToViewport();
FWidgetAnimationDynamicEvent endEvent;
endEvent.BindDynamic(this, &ATeleporterCristal::OpenLevel);
fadeWidgetInstance->BindToAnimationFinished(fadeWidgetInstance->FadeOut, endEvent);
}
fadeWidgetInstance->PlayFadeOut();
}
}
}
void ATeleporterCristal::OpenLevel()
{
UGameplayStatics::OpenLevel(this, FName(*targetLevelPath));
}
페이드 아웃이 잘 일어나는것을 확인할수 있습니다
페이드 인 입니다
페이드 인을 하는곳은 이동한 맵의 GameMode입니다
.h의 코드입니다
//fade
UPROPERTY(EditAnywhere, Category = "MySettings")
TSubclassOf<class UFadeInOutWidget> fadeWidget;
UFadeInOutWidget* fadeWidgetInstance;
UFUNCTION()
void RemoveFadeOutWidget();
.cpp입니다
pCon = UGameplayStatics::GetPlayerController(this, 0);
//fade
if (pCon && bNeedFadeIn)
{
fadeWidgetInstance = CreateWidget<UFadeInOutWidget>(pCon, fadeWidget);
if (fadeWidgetInstance)
{
fadeWidgetInstance->AddToViewport();
if (fadeWidgetInstance->FadeIn)
{
FWidgetAnimationDynamicEvent endEvent;
endEvent.BindDynamic(this, &ASwordPlayerGameBase::RemoveFadeOutWidget);
fadeWidgetInstance->BindToAnimationFinished(fadeWidgetInstance->FadeIn, endEvent);
}
}
fadeWidgetInstance->PlayFadeIn();
}
RemoveFadeOutWidget함수입니다
void ASwordPlayerGameBase::RemoveFadeOutWidget()
{
if (fadeWidgetInstance)
{
fadeWidgetInstance->RemoveFromParent();
fadeWidgetInstance = nullptr;
}
}
bool변수 bNeedFadeIn 변수가 True일떄만 작동하게 하였습니다
페이드인과 아웃이 잘 작동합니다
'Unreal5 프로젝트 다이어리' 카테고리의 다른 글
Unreal - 버튼 위젯 사용하기 (0) | 2025.05.16 |
---|---|
Unreal - 로딩 창 (0) | 2025.05.16 |
Unreal - GameMode로 맵마다 설정을 변경하기 (0) | 2025.05.15 |
Unreal - 쿼터뷰 시점 벽에 붙었을떄 카메라의 이동 (0) | 2025.05.15 |
Unreal - AI의 회피 알고리즘( RVO ) (0) | 2025.05.10 |