4. 서버 구축을 위한 삽질

개발 일지|2024. 9. 2. 23:01

서버구축.. 쉽지않다.

 

원래는 호스트를 맡은 클라이언트에게 리슨 서버를 짬때려서 데디케이트 서버를 클라우드나 내 로컬에 띄워놓는 비용을 줄이고 싶었다.

그래서 방법을 알아봤는데, 호스트 유저의 고정 IP 사용, 포트포워딩, NAT우회 같은 이슈가 발생했다.

내가 기술적으로 추후 사용할 유저가 이런 문제에 대해 아예 신경쓰지 않고 플레이 하도록 코드를 작성해놓고 배포하는건 쉽지 않을것 같았다.

 

그래서 배포계획도 없고 만약 배포한다 해도 몇명이나 쓸까 싶은 내 프로젝트에는 비용을 아끼기위한 꼼수보다 이미 많은 게임들이 사용하고 있는 방식으로 연습하는 셈 치고 구현하는게 맞는것 같아서 데디케이트 서버를 구축해서 개발하기로 결정했다.

 

하지만 데디케이트 서버를 만들기 위해 서버용 UE5 에디터 환경을 만드는것도 쉽지않았다.

 

토목공사를 삽질로만 만들어준 고마운 분

https://velog.io/@singery00/UE5-Dedicate-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95

 

[UE5] 🌐 Dedicated 서버 구축

🌐 Dedicated 서버를 구축하고 멀티 플레이 게임을 만들어보자.

velog.io

 

 

 

우선 깃헙의 에픽게임즈 -> 언리얼엔진으로 들어가 계정을 연결한다.

https://www.unrealengine.com/ko/ue-on-github

공식 페이지에 잘 정리되어있다.

 

그리고 release 페이지를 확인하는데, 버전이 정확하게 일치해야한다.

나같은경우 5.3.2를 써서 개발하는 중인데, 5.3도 되겠지? 하는 안일한 마인드로 처음부터 다시 했다.

굉장히 오래 걸리는 과정이기 때문에 버전 잘못되서 기존 프로젝트 못열면 기분이 상당히 안좋다..

왼쪽 상단 릴리즈 대신 우측의 릴리즈 페이지로 들어가서 정확한 버전을 체크하자.

 

zip파일을 다운받고 압축 해제 -> setup.bat 파일 실행 (좀 오래걸림. 씻고 저녁 만들어서 먹고 설거지 하고 오면 대충 다 된다.) -> generateprojectfiles.bat 실행 (이건 금방함) 까지 하면 UE5.sln이라고 프로젝트 파일이 생긴다. 이거 열자.

솔루션 Development Editor, Win64 맞는지 확인

 

UE5를 빌드 해보자. (진짜진짜 오래걸림)

나는 거의 8시간 걸렸다.

 

빌드가 다되면 UE5를 시작프로젝트로 설정하고 ctrl+f5로 실행해준다.

 

셰이더 컴파일도 오래걸린다. 체감상 한 30분?

에디터가 잘 열리면 이제부터 이걸로 개발해야한다.

 

아 에픽게임즈 런처에서 다운받은 언리얼 엔진으로는 데디케이트 서버 구축이 안된다고 한다.

깃헙에서 다운받은 엔진으로만 한다고 한다.

에픽게임즈 런처에서 다운받은 언리얼 엔진과 깃허브에서 다운받은 언리얼 엔진은 버전 숫자는 같아도 내부 API같은게 조금씩 다를수 있어 서로 호환이 안될수도 있다고 한다.

어이가 없네...

그래서 런처에서 다운받은 엔진으로 개발했던 프로젝트가 깃헙에서 다운받은 엔진으로는 안열렸던것.

 

요새 날이 좀 시원해졌는데 머리가 뜨거워진다.

 

대충 해결한것 같다.

에픽게임즈 런처에서 다운받았던 에디터로 개발한 프로젝트는 살린것 같다.

먼저 지형을 그려주는 브러시를 플러그인으로 다운받아 썻었는데 그 플러그인을 지우고 그 플러그인으로 생성했던 더미맵도 지웠다.

