2024.08.12
이번 글에서는 ShootWonban 게임의 Stage 1을 완성한 내용을 정리합니다. 최고 스코어 관리 방법과 총기 시스템 구현에 대한 상세 설명을 다룹니다. 게임 오버 처리와 관련된 UI 및 전체 게임 개발 과정을 간략하게 정리합니다.
github |
---|
https://github.com/ChangJin-Lee/ShootWonban |
Stage 1에서는 기본적인 게임 플레이 메커니즘을 완성했습니다. 원반이 던져지고 플레이어가 이를 맞추면 점수가 증가하며, 게임 오버 시 GameOver 위젯이 표시됩니다. 게임 플레이 도중의 점수는 최고 스코어로 저장되며, 총기 시스템을 통해 플레이어가 원반을 맞출 수 있도록 구현했습니다.
최고 스코어는 플레이어의 게임 기록을 유지하기 위해 매우 중요합니다. 이를 위해 SaveGame
클래스를 사용하여 스코어를 저장하고 불러오는 기능을 구현했습니다.
// ShootWonbanSaveGame.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/SaveGame.h"
#include "ShootWonbanSaveGame.generated.h"
UCLASS()
class SHOOTWONBAN_API UShootWonbanSaveGame : public USaveGame
{
GENERATED_BODY()
public:
UShootWonbanSaveGame();
UPROPERTY(VisibleAnywhere, Category = "Score")
int32 HighScore;
UPROPERTY(VisibleAnywhere, Category = "Score")
TArray<int32> StageClearScore;
};
// ShootWonbanSaveGame.cpp
#include "ShootWonbanSaveGame.h"
UShootWonbanSaveGame::UShootWonbanSaveGame()
{
HighScore = 0;
StageClearScore = {10, 15, 20};
}
// ShootWonBanPlayerController.cpp
void AShootWonBanPlayerController::SaveHighScore(int32 Score)
{
UShootWonbanSaveGame* SaveGame = Cast<UShootWonbanSaveGame>(UGameplayStatics::CreateSaveGameObject(UShootWonbanSaveGame::StaticClass()));
if (SaveGame)
{
SaveGame->HighScore = Score;
UGameplayStatics::SaveGameToSlot(SaveGame, TEXT("WonbanScoreSlot"), 0);
}
}
int32 AShootWonBanPlayerController::LoadHighScore()
{
if (UGameplayStatics::DoesSaveGameExist(TEXT("WonbanScoreSlot"), 0))
{
UShootWonbanSaveGame* LoadGame = Cast<UShootWonbanSaveGame>(UGameplayStatics::LoadGameFromSlot(TEXT("WonbanScoreSlot"), 0));
if (LoadGame)
{
return LoadGame->HighScore;
}
}
return -1;
}
게임 내에서 총기를 관리하는 시스템을 구현하여 플레이어가 원반을 맞출 수 있도록 했습니다. 플레이어는 총기를 사용해 원반을 맞출 수 있으며, 총기의 탄약이 줄어드는 방식을 구현했습니다.
// ShootWonbanCharacter.h
UCLASS()
class SHOOTWONBAN_API AShootWonbanCharacter : public ACharacter
{
GENERATED_BODY()
public:
AShootWonbanCharacter();
UFUNCTION(BlueprintCallable, Category = "Weapon")
void Fire();
private:
int32 CurrentAmmo;
int32 MaxAmmo;
};
// ShootWonbanCharacter.cpp
AShootWonbanCharacter::AShootWonbanCharacter()
{
MaxAmmo = 30;
CurrentAmmo = MaxAmmo;
}
void AShootWonbanCharacter::Fire()
{
if (CurrentAmmo > 0)
{
CurrentAmmo--;
// 총알 발사 로직
}
}
게임이 종료되었을 때 GameOver
위젯을 생성하여 결과를 표시하고, 플레이어가 결과를 확인할 수 있도록 했습니다.
void AShootWonBanPlayerController::CreateGameOverWidget()
{
GameOverWidget = CreateUIWidget(GameOverWidgetClass);
APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
if (PlayerController)
{
FInputModeUIOnly InputMode;
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;
}
}
UUserWidget* AShootWonBanPlayerController::CreateUIWidget(TSubclassOf<UUserWidget> WidgetClass)
{
if(WidgetClass)
{
UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetClass);
if(Widget && GetCurrentStageName() != FString("MainMenu"))
{
Widget->AddToViewport();
return Widget;
}
}
return nullptr;
}
GameOver
위젯을 생성하여 화면에 표시하고, UI 전용 입력 모드로 전환하여 마우스 커서를 표시했습니다.ShootWonban 게임에서는 정밀한 사격을 위해 조준 기능을 추가했습니다. 플레이어가 마우스 우클릭을 통해 조준을 시작하면 화면이 확대되며, 이를 통해 더욱 정확하게 사격할 수 있습니다.
void AShootWonBanCharacter::Aim()
{
AimTimeline.Play();
}
void AShootWonBanCharacter::CancelAim()
{
AimTimeline.Reverse();
}
void AShootWonBanCharacter::UpdateZoom(float Value)
{
float TargetFOV = FMath::Lerp(DefaultFOV, ZoomedFOV, Value);
FirstPersonCameraComponent->SetFieldOfView(TargetFOV);
}
플레이어는 1번무기, 2번무기를 전환하며 사용할 수 있도록 구현했습니다. 숫자 키 1번, 2번을 이용해 무기를 변경할 수 있으며, 각 무기는 고유한 특성을 가지고 있습니다.
void AShootWonBanCharacter::SelectWeaponSlot1()
{
if (CurrentWeaponIndex != 0)
{
ChangeWeaponState(CurrentWeaponIndex, 0);
}
}
void AShootWonBanCharacter::SelectWeaponSlot2()
{
if (CurrentWeaponIndex != 1 && Weapons.Num() >= 2)
{
ChangeWeaponState(CurrentWeaponIndex, 1);
}
}
void AShootWonBanCharacter::ChangeWeaponState(int32 CurrentIndex, int32 NewIndex)
{
if (CurrentWeapon == nullptr)
{
return;
}
Weapons[CurrentIndex]->SetActorHiddenInGame(true);
Weapons[NewIndex]->SetActorHiddenInGame(false);
CurrentWeapon = Weapons[NewIndex];
CurrentWeaponIndex = NewIndex;
}
ShootWonban 게임의 Stage 1 개발은 다음과 같은 주요 단계를 거쳐 완료되었습니다:
SaveGame
클래스를 사용하여 저장하고 관리했습니다.이번 Stage 1의 완성으로 ShootWonban 게임의 기본적인 메커니즘이 완성되었습니다. 다음 스테이지에서는 다른 맵을 추가할 계획이고, 게임의 전반적인 완성도를 높일 수 있는 작업들을 진행할 예정입니다.
이 글이 ShootWonban 게임의 개발 과정을 이해하는 데 도움이 되길 바라며, 다음 단계의 프로젝트에서도 이러한 경험이 유용하게 활용될 수 있기를 기대합니다. 피드백이나 질문이 있으면 언제든지 남겨주세요!