언리얼 RPG 프로젝트 1 C++

250x250

언리얼 RPG 프로젝트 1 C++

언리얼 엔진을 처음 접하며 만든 첫 프로젝트로 기억합니다.

당시 언리얼 엔진에 대해 전혀 알지 못했기 때문에, Unreal Engine의 기본적인 사용법과 C++을 활용한 게임 개발의 핵심 요소를 배우는 것이 목표였습니다.

게임에 대해.

개발 언어: c++, blueprint

개발 엔진: unreal5

개발 환경(실행 환경): window 10

코드.

깃허브 주소:

https://github.com/ykarr/RPG_Slash_1.git

 

GitHub - ykarr/RPG_Slash_1

Contribute to ykarr/RPG_Slash_1 development by creating an account on GitHub.

github.com

기능.

캐릭터.

1. 상태.

캐릭터의 상태를 체계적으로 관리하기 위해 Enum Class를 활용했습니다.

각 상태는 캐릭터가 게임 내에서 취할 수 있는 다양한 행동과 상태를 명확히 정의하고, 이를 통해 캐릭터의 동작을 직관적이고 쉽게 관리할 수 있도록 설계했습니다.

2. 공격.

무기를 소지한 경우 공격이 가능합니다.

무기의 Collision 결과를 기반으로 각 Actor에게 GetHit 인터페이스를 통해 적중 결과를 전달합니다.

Unreal5 Hit C++

 

Unreal5 Hit C++

Unreal5 Hit C++ 안녕하세요. 저번 글에서 공격 애니메이션을 추가했습니다. 이번 글에서는 Box Component를 이용해 공격한 위치를 보여주도록 하겠습니다. [프로그래밍/언리얼] - Unreal5 Attack Animation C++ U

intunknown.tistory.com

3. 피격.

플레이어 캐릭터가 피격당한 경우.

Weapon에 적용된  Damage만큼의 피해를 입고 UI를 업데이트합니다.

이후, 피격당했을 때 내적을 계산합니다.

Unreal5 Dot Product(내적) C++

 

Unreal5 Dot Product(내적) C++

Unreal5 Dot Product(내적) C++ 저번글에서 간단한 Hit를 구현했는데 좀 더 살을 붙여보려고 합니다. 이번 글에서는 Dot Product를 이용해 Player가 때리는 각도를 알아보려고 합니다. [프로그래밍/언리얼] - U

intunknown.tistory.com

 

이후 외적을 계산해서 맞은 방향을 알아냅니다.

Unreal5 맞은 방향 알아내기 CrossProduct(외적) c++

 

Unreal5 맞은 방향 알아내기 CrossProduct(외적) c++

Unreal5 맞은 방향 알아내기 CrossProduct c++ Dot Product는 두 벡터의 사잇각이 0-180도 사이에 있을 때 값을 계산합니다. 즉, 두 벡터가 평행하면 값이 최대가 되고, 직교하면 0이 되며, 반대 방향이면 값

intunknown.tistory.com

그러면 이제 맞은 방향에 맞게 Hit Animation을 실행합니다.

4. 회피.

사용할 때마다 Stamina를 사용하고, State를 EActionState::EAS_Dodge로 설정해서 구르는 동안 공격등을 실행하지 못하도록 했습니다.

5.Attribute

Attribute Component를 이용해 값을 계산해서 뱉어줍니다.

시간이 지나면 다시 회복되는 스태미나는 Tick을 이용해 회복시켜 줬습니다.

6. FootIK

inverse Kinematics(역운동학, IK)는 일반적으로 로봇공학에서 사용되는 개념으로, 끝단의 위치가 주어졌을 때, 그 위치를 만족시키기 위해 로봇의 관절 각도를 계산하는 기술입니다.

이 기술을 사용해서 캐릭터의 발 위치를 보다 자연스럽게 해줬습니다.

Unreal5 Foot IK

 

Unreal5 Foot IK

Unreal5 Foot IK *그냥 공부하면서 작성하는 글입니다. 이 글은 이전글과 이어지는 글이므로 이해하기 위해서 이전 글이 필요할 수 있습니다. [프로그래밍/언리얼] - Unreal5 점프 애니메이션 Unreal5 점

intunknown.tistory.com

7. 아이템 장착/ 해제.

아이템을 장착할 수 있는 상태라면 장착하고, 장착할 수 없는 상태라면 장착할 수 없도록 구현했습니다.

장착키를 다시 누르면 현재 장착한 무기를 다른 곳에 있는 소켓에 넣어둡니다.

무기를 들고 있을 때 버리기 키를 누르면 무기가 줍기 전 상태로 돌아갑니다.

8. UI

UI는 HUD랑 뭐 별거 없으니까... 생략하겠습니다.

Enemy.

1.Enemy의 상태.

위의 Player에서 있었던 Enum을 이용해 상태관리를 하고, 그 상태를 바탕으로 Enemy의 행동이 정해집니다.

간단하게 말하면, 순찰->발견->추격->공격->순찰 순입니다.

2. 순찰 / 추격.

평소에는 Patrol target 중에서 랜덤 한 위치로 순찰을 다니다가 UPawnSensingComponent에 플레이어가 포착되면 플레이어를 추격하게 됩니다.

3. 공격.

공격을 할 수 있는 위치까지 추격하게 되면, Enemy는 공격을 시작하게 됩니다.