그리고 프로젝트 폴더의 Binary 폴더와 immediate 폴더를 지웠다.

 

그다음 일반적인 데디케이트 서버 구축의 과정을 진행했다.

1. source 폴더의 Target.cs 파일을 복붙해 프로젝트명Server.Target.cs로 고쳐주고 vs를 킨다.

2. 프로젝트에 복붙한 파일 추가해주고 내부 프로젝트 이름으로 된 클래스 이름 같은것들을 프로젝트ServerTarget으로 수정해준다.

요런느낌

3. 저장해주고 uproject 우클릭해서 언리얼 엔진 버전을 깃헙에서 받은 엔진으로 설정해준다.

4. uprojecct 파일 우클릭해서 generate visual studio project files 실행해준다.

5. Development Editor, Win64 설정으로 프로젝트 빌드 한번 해준다.

6. Development Server, Win64 설정으로 프로젝트 빌드 한번 해준다.

 

이렇게 하니 정상적으로 열린다.

이제 멀티플레이를 위해 세션 생성, 세션 참가 같은걸 만들어 보자.

'개발 일지' 카테고리의 다른 글

3. 플레이어 랜덤 스폰 구현  (0) 2024.08.31
2. 움직이는 플레이어 캐릭터 만들기  (0) 2024.08.26
1. 메인메뉴 구성  (0) 2024.08.26
시작  (0) 2024.08.21

댓글()

3. 플레이어 랜덤 스폰 구현

개발 일지|2024. 8. 31. 22:14

게임맵으로 이동할 때 랜덤한 위치에 캐릭터가 스폰되도록 해야한다.

이유는 정해진 위치에만 스폰되는것보다 더 재밌을것 같아서.

 

스폰 로직을 구성하기 위해 RandomSpawnSys 이름으로 빈 클래스를 하나 생성했다.

이 클래스에 랜덤 위치를 계산하고, 지형 위에 스폰되도록 위치를 조정하는 로직을 구현할 예정이다.

이 방식을 위해 지형을 스캔하여 전체 맵에서 특정 지역에 랜덤으로 떨어지게 하려고 하였으나, 캐릭터 스폰 시스템이 꼬여 캐릭터 클래스가 null이 되는 문제 발생.

 

제대로 작동하지 않는 부분을 고치지 못해 스폰 위치를 지정해서 그중에서 랜덤으로 스폰되도록 코드를 수정했다.

 

만들어진 C++ 클래스를 블루프린트에 옮겨 에디터에서만 보이고 플레이어에게는 보이지 않는, 충돌 옵션을 제외한 스태틱 메쉬를 입힌다.

Add Component에서 간단하게 Sphere 하나 입혀준다.

Detail 패널에서 Actor hidden in game 옵션을 켜 에디터에서만 보이게 하고, collision 옵션에서 NoCollision 옵션을 선택해 플레이어가 보이지 않는 스폰지점에 막히지 않도록 해준다.

 

랜덤 위치 스폰을 위해 플레이어 캐릭터 클래스에 함수를 하나 추가했다.

void AFirstPersonCharacter::SpawnPlayerAtRandomLocation()
{
	TArray<AActor*> SpawnPoints;
	UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASpawnPoints::StaticClass(), SpawnPoints);

	if (SpawnPoints.Num() == 0) {
		UE_LOG(LogTemp, Error, TEXT("No Spawn Points! Fix your Logic."));
		return;
	}

	int32 RandomPoint = FMath::RandRange(0, SpawnPoints.Num() - 1);
	ASpawnPoints* ChosenSpawnPoint = Cast<ASpawnPoints>(SpawnPoints[RandomPoint]);

	if (ChosenSpawnPoint) {
		SetActorLocation(ChosenSpawnPoint->GetActorLocation());
		SetActorRotation(ChosenSpawnPoint->GetActorRotation());
	}
	else {
		UE_LOG(LogTemp, Error, TEXT("Failed to cast Chosen Spawn Point!"));
	}
}

 

SpawnPoint를 AActor 타입의 포인터 배열로 선언해, 여러개의 스폰 포인트들을 담을 수 있도록 준비한다.

