MegaMan

Chaco22·2024년 9월 6일

UE5

목록 보기
7/8
post-thumbnail

MegaMan은 Blueprint를 기반으로 만드는 2D 슈팅액션 게임이다.
2D 게임은 처음으로 제작을 시도해 보는 것이라 세세한 설정의 내용도 설명한 부분이 있다.
2D 게임 제작과 Blueprint에 대한 부분을 배우고 복습하면서 매끄러운 게임 제작 로직을 경험한다.

Assets

텍스쳐 파일의 필터를 Nearest로 변경
텍스쳐 파일만 있다면 규격에 맞게 캐릭터 자르고 플립북 작성, 초당 프레임 조절
JSON파일이 있다면 플립북 작성, 초당 프레임 조절만 하면되고 파일을 자동 정리해준다.

Character

우선 플레이어와 적의 공통적인 기능을 관리할 BP_ActionChar_BASE를 만들고 캡슐 설정과 그림자 설정, 그림자를 받을 수 있는 머터리얼(MaskedLitSpriteMaterial)을 설정 해주었다.

Player Camera


BP_ActionChar_BASE를 상속받아 BP_Player를 만들고 스프링암과 카메라를 부착해주었다.

Input (BP_Player)


언리얼 5.3부터는 새로운 Input설정 방식을 제공한다. 키의 역할에 따라 입력 액션(IA_Jump, IA_Move)을 만들어 작동 방식을 설정하고 입력 매핑(IMC_Action)을 만들어 어떤 외부입력으로 작동될지 설정한다.

이후 BP_Player 블루프린트의 BeginPlay에서 컨트롤러와 IMC_Action을 가져와 연결해 주고 입력 액션도 작동하도록 설정하였다. IA_Move는 좌우에 따라 캐릭터가 해당 방향을 바라보도록(뒤집어지록) 설정하였다.
캐릭터가 뒤집어질 때 카메라도 같이 뒤집어지므로 뷰포트에서 카메라의 회전을 월드 기준으로 바꿔주었다.

발사 키를 누를 경우 샷에너지를 확인하고 IsShooting으로 공격 상태임을 명시, 액터를 소환, Retriggerable Delay를 사용하여 발사 간격을 조정

Animation

Animation Source


AS_Player를 생성하여 플립북들을 시퀀스로 추가해준다.
추가된 항목들은 파일화되어 같은 장소의 새로운 폴더에 저장된다.

Animation Blueprint


ABP_Player를 만들고 State Machine(Locomotion)을 만들어 간단한 움직임 그래프와 조건을 만들고 조건에 따라 AS_Player에서 만든 시퀀스들을 재생하여 애니메이션을 구현하였다.

BP_Player에서 IsShooting 함수를 가져와 공격중이면 공격 애니메이션을 재생하도록 작성

Settings

아래의 설정들은 모든 캐릭터의 설정을 바꾸기 위해 BP_ActionChar_BASE에서 진행하였다.

Planar Movement


캐릭터들의 이동을 평면에 제한하여 원하지 않는 축으로 이동을 방지하기 위해 Z축에 1의 값을 넣어 제한하였다.

Use Flat Base for Floor Checks


캐릭터가 바닥의 가장자리에 갔을때 캡슐콜리전의 둥근 부분에 의해 조금씩 내려가다가 떨어지는 상태를 확인할 수 있었다. Use Flat Base for Floor Checks를 활성화하여 콜리전이 캡슐이 아닌 사각형으로 바꿔 내려가지 않고 임계값에 도달했을때 바로 떨어지게 만들었다.

Use Flat Base for Floor Checks를 활성화했을때 계단이나 경사에서는 어색한 움직임을 보일 수도 있다.

Gravity Scale and Jump Velosity

점프가 가벼운 느낌이 있어 중력 스케일과 점프 속도를 높여 주었다.

Air Control

대기 제어를 높여 점프 중 공중에서의 방향키의 영향을 더 받도록 설정하였다.

Jump Control

플레이어의 점프의 높이 조절 시스템을 구현
BP_Player에서 위의 중력, 속도, 대기 제어를 적절히 조절해가며 만들었다.

Jump Max Hoid Time


