오늘의 할일
1. 코드카타 정리
2. 세션 정리
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수(s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주)
[](char a, char b) { return a > b; } -> 람다 함수 써보고 싶었음#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s) {
string answer = "";
sort(s.begin(), s.end(), [](char a, char b) {
return a > b;
});
answer = s;
return answer;
}
AI가 작성한 코드
#include <string>
#include <algorithm>
using namespace std;
string solution(string s) {
sort(s.begin(), s.end(), greater<char>());
return s;
}
greater<char>(): 글자(char)들을 비교할 때, 값이 더 큰(greater) 녀석을 맨 앞으로 보내기 (내림차순 정렬)캐릭터 클래스가 폰 클래스보다 나은 이유는 CharacterMovement 컴포넌트라는 걸 가지고 있고 거기서 사실상 이동과 관련된 모든 함수랑 정보를 가지고 있기 때문에 편리하다
Animation Blueprint 만들어주기(이름 : ABP_Sparta) -> BP_SpartaCharacter 들어가서 Anim Class - ABP_Sparta로 설정해주기
💡생성 시 스켈레톤, 부모 클래스를 선택해야 함 (SK_Mannequin, AnimInstance)
-> 프리뷰 메시에 처음부터 하고자 했던 SKM_Manny로 변경
<ABP_Sparta 이벤트 그래프 작성하기>
Event Blueprint Initialize Animation : 애니메이션 블루프린트가 초기화될 때 호출이 딱 한 번 되는 이벤트 -> 초기 데이터 설정해주기 (BeginPlay 역할)
Get Owning Actor : 애니메이션 블루프린트가 적용된 Skeletal Mesh의 Actor를 가져와라! 가장 큰 부모 클래스를 가져와라 (CharacterMovement 컴포넌트를 가져와야함 -> Return Value가 Character이어야하므로 Cast to Character 노드 연결)
가져온 캐릭터를 변수로 빼주고 저장해주기 (카테고리 : Reference)
CharacterMovement (Target) 빼고 변수로 저장 (카테고리 : Reference)
-> 여기까지 해주면 Character와 CharacterMovement가 맨 처음 Initialize 이벤트 때 초기화가 딱 된다고 생각하면 됨

움직임은 실시간으로 바뀌기 때문에 Actor에서 실시간으로 호출할 수 있게 하는 Tick 함수 -> 블루프린트에서는 Event BlueprintUpdateAnimation 노드를 사용
Character가 Valid 한지 봐야됨 -> Character 변수를 꺼내서 우클릭, Convert to Validated Get 해주기 -> 그러면 Valid 판단하는 Get 함수로 변형됨
세 가지의 경우를 받아와야 하기 때문에 Sequence 노드 꺼내기

<첫 번째 경우 - 속도 저장하기>
캐릭터무브먼트 변수와 Velocity라고 해서 속도 값 가져오기
-> Movement Comp에서 Velocity 데이터를 관리, 저장하고 있었던 것
Velocity = 3차원의 벡터 형태 (XYZ축 각각 크기와 방향값을 가지고 있는 속도)
따라서 Z만 없애고 X,Y 살려줘야함
-> 그러기 위해선 일단 Velocity 변수로 저장 -> Vector Length XY 노드 (X, Y축에 벡터 크기만 구하는 함수) -> 그렇게 해서 나오는 스칼라값을 GroundSpeed라는 변수로 저장해주기 (땅 위에서의 캐릭터 속도)

<두 번째 경우 - 캐릭터 움직임 여부 저장하기>
캐릭터무브먼트 변수와 가속도(get Current Acceleration) 가져오기
-> 가속도가 붙었다는 것은 막 입력을 하기 시작했다는 뜻 -> 따라서 Return Value 값이 0이 아니어야함 (Not Equal 노드 연결)
실제로 캐릭터가 X, Y축으로 걷고 있어야 함 (그냥 가속도만 설정하면 공중에서도 가속도가 붙을 수 있어서 예외 경우가 생김) -> 그래서 GroundSpeed가 3보다 크다는 설정 넣어주기
💡 따라서 플레이어가 걷고 있고 입력 버튼을 누르고 있으면 (AND 조건) 움직임 여부 -> true (이 값을 저장할 변수를 bShouldMove로 저장)

