분류 전체보기 55

AI 적 만들어보기 (2) - Unreal Engine(C++)

저번 시간에 AI 의 캐릭터를 만들어 특정 범위 안에서 계속 움직이게 만드는 로직을 만들고 실험해 보았다. 오늘은 AI 의 시야 안에 플레이어가 있으면 쫒아오는 로직을 만들어 볼 것이다.  놀랍게도 이런 로직은 이미 Unreal Engine 에서 제공해 준다! Perception System 이 AI 가 플레이어를 감지하게 만들어 주는 것인데 이 모듈을 NPC 컨트롤러에 심어준다면 특정 대상을 인식하고 그에 맞추어 Behavior Tree 를 이용해 행동이 가능하게 만들어 준다. 그럼 처음부터 만들어 보자.  전에는 AI 의 애니메이션을 만드는데 까지 진행하였다. 오늘 처음 할 일은 전에 만들었던 FindRandomLocation Task 와 비슷한 동작을 하는 FindPlayerLocation Task..

AI 적 만들어보기(1) - Unreal Engine(C++)

캐릭터가 움직이거나 아이템들을 만들고 웨이브를 관리하는 등 여러 작업들을 해보았다. 그러나 게임의 꽃인 AI 즉, 적을 만들어본 적은 아직 없었다. 그래서 이번에는 AI 를 만들고 정해진 범위 안을 돌아다니게 해볼 것 이다. 최종적인 목표는 플레이어를 공격하거나 탐색하는 적 AI 를 만들어 게임을 더 실감나게 만들어 보자.  Unreal Engine 에는 인공지능을 위한 BehaviorTree 와 BlackBoard 라는 기능이 있다. 각각의 기능을 잠시 살펴보자.Behavior Tree (행동 트리) Behavior Tree 는 AI 캐릭터의 행동을 트리 구조로 표현하는 방법이다. 각 노드는 특정 행동이나 조건을 나타내며, 트리의 흐름에 따라 AI 의 행동이 결정된다. Behavior Tree 는 다음..

[TroubleShooting]GetWorldTimeManager() - UnrealEngine

바로 전날 GetWorldTimeManager 에 대해 알아보았다. 정확히는 내 언리얼 프로젝트에서 이와 관련된 오류가 발견되어 더 깊게 알아보고자 정리한 것이었다. 오늘은 내 프로젝트에 어떤 오류가 있었고 어떻게 해결했는지 적어보겠다. 문제 상황 MineItem 이라는 클래스에서 ActivateItem 함수에 GerWorldTImeManger 을 이용해 1.7 초 뒤 이 엑터가 Destroy 되며 데미지를 주는 로직을 짰고 이는 잘 작동했다. 그러나 내 프로젝트에서는 웨이브가 끝나면 다음 레벨로 바로 넘어가지기에 웨이브가 끝나기 직전 MineItem 이 Activate 되었으면 갑자기 바뀐 World 에 의해 MineItem 이 존재하지 않게 되는 거였다!그러나 MineItem 은 GetWorldTim..

GetWorldTimerManager() - Unreal Engine

C++ 로 코딩하면 어려운점이 많다. 나는 이 GetWorldTimerManager() 를 사용할 때마다 아주 머리가 아팠다. 블루프린트 에서는 이 노드가 3초 뒤에 실행 되었으면 좋겠는데? 싶으면 그냥 Delay 노드를 사용해 3초를 주면 되었는데 C++ 상에서 코드가 3초 뒤에 실행 되게 하려면 Tick() 에 코딩을 짜 Delta Time을 더해주거나 이 GetWorldTimerManager() 를 사용하는 방법이 있다. 전자는 너무 비효율 적이라 패스 하고 오늘은 GetWorldTimerManager() 에 대해 알아보겠다. GetWorldTimerManager() 란?GetWorldTimerManager 는 현재 월드의 타이머 관리자(TimerManager) 를 반환하는 함수이다. 타이머 관리자..

Unreal 2025.02.13

데이터 테이블 - Unreal Engine

JSON 또는 CSV 를 사용해 본적 있는가? 이 둘의 공통점으로는 데이터 테이블로 사용이 가능하다는 점이다. 언리얼 엔진에도 이와 비슷한 역할을 수행하는 구조체를 만들 수 있다. 그 전에 데이터 테이블이 무엇인가? 데이터 테이블이란? 데이터 테이블은 데이터를 행과 열로 구성하여 정리한 표 형태의 자료 구조이다. 주로 데이터베이스, 스프레드 시트, 통계 분석 프로그램 등 다양한 분야에서 데이터를 효율적으로 관리하고 분석하기 위해 사용된다. (우리가 자주 쓰는 엑셀, 즉 CSV 같은 느낌이라고 생각하자.)  구성 요소로는 행 (Row), 열 (Column), 셀 (Cell) 로 나누어져 있다. 간단한 예시를 통해 보여주겠다.  상품명연도판매량1초코바20231202아이스크림2023803아이스크림2021160..

Unreal 2025.02.11

const 에 대하여 - C++ (Unreal 조금)

