[TIL] 2025-02-25
2025-02-25 TIL
알고리즘 문제
처음 문제를 봤을 때 수열, 원형 수열이라는 말에 이해를 잘 못했었는데, 문제 자체의 난이도는 그렇게 높지 않았던 것 같습니다.
수열과 원형 수열에 대해 지식이 부족한 것 같아서 나중에 추가로 공부해야 할 것 같습니다.
해당 문제를 풀 때에도 브루트포스로 시간 복잡도가 $O(n^3)$이 나왔는데, 이 부분이 아쉬워서 나중에 여유가 된다면 좀 더 최적화 할 수 있는 방법을 고민해보고 싶습니다.
프로그래머스 연속 부분 수열 합의 개수
스파르타 내배캠
스파르타 내배캠에서 팀프로젝트가 진행중입니다.
슈터 게임을 만드는게 목표인데, 제가 작업한 내용들에 대해 기록해두지 못했어서 오늘 커밋 기록과 제 기억을 더듬어가며 어느정도 정리하고자 합니다.
우선 지금까지는 팀장으로서 프로젝트에 대해 회의를 진행한 내용은 다음과 같습니다.
- 조원 별로 구현을 희망하는 기능을 담당하도록 역할 및 작업 분리
- 기획적인 이야기
- 구체적으로 어떤 장르를 만들지 잠입, 디펜스, 오펜스, FPS데스매치(발로란트 데스매치, 오버워치 데스매치)
- 게임에 어떤 시스템을 만들지
- 코드 컨벤션 및 깃허브 룰에 대한 규칙 결정
- 언리얼 엔진의 명명 규칙과 코딩 표준을 활용
- 깃허브 룰은 스파르타 내배캠에서 제시해준 깃허브 룰을 사용
- 트러블 슈팅 작성에 관한 이야기
- 언리얼 엔진의 버전
- 언리얼 엔진의 폴더 구조
오늘까지 프로젝트에서 제가 작업했던 것은 다음과 같습니다.
- LFS 적용 및 깃 이그노어 설정
- UEGitPlugin 적용
- 플레이어 캐릭터와 적 캐릭터가 사용할 애셋 추가
- ex) 애니메이션, 메시
- 아이템 애셋 추가
- 총, 회복 아이템에 대한 스켈레탈 메시를 찾고 프로젝트에 추가
- 캐릭터 구현
- 플레이어 캐릭터 입력 구현
- 입력을 받고 이동 및 카메라 회전 구현
- 앉기 구현
- 캐릭터 애니메이션 구현
- Idle
- Walk/Run
- 블렌드 스페이스 사용
- Crouch
- 블렌드 스페이스 사용
- Jump
- 점프, 체공, 착지로 분리해서 구현
- 점프를 하지 않고, 단순하게 추락해도 체공 -> 착지로 애니메이션이 재생되어 자연스럽게 애니메이션 전환
- 점프, 체공, 착지로 분리해서 구현
- Aim OffSet
- 라이플
- 권총
- Turn In Place
- 90도 각도에서 회전
- 훈련장 레벨
- 해당 레벨에서 사용할 게임모드 및 게임 스테이트 구현
- 표적용 AI 스폰 구현
- 메인 메뉴 구현
- 메인 메뉴 레벨을 생성하고, 해당 레벨에서 사용할 게임모드 구현
- 게임모드에 메인 메뉴에서 사용할 플레이어 컨트롤러 구현
- 메인 메뉴 UI를 구현하고, 유저 위젯에서 애니메이션을 사용
- 버튼 클릭 시 레벨 이동
플레이어 캐릭터의 이동은 컨트롤러의 회전을 기준으로 이동하도록 구현했습니다.
애니메이션에 필요한 변수 및 연산은 C++로 애니메이션 인스턴스 클래스에서 설정합니다.
Walk/Run
과 Crouch
의 경우 블렌드 스페이스에서 대각선 이동시 재생되는 애니메이션의 모습이 이상한 문제가 있는데, 애니메이션이 4방항으로만 있고, 블렌드 스페이스 사용을 고려한 애니메이션이 아니기 때문입니다.
애니메이션이 어색하다는 점 이외에 기능의 문제나 블렌드 스페이스 사용 자체의 문제는 없다는 점을 튜터 선생님들을 통해 확인했습니다.
라이라 프로젝트의 애니메이션처럼 Orientation Warping
을 사용하는 방법도 있는 것 같지만 구현의 난이도가 높고, 정보가 많지 않아 해당 방법을 사용한 후 문제가 발생했을 경우 도움을 받을 수 있는 곳이 많지 않아 직접 해결해야한다는 점이 있습니다.
애니메이션이 어색하다는 점 이외의 문제는 없고, 우선 다른 구현해야하는 기능이 많기 때문에 해결해야하는 우선순위를 미루고자 합니다.
Layered blend per bone
를 사용해서 특정 본을 기준으로 하체는 이동하는 애니메이션을 재생하고, 상체는 무기를 들고 있거나 아이템을 들고 사용하는 등의 애니메이션을 재생하도록 구현했습니다.
Aim Offset
을 좌우 90도로 구현했습니다.
각 무기에 대한 AimOffset
을 구현했는데, Blend Poses by int
를 사용했습니다.
나중에 아이템과 무기가 준비되면 enum
으로 변경해서 재생할 애니메이션을 선택하도록 수정하고자 합니다.
180도로 구현하고 싶었는데, 좌우 180도로 설정할 경우 UKismetMathLibrary::ClampAngle
함수에서 나오는 결과값이 이상해지는 문제가 있었습니다.
해결해보고자 179도로 설정하거나 하는 등으로 값을 조금 작게 설정해보았는데, 이 경우 179도에서 조금 더 회전을 하게되면 -179로 점프하게되어 애니메이션이 이상해지는 문제가 있었습니다.
좌우 90도의 경우에도 같은 문제가 발생 할 수 있지만, Turn In Place
를 사용해서 최대한 발생하지 않도록 설정할 수 있었습니다.
단발적으로 재생할 애니메이션을 사용하기 위해 Anim Slot
을 사용했습니다.
Turn In Place
에서도 좌우 회전을 90도로 회전하는데, 같이 작업하는 조원들과 제가 구현한 결과물을 같이 봤을 때 이정도로도 충분한 것 같다라는 피드백을 받았고, 튜터 선생님들에게도 결과물에 대한 피드백을 받았을 때 180도가 없다는 것에 아쉬움이 있지만, 이 정도로도 부족하지는 않고 해당 90도 회전은 잘 구현한 것 같다라는 피드백을 받았습니다.
180도로 회전하는 경우도 추가하고 싶지만, 팀장으로서 프로젝트에 전체적인 담당와 구현을 담당해야해서 일단 이 시스템에 대한 구현은 90도에서 그칠까 합니다.
만약 180도로 회전하는 경우를 추가한다면 다음과 같은 방법으로 추가해볼 수 있을 것 같습니다.
90도의 회전과 같은 방법으로 애니메이션에 커브를 주고, 현재 캐릭터와 컨트롤러의 회전 값을 확인해 예시로 회전 값이 135도 미만이라면 90도로 회전하는 애니메이션을 재생하고, 135도 이상이라면 180도를 회전하는 애니메이션을 재생해서 커브의 값을 가져와 회전하는 방식으로 구현해볼 수 있을 것 같습니다.
메인 메뉴의 UI에서 애니메이션을 사용하는데, 버튼들에 대해 애니메이션을 재활용하기위해 버튼에 대해 위젯을 따로 구현했습니다.
메인 메뉴에서 구현한 버튼 유저 위젯을 가지고있고, 버튼에 대한 텍스트를 C++로 수정했고, 버튼에서 실행할 함수를 델리게이트로 바인딩해 메인 메뉴의 함수를 실행하도록 했습니다.
댓글남기기