캐릭터 구현 | Input | Animation

김여울·2025년 5월 5일

사전캠프

목록 보기
11/24
post-thumbnail
  • Skeleton Asset(스켈레톤 에셋)
    • 3D 모델이 가지고 있는 뼈대의 구조
  • Physics Asset(피직스 에셋)
    • 스켈레탈 메시의 각 부위 별 충돌체(예: 팔, 다리, 몸, 머리)를 설정하고 나타냄

1. BP_Character

  • 액터(캐릭터) 만들고 블루프린트 클래스로 변환하기

  • 메시에 스켈레탈 메시 에셋 적용

    • 크기 조정, 방향 맞춰서 회전
    • 컴파일 후 머티리얼 적용

  • 입력(Input) 넣기
    • 컨트롤러가 빙의해야 함
    • Get Player Controller : 조종해야할 컨트롤러 파악하기
    • Possess (빙의)
      - 캐릭터는 폰의 상속 자식 ➡ 폰 실행핀에 캐릭터 넣어도 됨
      - 자기 자신 넣기 this ➡ Self

      ▶ 시작하면 빙의한다

  • 어떤 입력을 받는지 확인하기
    • 콘텐츠 폴더에 입력 폴더 생성 ➡ 우클릭 후 입력 ➡ 입력 액션


2. 입력 액션 (IA)

  • 일시정지 시 트리거
    • 게임이 일시정지 됐을 때도 동작할지 여부 결정

🌀 값 타입

항목Digital (bool)Axis1DAxis2DAxis3D
🔢 차원0차원
(값만 존재)
1차원 (선형)2차원 (평면)3차원 (공간)
📐 구조/형태단일 값
(True / False)
벡터
(예) [1, 2, 3]
행렬 또는 평면 좌표
(예) [1,2], [3,4]
입체 배열 또는 공간 좌표
(예) [x, y, z]
📊 의미참/거짓
신호 또는 상태
한 방향의 축
(x 또는 y)
두 방향의 축
(x, y)
세 방향의 축
(x, y, z)
🧠 직관 비유스위치
(켜짐/꺼짐)
줄자/직선도화지/지도큐브/건축모형
🧪 예시True, False, 0, 1시간축, 1D 센서 데이터,
가속(1) / 후진(-1)
이미지, 화면 픽셀,
WASD: A(-1,0) D(1,0) W(0,1) S(0,-1)
3D 모델, CT 이미지, 공간 좌표계
🛠️ 사용 맥락디지털 회로, 신호, 제어그래프, 배열, 센서 값이미지 처리, 평면 좌표계3D 그래픽스, 시뮬레이션, 물리 공간

🔻IA_JUMP



3. 입력 매핑 컨텍스트 (IMC)

  • 매핑
    • 입력 액션에 어떤 키를 쓸지 정함
  • 입력 액션과 마찬가지로 트리거 설정 가능
  • 모디파이어
    • 입력값을 가공/조정하는 컴포넌트
    • 입력된 값(눌림 1, 안 눌림 0) 등의 값을 다른 값으로 역전 or 벡터로 바꿈
    • None : x축으로 1
      ➡ W의 None은 없는 것과 같으므로 삭제해도 됨
    • 스위즐 입력 축 값 : x축 값을 y축으로 변환

🌀 WASD
❓ w가 왜 앞쪽인가

  • 좌표계 기준 (로컬 기준)
    • X축 (+) → 앞쪽 (Forward)
    • Y축 (+) → 오른쪽 (Right)
    • Z축 (+) → 위쪽 (Up)
방향설명
앞/뒤XW가 +X, S가 -X
좌/우YD가 +Y, A가 -Y
위/아래Z점프/낙하 등

방향연결할 축
W앞으로 이동X = +1
S뒤로 이동X = -1

X : 앞/뒤 (W = +1, S = -1)
Y : 좌/우 (D = +1, A = -1)

🔻IMC_Main


▶ 트리거가 발생하면 점프를 실행한다

4. 컨트롤러 입력

✅ 아직 컨트롤러에 입력 부여받지 않았음
❔ 어떤 컨트롤러가 어떤 입력을 했는지

  • Get Enhanced Input Local Player Subsystem : 입력 처리기

    ▶ 빙의 - 점프 매핑 컨텍스트 연결

5. 카메라

  • 스프링 암 컴포넌트 추가

    • 살짝 옆에서 보게 y축 위치 이동
    • 타깃 암 길이 변경
  • 카메라 컴포넌트는 스프링 암 컴포넌트에서 추가

  • 카메라 선택하기

    • Set Active : 현재 이 카메라를 활성화

      🔻Jump

🔻IA_Move

  • 입력 액션

🌀 트리거