모든 액터를 포괄적으로 다룰수 있는 AActor 타입으로 먼저 선언해둔 다음, 가져온 객체들을 ASpawnPoints 객체로 캐스팅 한다.

현재 월드에 존재하는 SpawnPoint 클래스 객체들을 찾아 SpawnPoints 배열에 담는다.

RandomPoint 변수에 랜덤 인덱스를 저장한 다음, AActor 타입으로 가져온 SpawnPoint 액터들을  ASpawnPoints로 타입캐스팅 한다.

 

이후 선택된 ChosenSpawnPoint 객체에서 Location 정보와 Rotation 정보를 가져와 플레이어 캐릭터의 위치와 회전값을 결정해주면 랜덤 스폰 시스템이 완성된다.

 

처음에 계획했던 시스템처럼 되진 않았지만, 내가 처음 결정해둔 위치에 플레이어들이 랜덤하게 스폰되는 시스템은 구축했다.

 

처음 개발자가 결정해둔 위치 중 랜덤으로 스폰하는 방식은 Dead By Daylight처럼 오랜시간 플레이한 유저가 처음 스폰 위치를 모두 외우고 시작시점의 플레이를 유리하게 가져가는 모습이 나올까봐 전체 지형중에 완전하게 랜덤하게 떨어지는 방식을 구현하려 했었다.

하지만 로직의 에러를 해결하지 못하고 위와 같은 방식으로 변경했다.

완전하게 랜덤하게 떨어진다면 같은 방 안에 여러명의 유저가 떨어지는 등의 대참사가 발생할 수 있었다고 좋게 생각하기로 했다..

 

'개발 일지' 카테고리의 다른 글

4. 서버 구축을 위한 삽질  (0) 2024.09.02
2. 움직이는 플레이어 캐릭터 만들기  (0) 2024.08.26
1. 메인메뉴 구성  (0) 2024.08.26
시작  (0) 2024.08.21

댓글()

2. 움직이는 플레이어 캐릭터 만들기

개발 일지|2024. 8. 26. 22:41

이제 레벨에서 캐릭터를 움직여보고 총을 쏘는 부분을 구현해보려고 한다.

 

먼저 Tools 에서 C++ 클래스를 하나 만드는데, 캐릭터로 선택했다.

 

Actor는 레벨에 배치하는 가장 기본적인 클래스. 

Pawn은 마우스나 키보드의 입력을 받아서 처리하는 클래스.

Character는 마우스나 키보드의 입력을 받아 플레이어가 움직이는 클래스.

 

변수 앞에 붙는 접두사에는

A(Actor 클래스), U(Unreal 클래스), F(구조체 이름), b(boolean 타입) 등이 있다.

 

라고 이해하고 우선 개발을 시작해보겠다.

 

 

캐릭터 클래스를 생성하면 처음에 뜨는 cpp 코드이다.

맨위는 생성자

2번째는 BeginPlay() 함수로 레벨이 시작될 때 처음 호출되는 함수이다.

3번째는 매 프레임 마다 호출되는 Tick() 함수

마지막 SetupPlayerComponent함수로 키보드나 마우스 입력을 바인딩하는 함수이다.

 

이렇게 생성해놓고, 우선 카메라를 세팅한다.

protected:

	UPROPERTY(EditAnywhere)
	class UCameraComponent* Camera;

 

FirstPersonCharacter.h 파일의 맨 밑에 protected로 Camera Unreal C++ 클래스를 생성한다.

U가 붙으면 일반 C++ 클래스가 아닌 언리얼에서 컴파일 단계에서 관리하는 언리얼 C++ 클래스라고 배운것 같다.

컴파일 단계에서 관리한다는 말이 맞는지 정확하지 않아 다시 알아봐야겠다.

 

그리고 FirstPersonCharacter.cpp 파일의 생성자에 다음과 같이 추가한다.

Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Player_Camera"));
Camera->SetupAttachment(RootComponent);
Camera->bUsePawnControlRotation = true;

 

Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Player_Camera"));

-> "UCameraComponent" 라는 카메라 컴포넌트 생성하는 역할.