가끔 코딩을 해야하면 const 를 사용해야 할 때가 있다. 기본적으로 const 는 상수라는 것을 알고 있을 것이다. 그런데 이거 왜쓰는걸까?  일단 C++ 에서 상수란 변하지 않는 수를 의미한다. 여기서 변하지 않는 수란 프로그램 실행중에 여기에 저장된 내용은 바뀌어선 안된다는 의미 이기도 하다. 아직 코딩 할 때 수가 바뀌지 않는다는 개념이 어렵기에 언제 어디에 써야할지 잘 모르겠어서 이번 주제를 선택하였다. const 의 장점, 자료형에서의 const 사용, 함수에서의 const 사용 순으로 진행하겠다.  const 사용 이유 언제나 그랬듯이 첫 이유는 코드의 가독성 및 유지보수성을 향상하기 위함이다. 대체 const 하나 쓴다고 왜 코드의 가독성이 향상이 되는가? 그 이유는 const 의 사용 ..

C++ 2025.02.10

인터페이스와 상속 - C++

코딩을 하면서 너무나도 당연하게 생각했지만 다시 돌아보니 조금 이상한 점이 보였다. 인터페이스와 상속은 뭐가 다른거지? 보기에는 둘다 누군가의 부모 클래스 처럼 보이기도 하고 상속 받은 자식 클래스들이 가져다 쓰는 것도 비슷하게 보인다. 이 둘의 차이점과 특징, 쓰임새를 알아보기 위해 일단 둘의 정의를 알아보고 시작하겠다.  인터페이스(Interface) 인터페이스란 객체들이 서로 상호작용하는 방법을 정의하는 규약이다. 그리고 추상 메서드로만 구성된다.  추상 메서드란 또 뭔가?  추상 메서드는 구현이 없는 함수로 C++ 에서는 virtual 키워드와 마지막에 = 0; 을 붙이는 것으로 끝난다. 가상 함수라고도 불리며 자식 클래스에서 재정의(override) 될 수 있다. 예를 들어보자. class In..

C++ 2025.02.07

AnimationBlueprint 를 이용해 캐릭터의 움직임을 표현해보기 - Unreal Engine

저번에 캐릭터를 C++ 을 통해 움직이거나 마우스로 캐릭터를 조종하는 방법을 알아보았다. 그러나 언제까지고 캐릭터가 멈춰선 채로 움직이는 것을 볼 수 없다. 이제부터 캐릭터에게 생동감을 보여줄 애니메이션을 넣어보도록 하자.  일단 Unreal Engine 에는 AnimationBluePrint 라는게 존재한다. 편의상 ABP 로 줄여보도록 하겠다. 이는 특정 스켈레탈 매시에 대해 움직임을 적용시켜주는 블루프린트이다. ABP 는 생성 시, 스켈레톤 (Skeletion)과 부모 클래스를 선택해야하는데 이때 스켈레탈 매시는 원하는 것으로 지정해주고 그 뒤 Parent Class (부모 클래스) 는 보통 AnimInstance 를 선택해준다.  나는 저번에 만들었던 캐릭터의 스켈레탈 매시를 선택하겠다.  이름은..

Unreal 2025.02.06

향상된 for 문(Enhanced for loop) - C++

for문은 C언어에서 아주 많이 쓰이는 반복문이다. 오늘 배울 것은 향상된 for 문 또는 범위 기반 for 문(Range-based for loop) 기능이다. 이는 C++11표준에 추가된 기능으로 배열이나 컨테이너의 모든 요소를 순회하는 데 더 편리하고 간결한 방법을 제공한다. 향상된 for 문의 형태 for (요소_타입 변수명 : 컨테이너) { // 코드 블록} 요소_타입은 컨테이너 요소의 데이터 타입이다. 만약 컨테이너가 vector 면 요소_타입 또한 vector 로 설정해주어야 한다. 그러나 string 일 경우 char 로도 치환이 가능하다.  변수명은 자신이 붙이는 이름으로 for 문의 for(int i = 0 ; i   컨테이너는 순회할 배열 또는 컨테이너를 의미한다.   일단 어떤 형..

C++ 2025.02.04

C++로 3인칭 캐릭터 움직여보기 (3) - Unreal Engine

전 시간에는 Enhanced Input 을 이용하여 Input Action 들을 만들어 Input Mapping Context 에 집어 넣고 그것을 게임모드에 적용하는 것 까지 하였다. 그렇다면 오늘은 집ㅈ전 시간에는 Enhanced Input 을 이용하여 Input Action 들을 만들어 Input Mapping Context 에 집어 넣고 그것을 게임모드에 적용하는 것 까지 하였다. 그렇다면 오늘은 캐릭터를 움직이는 코드를 짜 보겠다.  원래는 편의상 이미 만들어진 코드인 AddMovementInput, AddControllerYawInput 그리고 AddControllerPitchInput 를 사용하려 하였다. 그러나 처음 만들 때에는 정확한 원리를 알고 어떻게 움직이는지 알아보는게 좋겠다 생각하..

Unreal 2025.02.03