항목PressedDown / Repeat
⌨️ 트리거 조건키를 딱 한 번 눌렀을 때키를 누르고 있는 동안
🔁 호출 시점한 번만 실행됨매 프레임마다 계속 호출됨
🧠 용도단일 동작 :
점프, 공격 시작, 모드 전환 등
연속 동작 :
걷기, 조준 유지, 연사 등
🎮 예시점프 버튼 누름W 키로 계속 걷기

  • IMC

  • BP_Character

    • IA_Move는 캐릭터 무브먼트에 연결
    • Add Input Vector : 입력된 백터 방향으로 움직인다고 선언
    • Actor Value는 백터 2D의 두 가지 축을 가진 벡터
    • World Vector: 세 가지 축을 가진 벡터
      ➡ Actor Value를 플로트 두 개로 분리
    • Break Vector 2D, Make Vector : 이동 인풋 액션의 출력 값인 2차원 벡터를 3차원 벡터로 변환
    • 캐릭터무브먼트에 Input Vector(방향)를 더해준 것
      ➡ 눌린 키 방향으로 감


🔻IA_Look

  • 시선이동(마우스)

    • 마우스로 상하/좌우로 회전 ➡ Axis2D
  • IMC 에서 마우스 xy 2d 축

    • 마우스 두 축의 입력을 바로 받음, 움직이면 움직임 값을 전달
  • BP_Character

    • Triggered : 움직일 때 발생

    • Add Controller Yaw Input
      ✔ Yaw (Z축 회전)

      • Yaw는 Z축 회전을 의미, 수평 회전을 담당
      • Z축 회전은 X축을 기준으로 가로 방향
      • Yaw 값은 "회전할 양" (degree 단위)을 의미하며, 위치 좌표값이 아니라 회전 정도

      ✔ 마우스 입력에 따른 Yaw 값 전달

      • 마우스 입력을 기준으로 X축 (좌우 이동)을 받음
      • X축 정보를 Yaw Input에 전달
      • "얼마나 회전할 것인가" 가 전달되는 값으로, 마우스의 좌우 움직임이 Yaw 회전에 영향

      ✔ Pitch (Y축 회전)

      • Pitch는 Y축 회전을 의미, Up/Down (위/아래) 회전
      • Pitch input은 Y축에 전달되며
      • -1을 곱하는 이유는 :
        양수 입력 시 아래로 회전, 음수 입력 시 위로 회전해야 하기 때문
      • 위로 회전하고 싶다면 음수 값을 전달해야 하므로 -1을 곱함
    • 스파링 암 컴포넌트
      ☑ 폰 제어회전사용 체크
      체크 안 하면 입력 받은 수치를 전달해줘도 따라가지 않고 캡슐 컴포넌트(부모)의 각도를 따라감
      ➡ 우리가 조종해도 따라가지 않음

  • 컨트롤러 회전

    • 마우스 좌우로만 움직이기 (상하)
      캐릭터 블루프린트 클래스에서 회전 값 선택

🌀 Pawn 클래스 / Character 클래스에서 카메라와 캐릭터의 회전 연동

항목설명주 용도
피치상하 회전1인칭 시점
좌우 회전3인칭 회전
(좌우) 기울기비행기 등 특수 이동

📌 캐릭터 W 이동 방향 오류


캐릭터가 뒤를 보고 W키를 눌렀을 때 뒤로 감
✔ 월드 방향을 보기 때문
✔ 액터가 보고잇는 앞과 오른쪽 방향을 알아야함

Get Actor Forward/Right Vector 각각 X축 Y축과 곱하기, 더하기
➡ 전후좌우가 됨
➡ World Vector 에 연결



6. 애니메이션 블루프린트 (ABP)

  • 애니메이션 블루프린트
    • 여러 상태를 지정할 수 있는 애니메이션들의 모임
  • 애님클래스
    • 어떤 애니메이션 블루프린트를 사용할 건지 정함

🔻애니메이션 그래프 AnimGraph

  • Output Pose
    • 최종적으로 나타날 애니메이션

▶ 애니메이션 루프 ☑ : 애니메이션이 반복됨

  • 보통 단일로 사용 X ➡ 상태도(State Machine) 만들기
    • State Machine
      • 상태를 옮겼다 할 수 있는 기계장치
  • Entry

    • 처음 시작할 애니메이션

    • 쌍방향일 땐 EventGraph 에서 조건 추가 가능

    • Character Movement Component의 Is Falling 작동 원리

      • Is Falling은 Character Movement Component가 제공하는 논리 상태(Boolean)
      • 캐릭터가 공중에 있고, 바닥에 닿아 있지 않을 때 true가 됩니다.

      🌀 동작 조건 (Is Falling)

      상황Is Falling
      점프 중true
      추락 중 (낙하)true
      땅에 서 있을 때 (Grounded)false
      착지 직후false
    • Cast BP_Character

      • 특정 액터가 BP_Character인지 확인하고, 그 기능을 사용하기 위한 캐스팅 과정
      • 캐릭터는 Pawn을 상속한 Character 클래스

🌀 상속 구조

Object
└── Actor   // 게임에 존재하는 모든 오브젝트의 기본 클래스
    └── Pawn  // 플레이어나 AI가 조종할 수 있는 이동 가능한 클래스
        └── Character // 점프, 낙하, 이동 등의 기능이 추가된 Pawn