Jump Max Hoid Time에 수치를 부여하고 점프의 높이 조절이 가능하도록 키가 취소된 경우와 더불어 점프를 완료한 경우에도 점프가 끝나도록 만들었다.

Falling Lateral Friction


공중에서 좀 더 자유로운 방향 전환이 가능하도록 추락 측면 마찰을 50으로 올려주었다.

Camera

Setting

Projection Mode (투영 모드) -> Orthographic 카메라를 원근에서 정사로 변경
Ortho Width를 넓혀 카메라에 보이는 범위를 넓힌다.

Auto Calculate Ortho Planes (직교 평면 자동 계산)을 해제하여 카메라의 고정을 푼다.

역동적인 카메라 움직임과 경우에 따라 카메라의 위치를 바꿔주기 위해 플레이어 스프링암의 위치를 월드로 변경

카메라의 위치를 월드로 변경하고 게임을 시작할 경우 카메라가 좌표 (0, 0, 0)에서 플레이어로 이동한다.


BP_Player의 BeginPlay에서 카메라의 위치를 플레이어 위치로 지정

BP_CameraRestrictor


특정 영역에 들어갈 경우 카메라 영역을 비추도록 만드는 BP_CameraRestrictor를 생성하고 박스 콜리전 Trigger에 들어갈 경우 BP_Player에 생성해놓은 BP_CameraRestrictor 타입의 OverlappingRestrictor 변수에 본인을 저장

Update Camera Pos (BP_Player)


플레이어가 생존중이고 변수 OverlappingRestrictor가 유효할 경우 카메라의 위치를 해당 위치로 변경 VInterp로 매끄러운 위치 변경
OverlappingRestrictor가 유효하지 않으면 플레이어의 위치에 카메라를 고정한다.

Player Invincibility & Stun

Invincibility (BP_Player)



함수 TriggerInvincibility를 제작하여 캐릭터가 대미지를 입을 경우 캐릭터 캡슐의 충돌을 Ignore로 바꿔 잠깐의 무적시간을 가질 수 있도록 만든다.
이벤트 타이머를 사용하여 ToggleSpriteFlicker함수를 루핑을 이용해 반복함으로써 캐릭터의 무적시간동안 캐릭터가 깜빡이는 효과를 넣어준다.

함수 ToggleSpriteFlicker

Stun (BP_Player)



캐릭터가 대미지를 입을 경우 Find Look at Rotation을 이용하여 대미지를 어느 방향에서 입었는지 추적하고 Launch Character를 사용해 캐릭터가 뒤로 밀리는듯한 효과를 준다.

애니메이션에서 JumpStun 노드에 Stun 스테이트를 만들어 캐릭터가 밀릴때 bool함수 IsStunned를 true로 설정하고 Hurt 애니메이션으로 전환, 시퀀스를 이용하여 스턴시간이 끝나면 Idle 스테이트로 이동하도록 설정한다.

Sliding

Wall Slide & Wall Slide Shot

라인트레이스를 이용하여 벽을 감지하고 벽과 충분히 가깝고 벽으로 이동하는 키를 누르고 있는 경우 벽 슬라이드를 실행한다.

Wall Slide


플레이어가 떨어지고 있으며 바라보는 방향과 같은 곳으로 이동하는 키를 누르고 있을 경우 플레이어의 앞방향으로 WorldStatic을 감지한다.
bool함수 IsWallSliding을 만들어 슬라이딩 상태를 관리한다.

해당 방향에 라인 트레이스가 유효한 경우 캐릭터의 Velocity에 슬라이드의 속도를 덮어씌워준다.

Wall Slide Shot


애니메이션에 WallSlide를 추가하여 IsWallSliding과 IsShooting에 따라 애니메이션이 재생되도록 설정

벽 슬라이딩 중 총알이 바라보는 반대 방향으로 나갈 수 있도록 두번째 슛포지션을 추가해준다.

함수 SpawnProjectil에서 Select를 사용하여 벽 슬라이딩 여부에 따라 슛 포지션을 선택해준다.

Wall Jump


점프 도중에는 점프가 불가능하기 때문에 벽 슬라이딩 중에 점프가 가능하게 하기 위해 바라보는 반대 방향으로 Launch Character가 발동되도록 설정

