오늘의 코드카타
오늘의 공부
팀 프로젝트 진행 내용
- Pose Search Schema, Database, Normalization Set 생성
- GASP를 기반으로 각종 에셋 생성
- ABP에 캐릭터를 통해 데이터를 받아오는 Event Graph 작성
- 궤적 정보를 이용하기 위해서 이전 프레임의 데이터를 전부 저장
- 내부적으로 캐릭터의 States를 별도로 저장 -> 이를 통해 추후에 모션 매칭에 활용
- 전부 Blueprints/Data에 별도로 Custom Enum으로 선언되어있음
- 각종 Chooser Table에서 활용할 변수 및 함수 저장
ABP 내부에서 상태 관리를 위한 Enum
1. Movement Mode
- CharacterMovement에 선언되어있는 E_MovementMode를 활용해서 별도의 Custom Enum을 선언해서 공중에 있는지, 지면에 있는지 저장
- 주의 : 이름이 매우 유사함. 선언해놓은 MovementMode는 Custom Enum임

2. Rotation Mode
- CharacterMovement의 bOrientRotationToMovement를 저장해서 걸어가는 모드를 저장
- 예를 들어 우측으로 걸어갈 때, 오른쪽으로 보고 정면식으로 걸어가는 방식과 정면을 보고 우측으로 걸어가는 방식을 구분하기 위해 사용

3. Movement State
- 캐릭터의 가속도 및 미래 궤적 속도를 통해 현재 움직이고 있는지 저장

4. Gait
- 해당 값은 캐릭터에서 Tick에서 실시간으로 이동하는 상태를 변경해줌
- 직접 입력받을 때, Character Input State라는 구조체를 통해 Walk, Run, Sprint를 상태로 변경을 해서 모션매칭에 더 알맞은 포즈를 고르게끔 도와줌
- 애니메이션을 보면 Transition을 하는 애니메이션도 있는데, 이런 과정을 도와주는 것으로 해석됨

5. Stance
- CharacterMovement의 IsCrouching을 통해 앉아있는지 검사해서 해당 값을 저장

-> 위의 5가지 상태를 저장해놓고, Chooser Table에서 PSD를 선택할 때 사용함

알게 된 점
- PSD에서 Continuing Pose Cost Bias라는 기존의 포즈를 선택하는 비용을 감소시켜주는 값을 Walk인 이동속도가 느린 포즈에서는 상대적으로 낮게 설정하는 반면, Run, Sprint처럼 이동속도가 빠른 포즈에서는 상대적으로 높게 설정해서 어색함을 최대한 줄여주고자 했다.
Pose Search Normalization Set
- 모션 매칭 시스템에서 포즈 간의 유사성을 측정하기 위해 규칙을 정의하는 에셋
- 포즈 검색의 정확도와 효율성을 높여줌
- 정규화가 필요한 이유
- 포즈는 다양한 속성으로 구성됨 (예: 속도, 위치, 회전)
- 단위와 범위가 다른 속성들을 단순 비교하면 값이 큰 속성이 과도하게 영향을 미침
- 이 모든 속성들을 동일한 스케일로 조정하여, 모든 속성이 공평하게 기여하도록 만듬
- 두 가지 핵심 역할
- 가중치 할당 : 어떤 속성이 현재 동작에 더 중요한지 가중치를 부여함
-> 예 : 달리기 중에는 속도에 높은 가중치를 부여하여 속력과 방향이 비슷한 포즈를 우선함
- 일관된 측정 : 서로 다른 단위를 가진 데이터를 비교 가능한 표준화된 점수로 변환함
Access Property 노드
- path를 통해 속성에 접근하는 블루프린트 노드
- 아래의 사진을 보면 알다시피 깊을 수록 복잡해지는 블루프린트 노드를 깔끔하게 하나로 보일 수 있음
- 기능적으로 다른 점은 없고, 블루프린트 그래프를 간결하게 유지할 수 있어서 가시성에도 좋음

ABP에서 함수를 통해 Chooser Table 변수 값을 넣고 싶은 경우
- 아래와 같이 함수를 Pure 및 Thread Safe를 지정해줘야지만, Chooser Table에서 Column 값으로 추가할 수 있음

오늘의 CS
순수 가상 함수가 내부에서 어떻게 저장이 되는가?
- MSVC의 경우
- 내부적으로
_purecall이라는 런타임 핸들러 함수 포인터를 넣어서 관리를 한다.
- 아래는 9월 2일 TIL에 작성한 적이 있는 참고 사진이다.


- GCC의 경우
- 내부적으로
__cxa_pure_virtual이라는 함수 포인터를 핸들러로 넣어서 관리를 한다.
- 해당 함수가 불릴 시에 아래와 같은 pure virtual method called 런타임 에러 발생
