![[백준 C++] 1253 : 좋다](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmijQd%2FbtsFoDD2kmB%2FTXPKOQDOklKn76YHn08zXk%2Fimg.png)
https://www.acmicpc.net/problem/1253 간단하게 생각하면 모든 수를 하나씩 더해봐서 할 수 있는 간단한 문제이다. 다만, N의 최대값은 2,000인데 시간복잡도에 따라 N^2 or N^3 등등 커질수록 많은 시간이 걸릴 것이다. 그렇게 되면 시간초과에 걸리게 된다. 즉, 이 문제를 풀기 위해서는 그 이하의 시간복잡도를 가지는 알고리즘을 사용하여 문제를 풀어야 한다. 두 개의 합으로 나타낼 수 있는 수를 찾는 문제이므로, 투 포인터 알고리즘을 사용한다. 시작 인덱스 0과, 끝 인덱스 N - 1에서 차례차례 더해서 확인해가며 값을 찾으면 시간복잡도 O(N)으로 값을 찾을 수 있다. 그 작업을 수행하기 위해서는 정렬을 먼저 수행하여 두 수를 더해 그 값을 비교하여 합이 작으면 시작 ..
프로젝트에서 플레이어 캐릭터의 스킬 중 하나를 파이어볼로 만들어 볼 것이다. 파이어볼은 캐릭터가 스킬 버튼을 클릭했을 시, 캐릭터의 앞에 생성된다. 이 후 앞으로 일정한 속도로 날라간 뒤 특정 액터들에 맞게 된다면 데미지를 주고 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; }..
Shift키를 눌러서 Dash를 실행할 때, Niagara VFX를 이용하여 이펙트를 구현하였다.이 기능의 문제점은 SpawnSystemAtLocation을 이용해 일정한 크기 값으로 스폰하기 때문에 막상 어떤 물체에 막혀 이동한 거리가 짧아도 이펙트는 정해진 길이만큼 출력되는 문제가 존재하였다.이를 LineTrace기능을 이용하여 앞에 액터가 있는지 확인 후 있으면 그 액터와의 거리를 크기로 변환하여 이펙트의 크기를 줄이고, 없으면 정해진 길이만큼 스폰되도록 변경하였다.// TOCharacter.cppvoid ATOCharacter::Dash(){ if (!GetCharacterMovement()->IsFalling()) { if (!IsDashCoolDown) { // Line Trace를 위..
![[Unreal Engine C++] Dash 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLdBAl%2FbtsFinhG67b%2FOy9bdvHvukZuQWTJjA7PPK%2Fimg.png)
캐릭터의 Dash를 구현할 때, Launch Character를 사용하여 구현하면 간단하지만 공중으로 Dash할 때와 지면에서 Dash할 때의 이동 거리가 다르다는 문제점이 발생하였다. 이는 지면에 있을 때엔 지면 마찰(CharacterMovement에 Ground Scale)의 영향을 받기 때문에 지면에서는 적게 가지만, 공중에서는 지면 마찰을 받지 않기 때문에 일어나는 현상이다. 이를 Timeline을 사용한 방법으로 수정하여 보자. 먼저, 언리얼 에디터에서 기타 → 커브로 해서 커브를 제작한다. CurveFloat을 사용해 (0, 0), (0.25, 1)의 값을 가지는 커브를 구현하였다. //Character.h public: //타임라인에 사용할 Curve UPROPERTY(EditAnywhe..
![[백준 C++] 14501 : 퇴사](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYtKB%2FbtsEyPdsLBB%2FZ6ohmmkMH4cy7Z00WVWhZK%2Fimg.png)
https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 다이나믹 프로그래밍 (DP)와 브루트포스 알고리즘을 활용한 문제이다. 주어진 기간 안에 최대한의 이득을 확인하는 문제이기 때문에 점화식으로 계산하여, DP리스트에 그 날에 할 수 있는 최댓값을 넣어주면서 진행하면 된다. N날이 되었을 때 DP[N]에 있는 값이 그 기간 안에 할 수 있는 최대의 가치를 가진 일이 될 것이다. #include using namespace std; int N; int list[15][2]; int dp[15]; int main() { ios::sync_with_stdio(0); cin.tie(0); cou..