🟩 오늘의 목표
- std::vector의 요소 추가 방식인 push_back과 emplace_back의 차이점을 배우고 상황에 맞는 효율적인 사용법을 익힌다.
- C++와 애니메이션 블루프린트(ABP) 간의 데이터 통신 및 실시간 변수 연동 원리를 배운다.
- LineTrace를 활용한 지면 감지 안정화와 Snapping 로직을 통한 착륙 처리 기법을 배운다.
- State Alias와 트랜지션 조건 최적화를 통해 애니메이션 전환 버그를 해결하고 가독성을 높이는 법을 배운다.
🟧 1. C++ Vector 요소 추가 방식 비교
🟦 push_back과 emplace_back의 작동 원리
- push_back은 이미 완성된 객체를 상자에 넣는 것과 같으며, 이미 만들어진 객체를 복사하거나 이동시키는 방식으로 작동함을 배웠다.
- emplace_back은 상자 안에서 객체를 직접 조립하는 것과 같으며, 객체 생성에 필요한 재료만 전달하여 메모리 공간 안에서 직접 생성하는 방식을 배웠다.
| 구분 |
push_back |
emplace_back |
| 비유 |
완성된 선물을 상자에 넣기 |
상자 안에서 선물을 직접 조립하기 |
| 작동 방식 |
객체를 복사 또는 이동 |
재료를 전달하여 현지 생성 |
| 장점 |
전통적이고 익숙한 방식 |
불필요한 복사/이동을 줄여 성능상 유리함 |
🟦 실무에서의 활용 트렌드
- 현대 C++과 언리얼 엔진 등 실무에서는 성능 이득의 가능성이 있는 emplace_back 사용을 권장하는 추세임을 배웠다.
- 이미 만들어진 변수를 넣을 때는 두 방식 모두 복사 생성자를 호출하게 되어 성능 차이가 거의 없으므로 상황에 맞는 선택이 중요함을 배웠다.
- 성능 향상의 핵심은 요소 추가 방식뿐만 아니라 const auto&를 사용해 불필요한 복사본 생성을 막는 것임을 배웠다.
🟧 2. 언리얼 C++와 애니메이션 블루프린트 연동 및 최적화
🟦 C++와 애니메이션 블루프린트(ABP) 간 변수 통신 해결
- C++에서 계산한 데이터가 ABP로 전달되지 않을 때는 Cast 노드 이후의 실행선 연결 상태와 변수 세팅 노드의 흐름을 확인해야 함을 배웠다.
- 변수를 UPROPERTY(BlueprintReadOnly)로 설정하여 노출시키고, ABP 이벤트 그래프에서 하얀색 실행선을 SET 노드들까지 끊김 없이 연결하여 실시간 데이터를 갱신하는 방법을 배웠다.
🟦 지면 감지(LineTrace) 및 착륙 로직 안정화
- LineTrace의 거리가 캡슐 높이와 너무 정확히 일치하면 소수점 오차로 감지에 실패할 수 있으므로, 끝점에 약 10.0f 정도의 여유값을 추가하여 안정성을 높이는 법을 배웠다.
- 하강 중 지면 감지 시 Z축 좌표를 강제로 시작 높이로 고정하는 Snapping 로직을 추가하여 캐릭터의 발이 지면에 정확히 밀착되도록 수정하는 법을 배웠다.
🟦 State Alias를 활용한 애니메이션 전환 최적화
- State Alias 목록에 자기 자신(Fly)이 포함되면 매 프레임 자가 전이가 발생하여 애니메이션이 무한 재시작되는 버그가 생길 수 있음을 배웠다.
- State Alias 설정에서 자기 자신을 제외하여 버그를 방지하고, 개별 트랜지션을 Alias 하나로 통합하여 로직의 가독성을 높이는 최적화 기법을 배웠다.
🟦 비행 및 체공(Hovering) 조건 개선
- 트랜지션 규칙에 속도 조건을 넣으면 공중 정지 시 애니메이션이 풀릴 수 있으므로, 유지 조건을 IsFlying 변수 하나로 단순화하여 속도와 관계없이 날개짓을 유지하는 법을 배웠다.
- C++ 생성자와 ABP 변수 패널에서 초기값을 명확히 설정하여 첫 프레임부터 상태 판단이 정확하게 이루어지도록 초기화하는 법을 배웠다.
🟫 오늘 느낀 점
메모리 최적화를 위한 C++ 문법과 애니메이션 블루프린트의 실무적인 디테일을 조율하며 안정적인 프로젝트 설계의 중요성을 깊이 체감했다.