분류 전체보기 25

비헤이비어 트리로 구현하는 언리얼 엔진 AI

참고 영상: 비헤이비어 트리를 활용한 언리얼 엔진 AI | Unreal Engine KR게임에서 적 캐릭터는 단순히 플레이어를 따라가기만 해서는 자연스럽게 보이지 않는다. 평소에는 주변을 순찰하고, 플레이어를 발견하면 추격하며, 시야에서 놓치면 마지막으로 목격한 장소를 조사해야 한다. 상황에 따라 적절한 엄폐 장소를 선택할 수도 있어야 한다.이러한 여러 행동을 조건문만으로 구현하면 코드가 빠르게 복잡해진다.플레이어를 발견했는가? 발견했다면 추격한다. 발견하지 못했다면 순찰한다.추격 중 플레이어를 놓쳤는가? 놓쳤다면 마지막 위치를 조사한다.공격받았는가? 공격받았다면 공격자를 찾는다.행동이 추가될수록 조건문은 서로 얽히고, 현재 AI가 어떤 판단을 내리고 있는지 확인하기 어려워진다.언리..

배열의 한계를 넘는 연결 리스트: 노드, 포인터, 삽입과 삭제 원리

배열은 같은 자료형의 데이터를 연속된 메모리 공간에 저장한다. 인덱스를 통해 빠르게 접근할 수 있다는 장점이 있지만, 크기가 고정되고 중간 데이터를 삽입하거나 삭제하기 어렵다는 단점도 존재한다.연결 리스트는 각 데이터를 별도의 노드에 저장하고 포인터로 연결한다. 노드들이 메모리에 연속해서 배치될 필요가 없기 때문에 실행 중에 크기를 자유롭게 변경할 수 있다.이 글에서는 코드조선의 Linked List 강의를 바탕으로 연결 리스트의 구조, 동적 메모리 할당, 앞·뒤 삽입, 이중 포인터를 이용한 순회와 삭제, 재귀적인 메모리 해제 원리를 정리한다.1. 배열의 특징과 한계배열은 여러 데이터를 연속된 메모리 공간에 저장한다.int Numbers[4] = {10, 20, 30, 40};메모리에서는 다음과 비슷한 ..

HashSet과 HashMap은 어떻게 빠르게 데이터를 찾을까?