-> "CreateDefaultSubobject"컴포넌트를 생성하고 초기화 할때 사용

 

Camera->SetupAttachment(RootComponent);

-> 카메라 컴포넌트를 액터의 기본 컴포넌트인 "RootComponent"에 할당. RootComponent가 이동할 때 카메라도 함께 따라가도록 설정

-> 카메라를 캐릭터 움직임에 맞춰 위치시킨다고 이해

 

Camera->bUsePawnControlRotation = true;

-> 카메라가 Pawn의 controller 회전을 따라가도록 설정. 이 설정으로 플레이어가 캐릭터를 움직일 때 카메라 방향이 함께 변경된다.

-> 카메라가 캐릭터의 회전을 따라가도록 설정한다고 이해

 

여기까지 한 후, 언리얼5 엔진을 킨다.

아까 만들어뒀던 캐릭터의 블루프린트를 열면 카메라가 생겨있는데, 위치를 조정하고 간단한 캐릭터 메쉬도 배치해준다.

 

그리고 Lobby Map의 World setting을 열어서 Gamemode Override를 내가 만들었던 Default Game Mode로 설정한다.

 

이러면 게임을 실행시켰을 때 캐릭터가 현재 위치에서 스폰되는걸 알 수 있다.

아직 캐릭터에 키보드나 마우스 입력을 바인딩하지 않아 움직이지 않는데, 이것부터 해결해서 캐릭터로 맵을 뛰어다녀보자.

 

기본값
내가 쓸 키보드&마우스에 맞춰서 이름도 바꾸고 값을 세팅해줬다

 

엔진의 input창을 보면 기본적으로 wasd, 마우스 시점 컨트롤, 스페이스바 점프까지 바인딩 되어있는걸 확인할 수 있다.

여기 적혀있는 이름대로 cpp 코드에서 구현하여 바인딩해주자.

 

근데 노란색 경고문이 있어 읽어보니 더이상 쓰이지 않는 기능? 인것 같다. 더이상 쓰이지 않으면 왜 넣어놓은거지? 일단 cpp로 구현해보자.

 

	// character movement function
	void MoveForward(float val);
	void MoveRight(float val);

	void Turn(float val);
	void LookUp(float val);

	void StartJump();
	void StopJump();

 

우선 키보드와 마우스를 받을 함수들을 Character 헤더파일에 선언해준다.

// Called to bind functionality to input
void AFirstPersonCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	// Keyboard Binding
	PlayerInputComponent->BindAxis("MoveForward", this, &AFirstPersonCharacter::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &AFirstPersonCharacter::MoveRight);

	PlayerInputComponent->BindAxis("Turn", this, &AFirstPersonCharacter::Turn);
	PlayerInputComponent->BindAxis("LookUp", this, &AFirstPersonCharacter::LookUp);

	PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFirstPersonCharacter::StartJump);
	PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFirstPersonCharacter::StopJump);

}

// Character, Camera Movement Function
void AFirstPersonCharacter::MoveForward(float val)
{
	if (Controller && val != 0.0f) {
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);
		
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		AddMovementInput(Direction, val);
	}
}

void AFirstPersonCharacter::MoveRight(float val)
{
	if (Controller && val != 0.0f) {
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		AddMovementInput(Direction, val);
	}
}


void AFirstPersonCharacter::Turn(float val)
{
	AddControllerYawInput(val);
}

void AFirstPersonCharacter::LookUp(float val)
{
	AddControllerPitchInput(val);
}

void AFirstPersonCharacter::StartJump()
{
	bPressedJump = true;
}

void AFirstPersonCharacter::StopJump()
{
	bPressedJump = false;
}

 

MoveForward 함수에서는 w와 s의 입력에 따른 캐릭터의 움직임을 계산한다.

If 조건문에서 캐릭터가 플레이어에 의해 제어되고 있는지 확인 && 키보드 val 값이 실제로 입력이 들어왔는지 확인.

Rotation 변수에서 카메라나 플레이어의 컨트롤러가 현재 바라보는 방향값을 Controller->GetControlRotation() 구문으로 받는다.