Launch Character는 Lateral Friction에 영향을 받기 때문에 사용 전 Lateral Friction을 0으로 바꿔준 뒤 일정 시간 뒤에 다시 정상화되도록 설정

Ground Slide

지면 슬라이딩의 경우 Launch Character를 사용하면 중력의 영향을 받아 의도하지 않은 물리력이 행사될 가능성이 많다.
그 가능성들을 배제하기 위해 Plugins RootMotion을 추가해준 뒤 사용한다.

플레이어가 땅에서 활동중이고 S키를 누르고 있지 않다면 점프를 실행한 뒤 이벤트 CancelSlide를 실행한다.
-> 슬라이드 중 점프를 하면 슬라이드를 캔슬하기 위함이다.
S키를 누르고 있고 슬라이딩하고 있지 않다면 지면 슬라이딩 상태를 확인하는 bool함수 IsGroundSliding을 true로 바꿔주고 슬라이딩을 실행하는 ApplyRootMotionConstantForcewithCallbacks를 실행한다.

슬라이딩이 성공하거나 실패하면 슬라이딩 상태를 false로 바꿔주고 AsyncAction을 받아 이벤트 CancelSlide를 생성한다.
앞에서 이벤트 CancelSlide가 슬라이딩하고 있지 않은 도중에 슬라이드를 취소하는 일이 생기지 않도록 이벤트 CancelSlide에서 유효성 검사를 진행한다.

Ground Slide Animation


Idle이나 Run 상태에서 bool함수 IsGroundSliding의 상태에 따라 슬라이드 애니메이션이 재생되도록 만든다.

Ground Slide Exception Handling


슬라이딩 도중에 공격이 불가능하도록 설정

키보드의 W 나 S를 누를 경우 플레이어가 오른쪽 방향을 바라보게 되는 현상을 없애기 위해 좌우 입력이 있고 지면 슬라이딩 도중이 아닌 경우에 방향이 변경되도록 설정한다.

슬라이딩 도중에 반대 방향키를 누르면 슬라이딩이 중지되도록 설정

Respawn Player

Respawn Player (GM_Action)


플레이어를 다시 리스폰 시에 같은 위치에서 부활할 수 있도록 PlayerStart 클래스를 가져와 저장

게임 모드에서 함수 RespawnPlayer를 생성 에서 가져온 플레이어의 위치로 스폰 되도록 설정
리스폰 된 액터에 플레이어가 빙의할 수 있도록 플레이어 컨트롤러를 가져와 설정

Defeated (BP_ActionChar_BASE)


플레이어가 체력이 0이 된 경우 다시 리스폰을 진행하고 적의 체력이 0이 된 경우에는 액터 파괴를 진행하기 위해 BP_ActionChar_BASE에서 캐릭터가 피가 0이 된 경우 이벤트 디스패처 Defeated를 Destroy Actor 대신 실행

Bind Event to Defeated (BP_Enemy_BASE)


Bind Event를 사용하여 적들은 액터 파괴를 진행

Bind Event to Defeated (BP_Player)


플레이어의 경우 캡슐을 노 콜리전으로 설정 카메라를 플레이어에게서 떼 월드에 부착한다.

이 후 카메라 페이드와 플레이어가 죽은 이후 계산 처리를 위해 딜레이 이후 리스폰과 페이드 액터 파괴를 진행

Defeated Knockback


플레이어의 체력이 0이 된 경우 무적을 뛰어넘고 넉백으로 진행

Checkpoint

BP_Checkpoint


BP_Checkpoint를 만들고 큐브와 박스 콜리전, 씬에 빌보드를 추가한다.


BeginPlay에서 BP_GMAction을 캐스트해 준다.
박스 콜리전에 충돌이 일어날 경우 BP_GMAction에서 만들어 둔 ActiveCheckpoint에 본인을 전달한다.
Do Once를 사용해 한 번만 실행되도록 만들고 활성화된 경우 Set Material을 사용해 큐브의 색깔을 바꿔준다.

Checkpoint Respawn (BP_GMAction)


BP_GMAction의 함수 RespawnPlayer에서 ActiveCheckpoint가 유효한 경우 ActiveCheckpoint의 Scene에서 플레이어가 리스폰될 수 있도록 만든다.

Fall Detector