<두 번째 경우 - 매 프레임마다 낙하 여부 저장하기>
CharacterMovement에서 Is Falling 함수 노드 사용하기 -> 리턴값 변수 저장하기 (bIsFalling)

👉👉👉 이제 이 세가지 변수를 활용해서 애니메이션 설정해줘야함
스테이트 머신 : 애니메이션 시스템에서 이 캐릭터의 상태에 따라서 적절한 애니메이션으로 전환해주는 시스템
스테이트 머신 노드 꺼내서 이름 Locomotion으로 설정
<Locomotion AnimGraph 작성>
Locomotion
Entry -> Idle <-> Walk/Run
<Idle 작성>
에셋브라우저에서 MM_Idle 꺼내기 & Loop 설정<Walk/Run 작성>
1. 에셋브라우저에서 BS_MM_WalkRun 꺼내기 & Loop 설정
2. GroundSpeed 변수 가져와서 연결해주기Idle -> Walk/Run (조건 걸어주기)
ShouldMove -> Can Enter TransitionWalk/Run -> Idle (조건 걸어주기)
ShouldMove -> Not Boolean -> Can Enter Transition
Locomotion SM 연결 끊고 새 SM(Main States) 장만하기 (Locomotion까지 총괄하는 SM 필요)

Main States를 구현을 마쳤으면 Output Pose에 연결하기 전에 Control Rig를 설정해야함 -> 발이 살짝 공중에 떠있는 거 해결하기(계단형태, 오르막길 등 자연스럽게 발 모양 맞추기)
IsFalling 변수 가져와서 Not Boolean과 Main States - Conrtol Rig - Output Pose 연결
Conrtol Rig 설정
-> Control Rig Calss = CR_Mannequin_BasicFootIK로 지정
-> Set Initial Trnsforms From Mesh 옵션에 체크 //현재 스켈레탈 메쉬 (Anim Graph에서 넘어온 포즈)의 뼈 변환을 그대로 초기값으로 사용하겠다
-> Input과 Output 카테고리 둘 다 ShouldDoIKTrace - Use Pin에 체크
Main States 안에서 Locomotion을 사용하기 위해서 “Locomotion” State Machine을 캐시 포즈로 저장 -> New Save cached pose 생성 (이름 : Locomotion)
< Main States AnimGraph 작성 >
Main States
Entry -> Locomotion <-L-<-R- Land(착륙) <- To Land
<Locomotion 작성>
Use cached pose 'Locomotion' -> Output Animation Pose<Land 작성>
Use cached pose 'Locomotion' & MM_Land (모션) -> Apply Addtive -> Output Animation Pose<To Land 작성> State Alias 생성 (특정 스테이트들 그룹)
Jump, Fall Loop 그룹으로 묶어주기Land -> Locomotion (조건 걸어주기 L) - 착륙하면 다시 걷기
//bShouldMove == true
ShouldMove -> Can Enter TransitionLand -> Locomotion (조건 걸어주기 R)
Details 창 - “Automatic Rule Based on Sequence Player in State”에 체크To Land -> Land (조건 걸어주기) - bIsFalling == false (공중에서 착지로 상태 전환)
IsFalling -> Not Boolean -> Result
<Fall Loop 작성>
MM_Fall_Loop 꺼내기 & Loop<Jump 작성>
MM_Jump -> Loop XX<To Falling 작성>
Locomotion, Land 두 개 묶어주기Jump -> Fall Loop (조건 걸어주기)
Automatic Rule Based on Sequence Player in State에 체크To Falling -> Jump (조건 걸어주기)
Z축 속도가 일정 값(예: 100) 이상이고, bIsFalling == true라면 점프 상태로 인식
To Falling -> Fall Loop (조건 걸어주기)
바닥에 있다가 공중으로 전환되는 상황!
Is Falling -> Result 노드 연결