YawRotation(0, Rotation.Yaw, 0)로 Yaw값을 사용하는 회전 값을 만든다.

FRotator는 회전을 나타내는 구조체(F 접두사가 구조체를 가리킨다)인데, Pitch, Yaw, Roll 축을 나타낸다.

더보기

[Pitch, Yaw, Roll에 관하여]

 

Pich는 상하, Yaw는 좌우, Roll은 좌우 기울기.

Pitch와 Roll을 0으로 설정하고, Yaw값만 사용하면 캐릭터가 위아래를 바라보더라도 이동할땐 Yaw값만 사용해 좌우로만 이동한다.

Yaw는 Z축 회전각 -> 도리도리

Pitch는 Y축 회전각 -> 끄덕끄덕

Roll은 X축 회전각 -> 갸우뚱갸우뚱

 

참고한 블로그분이 정말 자세하게 남겨주셔서 잘 이해되었다.

 

참고: https://wise-eun.tistory.com/entry/Unreal-Yaw-Pitch-Roll-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

FRotationMatrix 함수를 사용해 회전을 방향 벡터로 변환한다.

YawRotation 값을 회전 행렬로 변환해서, GetUnitAxis(EAxis::X) 를 사용해 회전행렬값에서 X축 방향을 얻어 전진한다.

캐릭터가 앞을 향해 이동할 방향 벡터를 계산한다고 이해하자.

 

AddMovementInput 함수를 사용해 캐릭터를 특정 방향으로 이동시킨다. Direction 변수는 앞에서 계산한 X축 방향, val은 이동할 때 입력 강도(아까 엔진에서 설정했던 값에 따라 1.0이면 앞으로, -1.0이면 뒤로 이동).

 

MoveRight 함수는 위와 비슷하고 X축 대신 Y축 벡터를 사용하는것만 다르다.

 

Turn과 LookUp 함수에서는 AddControllerYawInput 함수를 사용해 Value값만큼 카메라를 회전시킨다.

 

StartJump와 StopJump 함수에선 bPressedJump를 T나 F값으로 설정해 점프를 시작하거나 멈춘다.

 

여기까지 해주고, 컴파일 한 후 LobbyMap에서 실행시키면 wasd 이동, 마우스에 따른 카메라의 회전, 스페이스바 입력시 점프가 잘 동작한다.

 

다음에는 메인메뉴에서 게임 시작시 캐릭터 스폰 위치 조정, 카메라 시점에 맞게 팔 달아주기, 총 하나 쥐여줘서 쏴보기 구현해보자.

 

[참고 많이 한 블로그]

https://tech-interview.tistory.com/295

'개발 일지' 카테고리의 다른 글

4. 서버 구축을 위한 삽질  (0) 2024.09.02
3. 플레이어 랜덤 스폰 구현  (0) 2024.08.31
1. 메인메뉴 구성  (0) 2024.08.26
시작  (0) 2024.08.21

댓글()

1. 메인메뉴 구성

개발 일지|2024. 8. 26. 18:04

메인 메뉴 구성 과정을 남겨보자.

처음 언리얼 기본 템플릿 중 First Person으로 해보려 했는데,

내가 만들지도 않은 코드 쳐다보고 있어봤자 지금은 별 도움 안될것 같아 빈 프로젝트로 만들어서 처음부터 해보려고 한다.

 

빈 프로젝트를 만들어 UMG 에디터로 메인화면을 구성해보고, 게임시작 -> 세션 설정 UI 클릭 이벤트 -> 레벨 이동까지 만들어 보자.

 

Content Browser에서 Maps와 UI 폴더를 만들어 관련 파일들을 저장한다. 사람들 간의 국룰 저장 폴더 경로를 들어본적 있는데 잘 기억나지 않아서 일단 Content 폴더에다가 만들었다.

메인 메뉴 UI를 띄울 MainMenu Level을 생성
UI 폴더에서 우클릭 -> 맨밑의 User Interface -> Widget Blueprint 클릭

 

이름은 MainMenuUI로 만들어 주고, 더블클릭해 UMG 에디터를 연다.