언리얼 엔진에는 캐릭터가 맵 밖으로 일정 범위만큼 떨어졌을 때 플레이어를 죽이는 기능이 있지만 설정한 리스폰이 이뤄지지 않는다.
이런 경우와 용암이나 구멍 등 함정에서 재사용하기 위해 플레이어를 죽이는 액터를 만든다.

BP_FallDetector를 만들고 박스 콜리전 하나를 추가해준다.
박스에 닿을 경우 높은 대미지를 주어 리스폰하도록 만든다.

Win Detector


플레이어가 특정 영역에 도달해 스테이지를 클리어 한 경우 위젯 WBP_Clear를 실행하고 Open Level을 사용하여 다음 레벨에서 스폰 되도록 만든다.

Ladder Volume

캐릭터는 실제로 사다리를 타고 이동하는 것이 아니라 특정 영역에 들어가면 Walking 모드에서 Flying 모드로 전환이 이뤄지고 중력을 거스른 상태로 움직인다.


사다리를 구현하기 위해 BP_LadderVolume을 생성하고 박스 콜리전 Trigger를 추가한다.
BP_Player에서 함수 OverlappingLadder를 생성하고 BP_LadderVolume과 오버랩된 경우 OverlappingLadder에 저장

IA_Move


이동 키 입력에서 Y축 입력을 가져와 함수 OverlappingLadder이 유효한 경우 Y축 이동을 진행하고 쿨다운을 발동, Do Once로 플라잉 모드 전환이 한번만 일어나도록 만들고 노드 ClimbStart로 넘어간다.
사다리 등반이 끝나면서 이벤트 ResetClimbStart가 실행되면 Do Once를 리셋한다.

Node ClimbStart


노드 ClimbStart에서는 애니메이션을 전환하고 현재 현재 속도를 0으로 만들어 가속을 차단한다.
Movement Mode를 Flying으로 전환하고 X축을 사다리와 같은 위치에 부착한다.

Climb Animation


BP_Player에서 함수 GetClimbInput를 만들어 ABP_Player로 가져와 IA_Move의 Y축 입력을 가져오고 값을 애니메이션 PlayRate에 이동 입력이 있을 경우 애니메이션을 재생한다.

Cooldown & Jump


이벤트 SetClimbCooldown을 만들어 다시 사다리를 등반할 수 있는 시간을 조정
전의 WallJump를 이벤트 PrederminedJump로 만들어 사다리를 타는 도중에 점프를 할 경우에도 사용할 수 있게 방향을 입력받는다.


벽 점프가 아닌 경우 IsClimbing이 true면 함수 CancelClimb를 실행하고 진행 방향으로 점프한다.

Cancel Climbing


함수 CancelClimb는 IsClimbing이 true일 경우 false로 바꿔주고 Movement Mode를 Walking으로 전환, 이벤트 ResetClimbStart와 SetClimbCooldown을 실행한다.

Enemy & AI

Turn Character (BP_Enemy_BASE)


적의 진행 방향을 돌려주기 위해서 함수 TurnCharacter를 생성

BP_Enemy_Crab


벽을 감지하는 WalkDetector와 낭떠러지를 감지하는 LedgeDetector 두 개의 Box Collision을 캡슐 컴포넌트에 추가한다.
콜리전 설정에서 WalkDetector는 벽인 WorldStatic과 다른 적의 WalkDetector를 감지하기 위한 WorldDynamic을 오버랩 나머지는 무시로 설정하고 LedgeDetector는 바닥을 감지하기 위해 WorldStatic만을 오버랩 해준다.


함수 UpdateAnim을 만들어 Crab이 걸을 때 Walk 애니메이션을 재생해 주기 위해 VectorLength가 0보다 클 경우 Walk를 아닌 경우 Idle을 재생한다.


Tick에 UpdateAnim을 연결하여 애니메이션이 변경될 수 있도록 만들어주고 Crab이 걷기 위한 이벤트 WalkForward를 제작한다.


각각 벽이나 같은 적을 감지하거나 낭떠러지를 감지하지 못하면 함수 TurnCharacter를 실행해 준다.

AIC_Crab


이벤트 On Possess를 사용하여 빙의해줄 Crab을 캐스트한다.
Tick에는 함수 WalckForward를 연결하여 계속 앞을 향해 걷도록 만들어준다.

