일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 복사대입연산자
- 배열
- Unreal
- effectivec++
- 프로그래밍
- 언리얼엔진5
- cpp개발
- Unreal Engine
- AI
- C언어
- 게임 개발
- 데이터구조
- CPP
- 복사생성자
- 언리얼5
- 게임개발
- Unreal Engine5
- 생성자
- 소멸자
- BehaviorTree
- 프로세스
- 게임프로그래밍패턴
- 포인터
- 언리얼엔진
- 언리얼 엔진5
- UE5
- 디자인패턴
- 언리얼
- 자료구조
- C++
- Today
- Total
목록게임개발 (12)
리얼 개발

액터의 특성 컴포넌트를 조작하는 섹터 · 액터게임은 수많은 오브젝트로 구성된다. 플레이어가 직접 조작하는 캐릭터, 상대하는 몬스터, 배치된 구조물, 벽, 바닥, 획득할 수 있는 아이템 등 모든 요소들이 고유의 특징을 가지고 있다. 이러한 게임에 배치할 수 있는 모든 오브젝트를 언리얼 엔진에선 '액터'라고 하며, 단어 그대로 게임 월드의 특정 공간에서 자신에게 주어진 역할을 수행하는 요소이다.이러한 액터의 주요 기능은 크게 세 가지로 나눌 수 있다.시각적 기능 : 플레이어에게 어떻게 보여질 것인가?물리적 기능 : 액터의 이동과 액터들 간의 상호 동작을 어떻게 할 것인가?움직임 : 액터가 어떤 움직임을 가질 것인가?모든 액터가 위 세 가지 기능 전체를 적극적으로 활용하는 것은 아니다. 구조물이나 맵 자체를 ..