Unreal5 엔진에 Canvas 패널이 자동으로 생성되어있지 않기 때문에 직접 추가

 

Canvas Panel은 딱봐도 백그라운드 배경인것 같다. 추가해준다.

 

타이틀을 적을 Text box를 canvas hierarchy에 추가해주고, Size To Content 클릭해서 크기 맞춰준다. Anchors 클릭해서 기준점은 일단 상단 가운데로 잡아주고, 타이틀도 적어줬다.

폰트나 색상도 입맛대로 바꿔주고, Alignment 옵션을 X, Y 둘다 0.5로 맞춰서 정렬해준다. 

 

다음은 버튼들을 만들 차례이다. Vertical Box 하나 가져와서 그 안에 버튼들을 넣고, 그 버튼에 텍스트 박스도 넣어준다. 당연하겠지만 하나 만들고 복붙했다. Spacer 넣어주고 Padding 조절해서 간격 예쁘게 맞춰준다.

그리고 Detail 상단의 Is Variable을 체크해야 이벤트를 추가해줄수 있다. 왜 없지 하고 헤매지 말고 꼭 체크해주자.

Detail 맨 하단에 보면 On Clicked 있으니까 체크해서 클릭하고, 레벨 이동 구현해주자.

같은방식으로 Quit 메뉴도 클릭 이벤트 만들어준다.

 

여기까지 했는데 슴슴한 메뉴가 맘에 안들어서 뭐 없나 찾아보다가 괜찮은걸 발견해 적용하려 한다.

 

버튼의 테두리 역할을 할 이미지를 하나 가져와서 삽입한다. 나는 아이패드로 직접 그렸다.

적절한 백그라운드 이미지가 있으면 넣어주고, 나는 없어서 그냥 Border 하나 넣어서 색깔만 바꿨다. (버튼 아님)

그리고 scale 0.93으로 적당히 조정해 테두리 안쪽으로 들어가게 만들어준다.

 

 

텍스트 박스도 하나 추가해서 크기와 위치, 기준점 맞춰주고 Content->bind 들어간다

 

 

Variables의 TEXT 추가 후 Return node에 연결, Transform Policy를 To Upper로 설정

 

 

그리고 Stroke와 Background를 같이 묶어 마우스 호버 애니메이션을 지정해주는데, 핵심은 백그라운드는 작아졌다 원상복구, Stroke는 커졌다가 원상복구이다.

 

 

그리고 애니메이션을 지정해주는데, 버튼에 Hoveranimation을 바인딩 해주고 button text는 Instance Editable과 Expose on Spawn 옵션을 체크해준다.

 

 

그리고 했던걸 시원하게 날리고 새로 간격 맞춰준다

 

여러 레벨 디자인을 보고 따라해봤는데, 예전에 받아놨던 무료 에셋 중에 하나를 일단 사용하기로 했다.

 

widget blueprint에 버튼을 생성하고, 다시 main menu widget blueprint를 생성해서 메인 메뉴를 구성했다.

 

그런데 Start btn에는 click 이벤트를 할당해서 잘 동작이 됐는데, 다른 버튼들은 클릭 이벤트가 작동하지 않아 어디가 문제인지, 어떻게 고치는지 해결이 안돼서 헛다리를 많이 짚었다.

모듈화를 풀고 main menu ui에 하나하나 다 만들면 쉽게 해결이 되지만, 맞는 방법은 아니라는 생각에 다른 방법이 없나 계속 찾아보았다.

 

결론은 이것도 최선은 아닌것 같지만 일단 해결하였다.

bind event 노드끼리 연결해줘서 최종적으로 Event construct에 연결되도록 해줬더니 잘 작동했다.

이게 최선은 아니겠지만 일단 다음 스텝으로 넘어가고싶다...ㅠ

 

메인 화면 구성을 마쳤고, 우선 Create Game과 Exit에 기능을 할당하여 사용 할 예정이다.

ui에 mouse hover 이벤트가 일어나면 좌우를 감싸는 대괄호가 나타나는 애니메이션을 입혔다.

좀 구리긴 하지만 일단 다음 프로그래밍을 위해 빨리 넘어가기로 했다.

 