BP_Enemy_Lizard


BP_Enemy_BASE를 부모로 발사체를 발사하는 Lizard를 생성한다.
Lizard는 CapsuleCompoent에 추가해준 Scene에서 발사 포인트를 지정한다.

AIController에서 발사 타이밍을 지정하고 도달하면 애니메이션을 재생하는 함수 ShootFireball을 실행한다.
AS_Enemy_Lizard의 Shoot 애니메이션이 재생되고 Shoot에서 설정한 노티파이에 도달하면 함수 SpawnProjectile을 실행해 발사체를 발사한다.

Spawn Projectile (BP_Enemy_Lizard)


Fireball을 소환하는 함수 SpawnProjectile을 제작

AS_Enemy_Lizard


Lizard의 애니메이션 블루프린트를 만들어주고 발사 타이밍을 지정하기 위해 AS_Enemy_Lizard를 제작하고 Shoot 애니메이션의 적절한 프레임에 Spit 노티파이를 생성

ABP_Enemy_Lizard


이벤트 On Init에서 Owning Actor를 불러와 캐스트 해준다.


AS_Enemy_Lizard의 Shoot에서 생성했던 노티파이 Spit에 도달하면 함수 SpawnProjectile을 실행


AnimGraph에서 스테이트 머신 로코모션을 생성하여 스테이트 Idle을 만들어 애니메이션을 재생하고 OverrideSlot을 생성해 애님을 오버라이드 할 수 있도록 제작한다.

Shoot Fireball (BP_Enemy_Lizard)


Lizard의 Fireball을 발사하는 애니메이션을 재생해 주기 위해 함수 ShootFireball을 제작하고 Play Animation Override를 사용하여 평소 Idle 상태에서 Shoot 애님을 오버라이드 하도록 만들어준다.

AIC_Lizard


이벤트 ShootProjectile을 생성하여 OwningLizard의 ShootFireball을 연결
On Possess에서 타이머를 설정해 변수 ShootInterval을 만들어 일정 시간마다 Fireball을 발사하도록 설정한다.

BP_Enemy_Bat


정해진 두 구간을 날아서 왕복하는 적을 만들기 위해 먼저 캡슐에 Scene인 TopPos와 BottomPos 두 개를 추가해준다.


구간을 정해준 Scene의 월드 로케이션을 가져와 저장하고 타임라인 MoveAnim의 속도를 조절한 뒤 함수 MoveForward를 실행한다.


타임라인 MoveAnim을 생성해 이벤트 MoveForward를 생성해 Play from Start에 연결하고 MoveBackward가 시작될 경우 반대로 이동하게 하기 위해 Reverse from End에 연결한다. Flip Flop을 사용해 번갈아가며 실행되도록 만든다.
타임라인 MoveAnim은 Top Pos와 Bottom Pos 번갈아가며 매끄럽게 이동하도록 Set Actor Location에 Lerp를 통해 Alpha를 넘겨준다.

BP_Enemy_Eye


플레이어를 감지하면 쫓는 적을 만들기 위해 스피어 콜리전 AggroRange를 추가


플레이어를 바로보고 쫓는 함수 MoveToward를 생성
AggroRange에 플레이어가 감지되면 AIC_Eye에 플레이어를 전달 Do Once로 한번 실행 이후 이벤트를 다시 실행하지 않도록 설정

AIC_Eye


틱에서 적과 타깃이 유효한 경우 적이 플레이어를 추적하도록 만든다.

BP_Enemy_Eye가 플레이어를 추적하다 플레이어가 죽을 경우 타겟을 잃어 방황한다.
BP_Enemy_Eye의 초기 트랜스폼을 저장하여 추적 중 타겟이 죽을 경우 초기 위치에 스폰한다.

Projectile


Projectile_BASE를 생성하고 콜리전을 위한 Sphere 캡슐을 Root로 설정, 자손으로 PaperFlipbook을 추가하고 발사체의 움직임을 위한 ProjectileMovement를 추가해주었다.

Projectile_BASE


충돌이 일어났을 때 발사체 파괴 액터가 재생된 뒤 발사체가 파괴되도록 작성


ENUM Faction을 만들어 Player와 Enemy를 나누고 발사체와 발사를 한 액터가 같은 팩션이 아닌 경우 대미지를 입힌다.