Enemy가 위협적일 수 있도록 MotionWarping을 이용해 어느 시점까지 공격하면서 플레이어를 향해 이동합니다.

4. 피격.

Enemy가 피격당하는 경우 Player와 비슷합니다.

다만, 피격당하는 순간 머리 위에 HealthBar가 생성되고 일정 시간 피격당하지 않으면 보이지 않는 상태로 돌아갑니다.

5. Death

Enemy가 죽은 경우 State가 바뀌게 되며 행동을 멈춥니다.

이후 아이템이 떨어집니다.

item

1. Gold

Breakable Object를 부셨을 때, Gold가 되는 아이템이 드롭됩니다.

언리얼 부서지는 오브젝트

 

언리얼 부서지는 오브젝트

언리얼 부서지는 오브젝트언리얼5에서 부서지는 오브젝트를 만드는 방법에 대한 내용입니다.Geometry CollectionFracture Mode를 선택하고 New를 눌러줍니다.이름 설정하고 저장하면 Geometry Collection이 생

intunknown.tistory.com

2. Soul

Enemy가 죽은경우 Soul을 드롭합니다.

Soul에 접근하면 획득할 수 있습니다.

3. Weaon

Weapon Actor  Class를 만들어서 무기 생성 및 장착합니다.

장착하는 경우 무기 Effect와 무기 장착을 위해 생성된 Collision을 비활성 상태로 만들어줍니다.

Unreal5 무기 생성 및 장착 C++

 

Unreal5 무기 생성 및 장착 C++

Unreal5 무기 생성 및 장착 C++. *이 글은 공부하면서 작성하는 글이며, 이전글과 이어지는 글이므로 이해하기 위해서는 이전글 확인이 필요할 수 있습니다. [프로그래밍/언리얼] - Unreal5 Overlap C++ Unr

intunknown.tistory.com

공격 Animation에 Notify를 사용해서 무기가 공격하는 중에만 Collision을 검사할 수 있도록 설정합니다.

Unreal5 무기 Collision C++

 

Unreal5 무기 Collision C++

Unreal5 무기 Collision C++ 안녕하세요. 이번 글에서는 무기 Collision 설정으로 공격 가능한 상태일 때만 Collision이 활성화되도록 하겠습니다. [프로그래밍/언리얼] - Unreal5 맞은 방향 알아내기 CrossProduct

intunknown.tistory.com

Collision을 이용해 맞았는지 확인하고, 같은 태그(같은 Enemy)인지 검사한 후 Damage와 Effect를 실행합니다.

알게 된 점.

언리얼 엔진을 처음 배우며 다양한 요소를 경험할 수 있었고, 이를 통해 게임 개발에 필요한 틀을 제공받아 제작 과정에서 큰 도움을 받았습니다.

또한, 학부 시절에는 상속이 중요하다는 것을 머리로는 알았지만 실감하기 어려웠습니다.

이번 프로젝트를 통해 상속을 활용하면 코드 중복을 줄이고, 새로운 기능 추가나 기존 기능 수정이 훨씬 수월해진다는 점을 체감할 수 있었습니다.

(여기서는 상속만 이야기 했지만 여러가지가 있습니다.)

 

한 줄 요약: 언리얼 엔진에 많이 익숙해진 것 같고, 기본의 중요성을 깨달았다.

아쉬운 점.

처음 언리얼 엔진을 사용해 진행한 프로젝트였던 만큼, 혼자 작업하다 보니 아쉬운 점이 많았습니다.

RPG 장르는 구현해야 할 기능이 많고, 공부해야 할 내용과 필요한 리소스도 많았습니다.

이로 인해 한정된 시간과 경험만으로는 출시할 만한 퀄리티를 달성하기까지의 거리가 너무 멀게 느껴져, 결국 프로젝트를 빠르게 마무리하게 되어 아쉬움이 남았습니다.

물론 시간자체는 충분히 있었지만, 리소스를 구하거나 레벨을 구성하는 과정에서 어려움이 많았습니다. 또한, 언리얼 엔진에 대한 이해도가 부족해 인터넷에서 자료를 찾아가며 진행하다보니, 더 진행하면 과연 이 프로젝트를 끝낼 수 있을지 의문이 들었습니다.

또한, 효율적인 코드 작성 방법에 대한 확신도 없었고, 언리얼의 다양한 기능(ex.Behavior Tree)도 몰라서 제대로 활용하지 못해 프로젝트를 진행하면서 한계를 느끼기도 했습니다.

이러한 경험들은 아쉬움으로 남았지만, 동시에 많은 것을 배우고 고민할 수 있는 기회가 되었습니다.

느낀 점.

확실히 이런 프로젝트를 진행하면서 만들고, 버그에 걸리고, 디버깅을 통해 문제를 해결하며 방법을 검색하는 과정에서 코드에 점점 더 익숙해지고 C++과 언리얼의 이해도가 높아지는 것을 느꼈습니다.

 

다양한 기능을 프로젝트를 진행하며 공부할 수 있었고, 학부생 시절에는 중요하다고 생각했지만 실감하지 못했던 개념들의 중요성을 이번 프로젝트를 통해 더 깊이 느낄 수 있었습니다.

실행 영상.

해당 프로젝트 실행 영상.

https://youtu.be/_WJOPLFuXFY?si=Zqt6kIl7i6i4wmH1

 

Designed by JB FACTORY