참고한 유튜브는 아래와 같다.

https://www.youtube.com/watch?v=07H6INJ_3hI

 

https://www.youtube.com/watch?v=pTTHen7vhJ8

 

https://www.youtube.com/watch?v=3YnzCbrvfPI

 

'개발 일지' 카테고리의 다른 글

4. 서버 구축을 위한 삽질  (0) 2024.09.02
3. 플레이어 랜덤 스폰 구현  (0) 2024.08.31
2. 움직이는 플레이어 캐릭터 만들기  (0) 2024.08.26
시작  (0) 2024.08.21

댓글()

시작

개발 일지|2024. 8. 21. 16:29

1인칭 FPS 마피아 게임을 개발하는 과정을 기록하는 첫 페이지.

 

Unreal5 C++ 이론 공부를 하다가 이러다 어느세월에 게임 만들어 보겠나 싶어서 머리 박아보려 만든다.

 

Deceit에서 대부분의 영감을 받았고, 기타 FPS게임들의 방식을 채용한 마피아 게임이 재밌지 않을까? 생각했다.

 

개발하면서 구현하는 주요 목표는 아래와 같다.

 

1. 개발환경

Unreal5 C++을 사용해 주요 기능들을 개발하고, Unreal5의 UMG를 사용하여 UI를 디자인 한다.

 

2. 멀티플레이어 환경

P2P 네트워크를 사용한다. 게임 호스트가 서버 역할을 맡고 다른 플레이어들이 참여하는 방식.

위와 같은 방식으로 서버 유지 부담을 줄일 수 있을것으로 예상.

 

3. 랜덤 역할군 배정, 랜덤 루팅 시스템

게임 시작시 직업군을 랜덤으로 배정한다. 마피아 역할군과 시민 역할군 모두 기본 권총을 지급하고 총알은 게임 레벨에서 랜덤하게 생성되는 박스를 루팅하여 사용. 투표 시스템 대신 HP를 모두 줄이면 아웃되는 시스템.

마피아의 승리 조건은 기존 마피아류 게임과 동일, 시민의 승리 조건은 마피아를 직접 총으로 쏴 죽이면 승리.

역할군에 따라 특수 총기와 총알을 파밍하고 사용하는 구조. 역할군간 밸런스 조절을 위한 시스템은 추후 추가

(시민이 어떻게 마피아를 조사하여 죽일지, 마피아 장르의 전통적인 낮과밤 시스템을 어떻게 적용할지 등)

 

4. UI

UI 클릭시 동작할 함수를 C++로 작성하고, 블루프린트에 매핑해 화면에 출력되는 UI를 구성할 예정. 직접 해봐야 이대로 작성하는게 맞는지 알 수 있을것.

 

5. 그래픽

1차로 언리얼 마켓 플레이스 등에서 적절한 무료 라이센스 에셋을 채택해 사용할 예정. 필요시 3D Blender를 사용할지 고려 예정

 

큰 틀은 위와 같으며, 세부과정은 아래와 같다.

 

1. 게임 시작 화면에서 게임 세션 생성

2. 세션에 진입하여 플레이어의 캐릭터가 움직이는것 구현

3. 세션에 다른 유저들이 접속하여 유저간 인게임 보이스 및 상호작용 구현

4. 유저들의 준비 투표 및 게임시작 후 기본 맵으로 레벨 이동 구현

5. 기본 레벨에서 권총 지급 및 사격 구현

6. 유저간 사격 기능 및 HP 시스템, 랜덤 루팅 시스템 구현

7. 죽은 유저의 관전 및 채팅 기능 구현

8. 맵과 캐릭터, 총기류 등에 적절한 에셋 적용

9. 기타 세부사항 구현

'개발 일지' 카테고리의 다른 글

4. 서버 구축을 위한 삽질  (0) 2024.09.02
3. 플레이어 랜덤 스폰 구현  (0) 2024.08.31
2. 움직이는 플레이어 캐릭터 만들기  (0) 2024.08.26
1. 메인메뉴 구성  (0) 2024.08.26

댓글()