PlayerProjectile_BASE


발사체가 뷰포트 밖으로 사라지면 파괴되도록 작성
사용할 수 있는 에너지를 제한하여 발사를 제한한다.

Charge Shot

IA_Shoot (BP_Player)


차지샷을 구현하기 위해 IMC_Action에서 IA_Shoot에 Released Trigger를 추가한다.
차지 중에 타격을 받을 경우 차지를 끊어주기 위해 bool함수 WasHitDuringCharge를 추가하여 발사 시점에서 flase로 설정
Elapsed Seconds가 일정 시간이 넘을 경우 차지샷을 발사하기 위해 변수를 전달하는 함수 TryChargeShot를 호출

SpawnProjectile


샷에너지에 의해 한번에 쏠 수 있는 발사체를 조절하고 있기 때문에 어떤 발사체를 발사하는 지에 따라 조건을 다르게 하기 위해 BP_PlayerProjectile_BASE 타입의 맵으로 선언하고 풀차지샷의 경우에는 인티저3에 다른 발사체의 경우는 1에 할당해주어 현재 에너지를 확인하고 발사, 할당된 수만큼 현재 에너지에서 차감한다.


캐릭터의 공격 상태를 관리하는 이벤트 TriggerShootAnim를 호출한다.

TryChargeShot


차지도중 맞지 않고 발사 버튼의 지속 시간이 조건을 충족한 경우 차지샷을 발사한다.

TriggerShootAnim


발사 이후 애니메이션이 정상화하기 위해 Retriggerable Delay 이후 IsShooting을 false로 전환한다.

RestoreShotEnerge (BP_PlayerProjectile_BASE)


샷에너지 회복을 위해 발사체 본인이 파괴될 경우 본인 클래스를 BP_Player의 RestoreShotEnerge 함수에 전달한다.

RestoreShotEnerge (BP_Player)


전달된 클래스에 해당되는 인티저를 최대 크기가 넘지 않게 회복한다.

Charge Flash

샷이 차지되는 동안 플레이어에게 차지중인 것을 알려주기 위해 플래쉬 이펙트 사용

함수 HandleChargeFlash를 생성하여 IA_Shoot의 Ongoing에 연결

ChargeFlash는 플레이어가 도중에 타격을 입지 않고 차지 샷이 준비된 시간이 지난 경우 자체 타이머를 제작하여 실행한다.

ChargeFlashInterval을 설정하여 일정 간격마다 TriggerFlash가 발동되도록 설정한다.

Component

BPC_Vitality


체력 시스템을 위한 블루프린터 컴포넌트 Vitality를 제작하고 BP_ActionChar_BASE에 추가해준다.

ReceiveDamage


대미지를 입을 경우 체력을 차감하는 ReceiveDamage 함수를 작성

BP_ActionChar_BASE


캐릭터에서 AnyDamage를 사용하여 대미지를 받을 경우 BPC_Vitality의 ReceiveDamage 함수를 사용하여 피가 0이하인 경우 액터를 파괴 아닌경우 TriggerFlash 이벤트를 실행하여 피격 이펙트를 재생

Effect

VFX

VFX_BASE


Flipbook이 루핑하지 않도록 설정하고 재생이 한번 끝나면 파괴한다.
BASE를 부모로 VFX_ShotHit과 VFX_EnemyDestroyed를 생성

Flash Effect

캐릭터의 피격을 표시해주기 위해 플래시 이팩트를 작성

M_CustomLitSpriteMaterial


캐릭터 스프라이트의 머터리얼에서 타격 이펙트를 표시해주기 위해 밝기를 관리하는 Emissive color를 멀리플라이로 연결 시켜주고 머터리얼 인스턴스를 생성한다.

BP_ActionChar_BASE


BeginPlay에서 머터리얼 인스턴스를 변수에 저장해주고 TriggerFlash 이벤트를 생성
TriggerFlash 이벤트에서 타임라인 제작과 Lerp를 사용하여 피격 이펙트가 서서히 사라지도록 조정하고 SetPlayRate로 피격 이벤트의 재생 시간을 조정한다.

타임라인 안에서 선형 보정을 통해 이펙트를 매끄럽게 재생

