Dev17 조작 매뉴얼, 전체적인 디자인 변경, 시작화면 효과, 음악과 SE 추가, 플레이어 마법 추가, 두번째 던전 세팅 시작
조작 매뉴얼
M키로 열고 닫을 수 있는 매뉴얼.
Main.h
void ShowManual();
Main.cpp
in SetupPlayerInputComponent()
PlayerInputComponent->BindAction("ShowManual", IE_Pressed, this, &AMain::ShowManual);
void AMain::ShowManual() // M키 누르면 실행
{
if (MainPlayerController->bManualVisible) MainPlayerController->RemoveManual();
else MainPlayerController->DisplayManual();
}
매뉴얼이 보이는 상태면 RemoveManual(), 안 보이는 상태면 DisplayManual()
MainPlayerController.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
TSubclassOf<UUserWidget> WManual;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Widgets")
UUserWidget* Manual;
void DisplayManual();
void RemoveManual();
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
bool bManualVisible = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
class USoundBase* ManualSoundCue; // 매뉴얼 사운드
MainPlayerController.cpp
in BeginPlay()
if (WManual)
{
Manual = CreateWidget<UUserWidget>(this, WManual);
if (Manual)
{
Manual->AddToViewport();
Manual->SetVisibility(ESlateVisibility::Hidden);
}
}
위젯 생성 후 뷰포트에 추가하고 히든.
void AMainPlayerController::DisplayManual()
{
if (Manual)
{
if (bMenuVisible || bDialogueUIVisible) // 메뉴가 보이거나 대화창이 보이는 상태
{
DisplaySystemMessage(); // 시스템 메세지 표시
text = FString(TEXT("대화 중이거나 메뉴가 활성화된 상태에서는\n조작 매뉴얼을 볼 수 없습니다."));
SystemText = FText::FromString(text);
FTimerHandle Timer;
GetWorld()->GetTimerManager().SetTimer(Timer, FTimerDelegate::CreateLambda([&]()
{
if (SystemMessageOn) SetSystemMessage(); // 기존에 다른 시스템 메세지가 있었으면 다시 그걸로 돌림
else if (bSystemMessageVisible) RemoveSystemMessage(); // 기존 시스템 메세지가 없었고 시스템 메세지가 보이는 상태면 시스템 메세지 삭제
}), 2.f, false);
}
else // 메뉴가 보이거나 대화창이 보이는 상태가 아니면
{
if (ManualSoundCue != nullptr) // 매뉴얼 사운드가 있으면 재생
UAudioComponent* AudioComponent = UGameplayStatics::SpawnSound2D(this, ManualSoundCue);
bManualVisible = true; // 매뉴얼 보이는 상태
Manual->SetVisibility(ESlateVisibility::Visible);
}
}
}
void AMainPlayerController::RemoveManual()
{
if (Manual)
{
if (ManualSoundCue != nullptr) // 닫을 때도 사운드 재생
UAudioComponent* AudioComponent = UGameplayStatics::SpawnSound2D(this, ManualSoundCue);
bManualVisible = false;
Manual->SetVisibility(ESlateVisibility::Hidden);
if (DialogueNum == 2 && SystemMessageNum != 4) // 동굴 안, 포탈 이동 메세지 상태가 아니면
{
Main->bCanMove = true;
SystemMessageNum = 3; // 지팡이 메세지
DialogueEvents();
}
}
}
매뉴얼이 열려있는 상태로 대화를 시작하거나 메뉴를 띄울 때는 자동으로 매뉴얼을 닫음.
in DisplayDialogueUI() and DisplayMenu()
if (bManualVisible) RemoveManual();
매뉴얼 위젯 블루프린트
전체적인 디자인 변경
시작화면
캐릭터 선택 화면
메뉴
세이브 파일 없음
새로 시작할 때 효과
돌이 막 움직이게 함. (노가다로 얻은..)
이어하기
저장된 대화 넘버에 따라 오픈되는 레벨이 다름.
배경음악과 사운드 이펙트들 추가
배경음악은 PlaySound2D 노드 사용.
버튼 효과음 등 UI사운드는 SpawnSound2D 노드 사용.
그리고 화면 전환, 맵 전환 모두 페이드 아웃, 페이드인 들어감.
플레이어 마법 2종 추가
전기볼(레벨 3에 획득)
독 공격(레벨 4에 획득)
두번째 던전 작업 시작
레벨이 로드가 되어도 플레이어 스폰도 그렇고 다 안 되길래 머리 싸매고 있었는데 가장 핵심 원인은
월드 세팅의 게임모드 오버라이드였다. 새 맵을 추가하려 할 땐 저것부터 잘 확인하도록 하자..
두번째 던전맵 레벨 블루프린트
바로 배경음악 재생하고 세이브 파일 있는지 검사. 당연히 있어야 한다.
시네마틱 모드를 설정해 움직이지 못하게 하고 페이드인아웃 위젯 뷰포트에 추가하여 검은 화면으로 만듬.
세이브파일 불러온 뒤
저장된 플레이어 성별 정보에 따라 남캐 혹은 여캐를 스폰.
HUDOverlay위젯을 생성하고 보이지 않게 한 후
뷰포트에 추가. 플레이어 지팡이를 스폰하고 플레이어에게 장착시킴.
LoadGame()을 실행한 뒤 대화 넘버가 5면 = 두번째 던전에 처음 오는 거
아까 LoadGame()덕에 플레이어가 이상한 위치에 가있을 테니 플레이어 위치 설정해주고 페이드인.
1.5초 뒤 대화 시작 6초 뒤 HUDOverlay 보이게 하고 SaveGame() 실헹.
저장된 대화 넘버가 5가 아니면 = 최소한 두번째 던전에서 첫 대화는 끝냄.
따라서 바로 페이드인하고 시네마틱 모드 해제한 뒤 HUDOverlay 보이게 하고 SaveGame() 실헹.
두번째 던전에서의 첫 대화.
이 대화 이후 npc 전부 플레이어를 따라 이동.
걸어서 가보면 더 이상 갈 수 없음.
오버랩 이벤트가 가능한 트리거 박스를 만들어둠.
트리거 박스에 오버랩된 게 플레이어면 1초 뒤 대화 시작.
다시 돌아가서 잘 보면
공중에 떠있는 발판이 있는데 점프해서 다른쪽으로 넘어갈 것.
플레이어는 문제가 없지만 npc들이 문제..