자료구조를 공부하다 보면 HashSet과 HashMap은 데이터를 평균 O(1)의 시간복잡도로 탐색한다고 배운다.배열에서 데이터를 순서대로 찾으면 최악의 경우 모든 데이터를 확인해야 한다. 그런데 해시 자료구조는 데이터가 많아져도 어떻게 원하는 값을 빠르게 찾을 수 있을까?이 글에서는 코드조선의 Hash Set과 Hash Map 강의를 바탕으로 해시 함수, 해시 충돌, 선형 탐사, HashSet과 HashMap의 차이를 정리한다. 강의에서는 C 언어로 단순화한 해시 자료구조를 직접 구현하면서 동작 원리를 설명한다.1. 배열 탐색은 왜 느려질까?다음과 같은 문자열 배열이 있다고 가정한다.const char* names[] = { "Kim", "Lee", "Park", "Choi", ..

재귀함수와 반복문의 시간복잡도, 그리고 출력 순서가 뒤집히는 이유

프로그래밍에서 같은 작업을 여러 번 수행하는 대표적인 방법에는 반복문과 재귀함수가 있다. 반복문은 for, while과 같은 문법을 사용하고, 재귀함수는 함수가 자기 자신을 다시 호출하는 방식으로 동작한다.두 방식은 비슷한 결과를 만들 수 있지만, 실행 과정과 메모리 사용 방식에는 중요한 차이가 있다. 특히 재귀 호출문의 앞과 뒤 중 어디에 출력문을 배치하느냐에 따라 출력 순서가 달라진다.1. 반복문이란 무엇인가반복문은 주어진 조건이 만족되는 동안 특정 코드를 계속 실행하는 문법이다.다음 코드는 3부터 1까지 출력한다.#include int main(void) { for (int i = 3; i >= 1; i--) { printf("%d ", i); } return 0;}실행..

언리얼 엔진의 GAS란 무엇일까?

언리얼 엔진으로 액션 게임이나 RPG를 개발하다 보면 GAS라는 용어를 자주 접하게 됩니다.GAS는 Gameplay Ability System의 약자로, 캐릭터의 스킬과 능력치, 버프 및 디버프 같은 게임플레이 요소를 체계적으로 구현할 수 있도록 언리얼 엔진에서 제공하는 프레임워크입니다.이름만 보면 단순히 캐릭터의 스킬을 만드는 시스템처럼 보이지만, 실제로는 스킬 사용부터 결과 적용까지의 전체적인 흐름을 관리하는 시스템에 가깝습니다.GAS는 왜 필요할까?캐릭터가 화염구를 사용하는 상황을 예로 들어보겠습니다.화염구 스킬 하나를 구현하기 위해서도 생각보다 많은 처리가 필요합니다.현재 마나가 충분한지 확인스킬이 재사용 대기시간 중인지 확인캐릭터가 기절하거나 침묵 상태인지 확인스킬 애니메이션과 이펙트 재생적에게..

[UE5] 장비 슬롯과 숫자 단축키를 데이터 기반 무기 교체 시스템으로 연결하기

기존에는 숫자 키를 누르면 블루프린트에 직접 작성한 RowName으로 무기를 교체했다.1번 키 → AK472번 키 → Bubble3번 키 → Pistol이 방식은 빠르게 기능을 확인하기에는 좋지만, 장비창의 내용이 바뀌어도 단축키가 계속 기존 무기를 장착한다는 문제가 있다.플레이어가 장비 슬롯 1에 어떤 무기를 넣었는지와 관계없이 1번 키가 항상 AK47을 요청하기 때문이다.이번 작업에서는 숫자 키에 특정 무기를 하드코딩하는 대신 다음과 같은 데이터 흐름을 만들었다.숫자 키 입력→ 대응하는 장비 슬롯 선택→ 슬롯의 ItemRowName 확인→ DT_Item에서 아이템 정보 조회→ WeaponRowName 추출→ 캐릭터에게 무기 교체 요청이를 통해 장비창의 상태와 실제 캐릭터의 장착 무기를 연결했다.1. ..

[Unreal Engine 네트워크] HasAuthority()와 IsLocallyControlled()는 무엇이 다른가?

Unreal Engine 멀티플레이를 처음 구현할 때 가장 혼동하기 쉬운 함수가 다음 두 가지다.HasAuthority()IsLocallyControlled()두 함수 모두 “이 코드를 여기서 실행해도 되는가?”를 판단할 때 사용하지만, 확인하는 대상은 완전히 다르다.HasAuthority()는 Actor의 상태를 결정할 권한을 확인한다.IsLocallyControlled()는 Pawn을 현재 컴퓨터에서 직접 조종하는지 확인한다.이 차이를 명확히 이해하지 못하면 다음과 같은 문제가 발생한다.클라이언트에서만 Actor가 사라짐호스트에서는 UI가 보이지만 원격 클라이언트에서는 보이지 않음모든 플레이어 화면에 동일한 UI가 나타남서버와 클라이언트의 Actor 상태가 달라짐리슨 서버에서는 정상인데 전용 서버에서..

[UE5] 애니메이션 문제처럼 보였던 이동 버그를 무기 충돌에서 찾아내기까지

오늘은 캐릭터의 전투 디테일을 개선하면서 다음 기능을 정리했다.권총과 라이플 재장전 애니메이션 분리조준 중 달리기 상태 전환무기 장착 위치 및 트레이서 이펙트 점검이동 중 발생하던 캐릭터 위치 보정 현상 해결애니메이션 노티파이를 이용한 발소리 구현사망 몽타주 이후 캐릭터 숨김 및 결과 UI 연결결과 UI 종료 후 기존 GameMode 리스폰 흐름 유지단순히 기능을 추가하는 작업보다, 서로 다른 시스템이 영향을 주면서 발생한 문제의 원인을 추적하는 과정이 핵심이었다.1. 아래를 조준하면 캐릭터가 뒤로 가속되는 현상문제 상황캐릭터가 아래를 조준한 상태에서 전진 입력을 하면 다음 현상이 발생했다.전진 키를 눌렀는데 캐릭터가 뒤로 이동일반적인 이동 속도보다 훨씬 빠르게 밀림재장전 중 이동하면 원래 위치로 돌아가..

UE5 멀티플레이 캐릭터 전투 애니메이션과 무기 전환 타이밍 개선

오늘은 이미 구현된 데이터 테이블 기반 무기 시스템 위에 캐릭터 전투 애니메이션을 연결하고, 캐릭터 상태와 실제 게임 로직이 불일치하는 문제를 개선했다.주요 작업은 다음과 같다.Rifle/Pistol 무기 타입별 발사 몽타주 분리조준 상태에서 발사 반동이 사라지는 AnimGraph 문제 해결달리기 중 발사를 서버에서 차단달리기 중 조준 시 걷기 상태로 전환무기 교체 시점을 몽타주 노티파이와 동기화Aim Offset의 극단적인 Pitch로 인한 팔 관절 왜곡 방지1. 무기 타입별 발사 몽타주 분리기존 무기 시스템은 FWeaponData의 EWeaponType을 통해 현재 무기가 Rifle인지 Pistol인지 구분할 수 있었다.따라서 무기 클래스에 애니메이션 정보를 중복으로 넣지 않고, 캐릭터가 무기 타입에..

Hitscan 판정은 즉시, 총알은 보이게: UE5 Niagara 기반 네트워크 트레이서 구현기

1. 문제 정의기존 무기 시스템에는 이미 다음 기능이 구현돼 있었다.카메라 기준 라인트레이스총구 기준 보정 트레이스서버 권한 데미지 처리연사 및 재장전데이터테이블 기반 무기 설정하지만 발사 판정만 존재하고 시각적인 탄환 이동이 없어, 총을 쏘면 대상이 즉시 피격되는 느낌만 났다.단순 Projectile Actor를 추가하면 구현은 직관적이지만, 기존 Hitscan 판정 구조를 다시 설계해야 하고 네트워크에서 Projectile 위치까지 복제해야 한다. 따라서 판정과 연출을 분리했다.서버: Hitscan으로 즉시 판정 및 데미지 처리클라이언트: Niagara로 총알이 이동하는 시각적 트레이서 재생이 구조의 핵심은 Niagara가 실제 판정을 담당하지 않는다는 점이다. 시각적 탄환이 아직 날아가는 중이어도 ..