UI

WBP_HUD


전체 화면을 덮는 HUD를 제작


GM_Action에서 WBP_HUD를 생성하고 Viewport에 추가

WBP_HealthComponent


플레이어의 체력을 알려주는 UI를 만들기 위해 Border 안에 VerticalBox와 HorizonBox를 적절히 조합하여 제작


HorizonBox를 변수화하여 HealthBox로 명명한 뒤 그래프에서 안의 자식들인 이미지들을 배열에 저장
이벤트 UpdateHealth를 만들어 체력보다 높은 인덱스의 이미지는 다른 색의 이미지로 전환

BP_Player


BP_Player에서 대미지를 받으면 이벤트 UpdateHealth를 호출하여 체력 UI를 최신화한다.

WBP_Clear


승리 조건 완료 시 클리어임을 알려주는 간단한 위젯

Sound

언리얼은 압축되지 않은 WAV, Ogg 오디오 파일을 사용한다.
다른 형식의 파일은 위의 파일 형식으로 변환을 진행해야 사용 가능하다.

Sound Que


사운드 웨이브를 모두 선택해 멀티 큐 생성

Play Sound 2D


Player의 경우에는 Play Sound 2D를 사용해 카메라의 위치에 상관없이 소리가 나도록 만든다.

Play Sound at Location & Override Attenuation


발사체나 적의 경우에는 Play Sound at Location을 사용해 해당 방향에서 소리가 재생되도록 만들고 해당 사운드 큐에서 Override Attenuation을 활성화하여 거리에 따라 불륨감을 다르게 만들어준다.

애니메이션 종속


애니메이션 재생 이후 현재 프레임에 따라 사운드를 재생한다.
프레임 단위로 재생되어 여러번 재생되는 문제를 해결하기 위해 Do Once를 사용하여 재생 이후 다음 프레임으로 넘어가면 Reset 해준다.

Charge Sound


Charge Sound를 구현하기 위해 캡슐 컴포넌트에 Audio Component를 추가하고 함수 HandleChargeFlash안에 Active로 사운드를 재생
발사체가 발사 되거나 도중에 피격되면 Deactive를 실행한다.

Level

Tile Set


맵의 구조가 될 각 텍스쳐 항목을 타일 세트로 변환


타일의 크기를 조정하고 콜리전을 설정한다.

Tile Map


타일 셋에 대한 타일 맵을 생성하고 맵을 꾸민다.


타일 맵을 만들어 잇고 맵과 몬스터를 적절하게 배치한다.

Post-processing Settings(후처리 설정)

Material

먼저 텍스쳐의 머터리얼이 빛을 받지 않는 Unlit으로 바꿔 빛을 받지 않아도 텍스쳐가 보이도록 만든다.

Project Setting

Anti-Aliasing Method -> None(or FXAA)
Motion Blur -> Off, 잔상 효과로 현실감
Auto Exposure을 해제하고 메서드를 Manual로 설정, 바이어스를 0으로 설정한다.

Texture Setting

Mip Gen Setting -> NoMipmaps
Texture Group -> 2D Pixels (unfiltered)
Compression Setting ->UserInterface2D (RGBA)
Filter -> Nearest

PostProcessVolume

Infinite Extent (Unbound) -> On, 볼륨을 맵 전체에 적용
Exposure Compensation(노출 보정) -> 0, 카메라 밝기 후보정
EV 100 Min -> 0, Max -> 0, 밝기에 눈 적응
Vignette -> 0, 화면 가장자리를 어둡게 만들어 집중 효과와 긴장감 유발
Expand Gamut(색 공간 확장) -> 0
Tone Curve Amount(톤 커브 양) -> 0, 0으로 낮춰 실제 텍스쳐 색감을 살림

Project Setting

메모리, 성능 절약
Use Fixed Frame Rate -> On, Fixed Frame Rate -> 60.0
Global Illumination(글로벌 조명) -> None, 광원을 사용하지 않는다.
Reflection Method(반사 메서드) -> None
Shadow Map Method -> Shadow Maps, 광원을 사용하지 않아 그림자도 사용하지 않는다.
Ambient Occlusion -> Off
Ambient Occlusion Static Fraction (AO for baked lighting)(정적 마찰) -> Off

0개의 댓글