항목PawnCharacter
상속 구조ActorPawnPawnCharacter
기능 차이직접 이동 로직 구현 필요이동, 점프, 캡슐 콜라이더,
Movement Component 기본 제공
사용 목적단순 이동 또는 AI 조작체사람형 캐릭터
(점프, 착지 등 자연스러운 움직임 필요)

  • 만든 조건 연결하기
    ▶ 떨어지는 중에는 떨어지는 애니메이션 재생
    ▶ 애니메이션 블루프린트(ABP_MAin)를 캐릭터 블루프린트(BP_Character)에 삽입

7. 블랜드 스페이스 (BS)

  • 상태도 완성하기
    • 캐릭터의 상태 전이
      • Idle → Walk → Run 순으로 속도에 따라 전이
    • 애니메이션 블렌드 스페이스
      • 여러 애니메이션을 속도 값 기반으로 부드럽게 섞음
      • 각 속도에 맞는 자연스러운 움직임을 연속적으로 표현
      • 단순히 상태마다 하나의 애니메이션을 전환하면 부자연스럽게 튐
        • 속도 낮음 : Idle → Walk 사이 중간 동작 생성
        • 속도 빠름 : Walk → Run 사이 동작도 부드럽게 표현

  • 가로축 / 세로축
    • 속도에 따라서만 정하기 때문에 가로축만 사용
    • 세로축은 사용하지 않음 None ➡ 0

🔻BS_Idle

  • ABP에서 BS_Idle 와 연결

  • BS_Idle의 속도 가져오기

  • EvengGraph

    • 떨어지는 속도는 상관이 없음
      ➡ Get Velocity 가져오고 Z축 제거
      ➡ Vector2D로 변환
      ➡ Length 주어진 Vector2D의 크기(속도)를 알 수 있음
      ➡ 속도 변수(플로트) 만들어주기

▶ Idle-Walk-Run 애니메이션 연결해 동작 자연스러움

🔻 State Alias

  • 선택한 상태에서 다른 상태로 이동시킬 수 있음

    항목설명
    목적상태들을 그룹화하여 간결한 조건 처리
    사용 위치상태 머신, 애니메이션 전이 조건
    주 용도여러 상태를 하나처럼 간주하여 조건을 단순화

    ▶ Fall_rtan 이후 FasllLoop_rtan으로 넘어감
    ▶ Alias에서 이미 떨어지는 중인 경우엔 Fall로 넘어가게함

🌀 Fall / FallLoop

항목FallFallLoop
진입 시점점프 직후 / 추락 시작 시점추락이 일정 시간 이상 지속될 때
애니메이션붕 뜨는 초기 모션지속적인 낙하 모션
재생 방식한 번 재생 (Non-Loop)루프 재생 (Loop)
용도추락 "시작" 표현추락 "지속" 상태 표현

🌀 Land / Idle

항목LandIdle
역할착지 순간 애니메이션정지 상태 루프 애니메이션
루프 여부❌ (1회 재생)✅ (지속 루프)
상태 전이Falling → Land → Idle보통 Land 이후 진입
길이짧음 (0.2~0.5초)입력 없을 때 계속 유지
     +--------+
     |  Fall  |
     +--------+
          |
          v
    +------------+
    |  FallLoop  |
    +------------+
          |
   (IsGrounded)
          v
     +--------+         +--------+
     |  Land  | ------> |  Idle  |
     +--------+  (AnimEnd) +--------+
          ^                   ^
          |                   |
    (Speed > 0)         (Speed == 0)
          |                   |
     +--------+         +--------+
     |  Walk  | <-----> |  Run   |
     +--------+         +--------+

🌀 상태 전이 조건

FallLoop → Land: 땅에 닿음 (IsGrounded)

Land → Idle: 애니메이션 종료 (AnimEnd)

Idle ↔ Walk/Run: Speed == 0 또는 Speed > 0

Idle/Walk/Run → Fall: 점프하거나 추락 시작


  • 스테이트의 시퀀스 플레이어에 따른 자동규칙 ☑
    • 스테이트에 연결된 애니메이션 시퀀스가 루프하지 않는 경우, 해당 애니메이션 종료 시 자동으로 상태 전이 규칙을 생성

▶ Land ➡ Idle 자동으로 넘어가게 함

Fall이나 FallLoop 에서 떨어지는 상태가 아니면 (boolean) Land_rtan 실행시키고 시간 지나면 Idle 실행

  • Transition(상태 전이)추가
    • 더 자연스럽게 함

🛠️ Final Output

  • 착지하고 속도 100이상 ➡ 달리는 모션으로 바로 변경
  • 속도가 정상인 상태면 착지 모션 추가
  • 움직이는 속도에 따라서 달리는 모션 / 걷는 모션 출력
  • 떨어지는 모션일때 떨어지는 중(FallLoop) 표현됨
  • 쭉 떨어지면 FallLoop가 계속 재생

0개의 댓글