전 포스팅에서 AI 적을 만드는 것에 대한 간단한 이야기를 했는데, 이번에는 이를 바탕으로 몬스터의 공격과 스킬 등을 구현해보겠다. BT 클래스Behavior Tree 클래스마다 구현해야 하는 가상 함수들이 있다. UBTTaskclass UBTTaskNode{ GENERATED_BODY()protected: virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;}; UBTServiceclass UBTService{ GENERATED_BODY()protected: virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8*..

게임에는 여러 종류의 AI들이 등장한다. 롤의 봇, RPG 장르의 몬스터들 등등나는 파크라이 시리즈를 즐겨했는데, 그때 당시에는 적 AI들이 멍청해서 왜 이렇게밖에 못 만들지라는 생각을 하기도 했는데 막상 내가 해보니 쉽지않다;;; Behavior Tree 개념언리얼 엔진에서는 AI 적을 만들때 Behavior Tree (행동트리)라는 기능을 제공한다. 이를 알아보자.먼저 공식문서에 대한 설명이다.- Behavior Tree 는 본질적으로 AI의 프로세서로서, 각종 결정을 내리고 그 결과를 바탕으로 다양한 분기를 실행할 수 있다.- Blackboard 에셋은 AI의 두뇌로 생각할 수 있으며, Behavior 트리가 결정을 내리는데 사용하는 키(Key) 값을 저장한다. 이 두개는 언리얼 엔진 에디터의 ..

특정 구역에 들어가면 캐릭터가 아이템을 획득할 수 있게 만들어보자. 우선 ItemBox 라는 클래스를 만들어 우리가 들어갔을 때 반응할 액터를 만들자.public: // Sets default values for this actor's properties AItemBox();protected: virtual void BeginPlay() override;public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Box") TObjectPtr Trigger; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Box") TObjectPtr Mesh; UPROPERTY(EditAnywhere, Blue..
관찰자 패턴객체 사이에 일 대 다의 의존 관계를 정의해두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 업데이트 될 수 있게 만듭니다. 오늘날에 모델-뷰-컨트롤러 (MVC) 패턴은 아주 많이 사용되고 있다. 그 기반에는 관찰자 패턴이 있다. 업적 달성업적 시스템을 추가한다고 해보자. ‘다리에서 떨어지기’ 업적같은 경우 물리 엔진 코드 한 가운데서 업적 달성 코드를 실행해야 할 것이다. 특정 기능을 담당하는 코드는 항상 한데 모아놓는게 좋다. 그럼 업적 코드들이 모아져 있고, 커플링되지 않게 하려면 어떻게 해야할까? 답은 관찰자 패턴을 적용하면 된다. 관찰자 패턴을 적용하면 누가 받든 상관없이 알림을 보낼 수 있다. 다음과 같이 코드로 표현할 수 있다..
경량 패턴공유를 통해 많은 수의 소립 객체들을 효과적으로 지원합니다. (GoF 본문 설명) 웅장한 숲과 하늘 위로 솟아오른 수많은 노송들, 잎은 스테인드글라스 창처럼 햇빛을 산란시켜 황금빛 기둥을 만든다. 판타지 게임에서 흔히 볼 수 있는 설정이며, 일반적으로 이런 장면은 경량 패턴으로 종종 구현한다. 숲에 들어가는 나무들구비구비 뻗어 있는 숲을 글로는 몇 문장으로 표현할 수 있지만, 실시간 게임으로 구현하는 것은 전혀 다른 얘기다. 우리가 나무들이 화면을 가득 채운 빽빽한 숲을 볼 때, 그래픽스 프로그래머는 1초에 60번씩 GPU에 전달해야 하는 몇백만 개의 폴리곤을 본다. 수천 그루가 넘는 나무마다 각각 수천 폴리곤의 형태로 표현해야 한다. 설사 메모리가 충분하다고 해도, 이런 숲을 그리기 위해서는 ..
이 카테고리는 "로버트 나이스트롬"의 "게임 프로그래밍 패턴"을 보고 개인적으로 필요하다고 생각되는 내용을 요약한 글입니다. 패턴의 개념이란?패턴은 오랫동안 정형화되고 축적된 경험을 추상화한 지식 단위이다. 여러 사람이 공유하는 개념이기 때문에 패턴 이름만으로도 많은 정보를 한 번에 정확하게 전달할 수 있다.해당 책의 요지“GoF의 디자인 패턴”에 나오는 패턴들 중 저자가 실제 게임을 제작하며 썼던 패턴들을 소개해주고 있으며 딱딱한 ‘직원 정보’, ‘은행 계좌’가 아닌 ‘몬스터’, ‘업적’ 같은 것들을 예제 삼아 패턴을 설명하고 있다. 또한 이 책 어디에도 3D 그래픽스에 필요한 선형대수나 게임 물리에 필요한 미적분 내용은 나오지 않는다. AI의 탐색 트리에서 알파-베타 가지치키를 하는 방법이나, 오디오..

먼저 Enhanced Input 플러그인과 프로젝트 설정에 Enhanced Input이 설정되어 있어야 한다. 마지막으로 Build.cs 소스 파일에 EnhancedInput 모듈을 추가해주면 준비가 끝난다. Input Action과 Input Mapping Context 데이터 애셋 추가사용자 입력을 받을 Input Action 데이터 애셋과 Input Action을 연결해줄 Input Mapping Context를 추가한다.컨텐츠 브라우저 창에서 우클릭으로 추가할 수 있다. 생성한 애셋들을 C++와 연결해야 한다. C++로 움직임 구현//캐릭터 클래스의 헤더파일#include "InputActionValue.h" //해당 헤더파일 필요public: UPROPERTY(EditAnywhere, Blue..

라인 트레이스를 통해 언리얼 엔진에서 물체 잡기를 구현해보는 연습이다. Line Trace 게임 세계에서 두 지점 사이에 어떤 물체가 있는지 확인할 수 있는 한가지 방법이다. 라인 트레이스는 특정 물체를 감지할 수 있는데 그것을 "트레이스 채널" 을 통해 감지할 수 있다. 필터와 같이 걸러내고 싶은 물체를 걸러낸다고 생각하면 된다. - Visibility보이는 물체를 확인하기 위해 라인트레이스를 사용할 경우 Visibility 트레이스 채널을 사용하면된다.플레이어 이동을 막기위한 투명벽 같은 경우에는 Visibility 트레이스와 충돌하지 않음. - Pawn 게임 세계를 이동할 수 있는 폰을 확인하기 위해 라인트레이스를 시행하는 경우 Pawn 트레이스 채널과 충돌한다. Visiblility, Pawn과..

저번 포스팅에서 첫 C++ 프로그램을 만들어 보았다. 하지만 화면에 글자만 출력하는 것으로는 진짜 프로그램이라고 말할 수 없다. 프로그램에 기능을 추가하기 위해 기본적으로 데이터가 존재해야한다. (계산기에서 계산 숫자를 보여줘야 하는것처럼) 우리가 C++ 에서 다룰 수 있는 데이터는 변수, 상수, 사용자 정의 등 다양하다. 이 중에 변수에 대해 알아보겠다. 변수는 타입(int) 과 이름(count) 가 존재한다. 그럼 count 변수는 어디에 저장되야 할까? 정답은 메모리이다. 윈도우와 같은 운영체제가 메모리를 독점하고 있다. 이때 우리가 변수를 선언하면 운영체제에게서 변수 타입의 크기만큼 공간을 받을 수 있다. 그 메모리 주소를 위 프로그램에선 "count" 라는 별명으로 부르는 것이다. 이렇게 메..