본문 바로가기

Memorize: RECALL

(12)
Memorize: RECALL 개발 기간: 2020.05.20 ~ 2020.09.21 (4개월) 개인 프로젝트 장르: 오픈월드 액션 RPG 게임 개발 환경: UE4, C++, Blueprint 특징 약 공격, 강 공격이 구분되며, 이를 통해 콤보를 이어나갈 수 있다. 특정한 콤보를 진행할 경우 스킬이 발동된다. 무기를 3개 휴대하고 실시간으로 변경 가능하다. 전투 중에 무기를 변경하며 콤보를 이어나갈 수 있다. 멀티플레이가 가능하게끔 제작되었으며, 추후 Co-op 기능 추가 예정 Github: https://github.com/blAs1N/Memorize-RECALL
Binary Tree를 이용한 콤보 시스템 구현 왜 Binary Tree인가? Memorize: RECALL의 특징 중 하나는 약 공격과 강 공격을 이용한 콤보 시스템이다. 또한 특정 콤보를 만족하면 일반적으로 실행되는 공격 대신 특수한 스킬이 실행된다. 이를 만족하는 구현을 위해 Binary Tree를 사용했다. 약 공격은 좌측 자식 노드, 강 공격은 우측 자식 노드로 가게 하면 설정해둔 Tree를 통해 적절한 Skill이 실행될 것이기 때문이다. Binary Tree 설정 Skill Class 설정 무기를 교체해도 콤보 진행은 유지되기에 Binary Tree는 Weapon에, Iterator는 Weapon Component에 존재한다. 우선 Weapon에 있는 Skill Class의 설정 코드를 보면, 우선 Data Table에 있는 Combo H..
Key 값을 이용한 Character, Weapon, Skill 데이터 관리 Key를 사용한 이유 처음에는 직접 Mesh와 Animation, Transform을 설정해주었다. 그러나 하나의 프로퍼티를 변경할 때마다 모든 값을 그에 맞추는 것은 번거로운 작업이었고, 그 값을 매번 기억하는 것 역시 비효율적이었다. 그래서 DataTable에 값을 저장한 후, 키 값을 변경하면 그에 맞추어 자동으로 변경되게끔 제작하였다. 또한 젤다의 전설: BOTW와 비슷하게 같은 무기의 같은 스킬도 레벨에 따라서 다른 효과를 입히도록 만들기 위해 Level 시스템을 도입했다. 그렇기에 Weapon에 Skill의 클래스는 직접 저장할 수 있더라도, Skill의 Data는 직접 저장하지 못하고 DB처럼 값을 기반으로 찾아올 필요가 있었다. 이를 구현하기 위해 Weapon의 키, Level, Skill..
Editor Time에 Character와 Weapon 교체하기 Editor Time 변경이 필요한 이유 Player Character의 블루프린트나, 맵에 배치된 AI들의 프로퍼티만을 변경해도 Editor에서 바로 적용되게끔 하고 싶었다. 변경 즉시 피드백이 되어야 올바르게 변경되었는지 확인할 수 있기 때문이다. 물론 Skill Data 같은 Non-Visual적인 객체들은 Editor Time에 변경할 필요가 없다. 즉 Character와 Weapon의 키 값만 Editor Time에 확인하여 키 값에 맞게 교체하면 된다. 프로퍼티 변경을 인식하는 방법 UObject의 수많은 Virtual 함수 중에 PostEditChangeProperty라는 함수가 있다. 프로퍼티가 변경된 후 호출되는 함수로 이를 이용해서 Editor Time 변경이 가능하다. 또한 #WITH..
자연스러운 무기 교체 (2) 서론 애니메이션 블렌딩을 통해 애니메이션은 해결되었다. 이제 남은 것은 메시를 자연스럽게 만드는 것이다. 그러면 이제 메시를 보간하는 코드를 어디에 작성하는지를 고민해야 한다. 나는 3가지의 방법을 생각하였다. Character Character의 코드에 Weapon 관련된 코드는 넣지 않았기 때문에 이 작업 역시 Character에는 넣으면 안 된다. Weapon의 Mesh Component들은 Character에 있지만, 오직 Weapon Component에 넘기기 위함이다. Weapon Component Weapon Component가 Weapon에 관한 코드를 전부 담고 있기에 가장 적절한 장소일 것이다. 이를 역으로 생각하면 Weapon에 관한 모든 코드가 있기에 메시에 관한 코드까지 넣으면 복..
자연스러운 무기 교체 (1) 서론 Memorize: RECALL의 가장 큰 특징 중 하나는 무기 교체 시스템이다. 공격, 회피, 피격 상태가 아니라면 언제든지 무기를 교체할 수 있으며 이를 통해 콤보를 이어나가는 것 역시 가능하다. 그런데 무기 교체 후 Mesh와 Animation이 즉시 바뀌면 부자연스럽다. 그렇기에 Mesh와 Animation의 교체를 부드럽게 해주는 작업이 필요하다. Pose Snapshot을 이용한 애니메이션 블렌딩 Anim Instance의 무기 교체 인식 우선 문제가 되는 것은 Anim Instance에서 어떻게 무기 교체를 인식할 것인가였다. 여기서 나는 3가지의 방법을 생각해보았다. Weapon Component에서 Anim Instance의 함수를 직접 호출한다. Editor Time에는 Anim I..
Catmull-Rom Spline을 이용한 도약 공격 제작 Catmull-Rom Spline이란? Catmull-Rom Spline은 보간 스플라인의 한 종류로, 최소 4개의 Control Point를 정의하면 Alpha 값을 통해 P1과 P2 사이의 벡터 값을 얻을 수 있다. Catmull-Rom Spline의 가장 큰 특징은 제어점을 무조건 지난다는 것이다. 그렇기에 제어점을 지나지 않는 Bezier Curve와 B-Spline 대신 Catmull-Rom Spline을 선택하게 되었다. 적용 추후 Spline의 활용을 염두에 두고 Leap 클래스와 분리하였다. Spline 클래스에는 제어점을 가지는 Points 변수와 Vector 값을 계산하는 Compute 함수만을 두어, Spline 알고리즘에만 집중하였다. Leap 클래스에서는 제어점을 설정하고, 제어점..
UObject에서 Replication 지원하기 왜 UObject에서 Replication이 필요한가? Memorize: RECALL은 최대한 많은 것을 Server에서 처리한다. 그렇기에 모든 Weapon과 Skill 객체들은 Server에만 존재하며, 애니메이션을 플레이하는 등의 Visual적인 부분에만 Multicast를 통해 클라이언트에 호출한다. 여기서 문제가 발생한다. Skill 객체는 Server에만 있는데 어떻게 Multicast를 할 것인가. 난 이를 네트워크 관련 작업을 담당하는 클래스를 따로 두어 해결하였다. 이 기능에 Skill에 필요한 Utility적인 함수를 모아 만들어진 클래스가 SkillContext이다. 이제 SkillContext를 Actor나 ActorComponent에서 상속받아 Replication만 활성화하면 끝..