![[Unreal Engine C++] Online Subsystem을 활용한 멀티플레이 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoU16v%2FbtsGMVDW6Xf%2Fyk4bIWGt98Ka2gekRwRtn0%2Fimg.png)
언리얼에는 온라인 서브시스템 Steam API를 통해 만든 게임을 밸브의 스팀 플랫폼에 출시하는 것이 가능하다. 그 기능을 이용해서 멀티 기능을 만들어보자 시작하기 전 준비 Online Subsystem을 사용하기 전, 프로젝트를 하나 생성해준다. 필자는 3인칭 게임에 적용하고자 했기 때문에 3인칭 게임으로 생성해주었다. 편집 - 플러그인에서 "OnlineSubsystem Steam"을 추가해준다. 그 뒤, 만들어진 (ProjectName).Build.cs에 "OnlineSubsystem" , "OnlineSubsystemSteam"을 추가해준다. PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "In..
![[Unreal Engine C++] 청크 개념을 이용한 랜덤 맵 생성 알고리즘](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHFgS%2FbtsGez8A0l5%2Fpw9DAZyUaKzIqvk2cpO7g0%2Fimg.png)
이전 포스팅에서 말했듯이 BSP, MST를 이용한 랜덤생성 등등의 알고리즘을 사용하지 못하고 새롭게 생각한 아이디어인 청크 개념을 활용하여 랜덤 맵을 생성해보기로 하였다.C++로 구현해 보았던 과정 및 결과를 글에 적어본다.시작하기 전 - 설명청크란? 영어에서 사용하는 뜻은 '서로 밀접하게 연결된 단어들의 집합 ' 이다.코딩에 있어서는 하나의 큰 정보라고 생각해보자.필자가 만든 이 랜덤 맵에서 하나의 청크인 이 큰 정보는 작은 정보를 포함하고 있다.작은 정보는 위치가 어디인지와 이 곳에 무엇이 생성될 것인지, 어디로 이어지는지 등인 것이다.앞으로 작은 정보들이 더 추가될 수 있지만, 이 세개면 일단 기본적인 구성은 준비된 것이라고 생각하였다.만들기전에 준비하자 - 랜덤맵에 사용할 액터 생성먼저 맵 생성을..
![[Unreal Engine C++] 랜덤 맵 생성에 관한 아이디어들](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpOaii%2FbtsGeM7mJ1Q%2FgrPSa4cEZLgQvGrgkAoUT0%2Fimg.png)
이번 졸업 작품 프로젝트에서 개인적으로 꼭 구현해보고 싶었던 알고리즘 중 하나가 랜덤 맵 생성 알고리즘 이였다.이를 생각하고, 구현해내기 전 아이디어와 과정들을 적어보고자 한다.구현을 시작하기 전..네이버 및 구글에서 언리얼 관련 내용을 검색해보았을 때, 툴 설명 및 기능들을 설명해주는 글을 어느정도 존재하지만 알고리즘을 설명하는 내용은 거의 없었다.또한 그 것을 한국어로 검색하였을 때 나오는 건 극히 일부분이였다..Procedural Map Generation라던가 절차적 맵 생성.. 랜덤 맵 생성... 등등을 검색하였지만 나오는 내용은 많이 없었지만 그 조금의 내용이라도 최대한 활용해서 구현해보고자 했다.생각의 시작 - BSP 알고리즘검색해보았을 때, 그 중에 가장 많이 나오는 것이 바로 BSP 알고..
![[Unreal Engine C++] Timeline을 사용하여 암전 효과 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq0l4C%2FbtsFmg4dKF2%2FWoUU3WJjOepI5HXtL15Cd1%2Fimg.png)
게임 프로젝트를 진행하면서 암전 효과가 필요했다. 특정한 버튼을 누르면 화면이 어두워졌다가 다시 밝아지면서 맵 또는 캐릭터가 변화하는 느낌을 주고 싶었다. 이를 언리얼에는 간단하게 시간 기반 애니메이션을 재생할 수 있도록 도와주는 타임라인이라는 시스템을 활용하여 암전 효과를 구현해보자. 에디터에서의 준비 일단 암전효과를 구현하기 위해 PostProcessVolume을 사용할 것이므로 레벨에 하나 놓아두고, 원하는 범위를 설정한다. PostProcessVolume의 Exposure의 노출 보정(Auto Exposure Bias)를 활성화시켜준다. 값은 숫자가 커질수록 화면이 밝아지고, 작아지면 어두워지기 때문에 타임라인을 사용해 값을 낮췄다가 다시 복구시킬 것이다. 또한 코드상에서 이 볼륨을 찾기 위해 M..
프로젝트에서 플레이어 캐릭터의 스킬 중 하나를 파이어볼로 만들어 볼 것이다. 파이어볼은 캐릭터가 스킬 버튼을 클릭했을 시, 캐릭터의 앞에 생성된다. 이 후 앞으로 일정한 속도로 날라간 뒤 특정 액터들에 맞게 된다면 데미지를 주고 Destroy()된다. 만약 정해둔 거리 이상으로 날라가면 사라지게 만들 것이다. 파이어볼을 담당할 액터를 상속받는 TOFireball 클래스 파일을 생성한다. //TOFireball.c #pragma once #include "Tellours.h" #include "GameFramework/Actor.h" #include "TOFireball.generated.h" UCLASS() class TELLOURS_API ATOFireball : public AActor { GENER..
![[Unreal Engine C++] 진행도에 따른 텔레포트 설정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhJiea%2FbtsFh5BANRu%2FvHm4VcDOkVja2ItCLh0Rw1%2Fimg.png)
이 프로젝트의 진행은 첫 맵에서 Level 1로 이동해서 깬 뒤, 다음 Level 2로 가는 식으로 구현되어 있다. 하지만 Level 1을 깬 뒤 Level 2 텔레포트를 생성하게 하는 것이 아닌, 실제로는 맵에 구현이 되어 있지만 레벨을 불러올 때마다 진행도(Progress)를 확인하고 이보다 낮으면 Destroy()를 하도록 해서 진행도와 맞지 않는 레벨로 이동하는 것을 막아보고자 한다. 이를 구현해보자. //TOSaveGame.h #pragma once #include "Tellours.h" #include "GameFramework/SaveGame.h" #include "TOSaveGame.generated.h" /** * */ UCLASS() class TELLOURS_API UTOSaveGam..
이전에 Save기능을 구현했었다. 여기서 더 나아가 SaveGame을 할 때 자신이 현재 있는 레벨을 저장해서 이후 다시 게임을 시작할 때 불러와야 한다. 이를 구현해보자. //TOSaveGame.h #pragma once #include "Tellours.h" #include "GameFramework/SaveGame.h" #include "TOSaveGame.generated.h" /** * */ UCLASS() class TELLOURS_API UTOSaveGame : public USaveGame { GENERATED_BODY() public: UTOSaveGame(); UPROPERTY() FName MapName; ... }; //TOSaveGame.cpp #include "TOSaveGame..
![[Unreal Engine C++] 특정 위치로의 레벨 텔레포트의 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcffA2f%2FbtsFjH760Xt%2FdWpWnkJcMQaNE53wicAT21%2Fimg.png)
한 개의 레벨에 사용할 모든 에셋들을 넣게 된다면 퍼포먼스에 문제가 생길 것이다.이를 여러 개의 레벨로 나누어 사용할 때마다 불러와서 사용하면 문제를 해결할 수 있을 것이다.이를 언리얼에서는 레벨 스트리밍 기능을 제공한다.간단하게 말해서 레벨 스트리밍은 내가 원할 때마다 레벨들을 로드 / 언로드 할 수 있는 기능이다.이를 이용해 맵 텔레포트를 구현해보자.먼저 ‘StartMap’이라는 이름으로 기본 라이트만 들어가 있는 맵을 생성하였다.왼쪽 위 툴바 > 창 > 레벨을 눌러서 레벨 창을 띄운다.레벨에다가 기본 Floor만 있는 Level1 ~ Level3, 그리고 우리가 시작하게 될 맵 Room을 추가해주고, 겹치지 않게 배치하여 준다. 결과는 다음과 같다. StartMap에 자손 맵들이 Level1 ~ L..
![[Unreal Engine C++] 연속 공격의 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXedO%2FbtsFiogEO3q%2FfzBU8VUsg3lVfQbHinrAtK%2Fimg.png)
이득우 언리얼 C++을 공부하면서 배운 연속 공격은 왼쪽 마우스 버튼을 연속적으로 입력해야지만 구현이 가능했다. 이를 버튼을 꾹 눌러도 구현되게 수정해보자. 캐릭터의 몽타주는 다음과 같이 구현되어 있다. Attack1 ~ Attack3까지 연속적으로 애니메이션이 재생되게 하고, 각 섹션이 시작하기 전에 NextAttackCheck를 하도록 했다. //TOAnimInstance.cpp ... void UTOAnimInstance::PlayAttackMontage() { Montage_Play(AttackMontage, 1.0); } void UTOAnimInstance::StopAttackMontage() { Montage_Stop(0.1f, AttackMontage); } void UTOAnimInsta..
게임에 내용을 저장해서 나중에 불러오는 기능을 추가해야 한다. 이전 프로젝트에서 구현되어 있는 기능 중에 HP, Level 그리고 Player Location을 저장해보자. //TOSaveGame.h #include "Tellours.h" #include "GameFramework/SaveGame.h" #include "TOSaveGame.generated.h" /** * */ UCLASS() class TELLOURS_API UTOSaveGame : public USaveGame { GENERATED_BODY() public: UTOSaveGame(); UPROPERTY() FVector PlayerLocation; UPROPERTY() int32 HP; UPROPERTY() int32 Level; }..