TIL(41)

이채원·2026년 8월 14일

TIL

목록 보기
41/84

오늘의 할일
1. 코드카타 정리
2. 세션 정리


코드카타 정리

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수(s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주)

  • sort 함수를 쓰기 위해서 algorithm을 인클루드해주고 시작지점, 끝지점, 정렬규칙 지정해주기
  • [](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) 녀석을 맨 앞으로 보내기 (내림차순 정렬)
  • 컴퓨터(ASCII 코드)는 '소문자'를 '대문자'보다 더 큰 숫자로 인식. 그래서 자연스럽게 소문자가 대문자보다 앞에 오도록 정렬됨

C++와 Unreal Engine으로 3D 게임 개발 : 4회차 정리

캐릭터 클래스가 폰 클래스보다 나은 이유는 CharacterMovement 컴포넌트라는 걸 가지고 있고 거기서 사실상 이동과 관련된 모든 함수랑 정보를 가지고 있기 때문에 편리하다

2-4 : 캐릭터 동작 애니메이션 적용

Animation Blueprint 만들어주기(이름 : ABP_Sparta) -> BP_SpartaCharacter 들어가서 Anim Class - ABP_Sparta로 설정해주기
💡생성 시 스켈레톤, 부모 클래스를 선택해야 함 (SK_Mannequin, AnimInstance)

  • UAnimInstance : 언리얼 엔진의 애니메이션 시스템에서 핵심 역할을 하는 클래스(캐릭터 애니메이션 상태를 전환하거나 제어)

-> 프리뷰 메시에 처음부터 하고자 했던 SKM_Manny로 변경

<ABP_Sparta 이벤트 그래프 작성하기>

캐릭터 Movement Component 변수화

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로 저장)

  • bShouldMove = (Ground Speed > 3.0) AND (Acceleration != 0)

<두 번째 경우 - 매 프레임마다 낙하 여부 저장하기>

CharacterMovement에서 Is Falling 함수 노드 사용하기 -> 리턴값 변수 저장하기 (bIsFalling)

👉👉👉 이제 이 세가지 변수를 활용해서 애니메이션 설정해줘야함

AnimGraph 설계하기

스테이트 머신 : 애니메이션 시스템에서 이 캐릭터의 상태에 따라서 적절한 애니메이션으로 전환해주는 시스템

스테이트 머신 노드 꺼내서 이름 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 Transition

Walk/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 Transition

Land -> 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 노드 연결

profile
초보 개발자

0개의 댓글