분류 전체보기 113

[언리얼 엔진 5] 리플렉션 시스템

리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내 다수의 시스템의 기반이 되는 시스템이다. 언리얼 엔진 내에서는 그래픽 용어와 구분짓기 위해서 프로퍼티 시스템이라고 부르기도 한다. 클래스 / 변수 / 함수에 리플렉션 매크로를 붙여주면 해당하는 리플렉션 객체가 생성되는데, 각 매크로마다 어떤 객체가 생성되는 지는 다음과 같다.UCLASS (리플렉션되는 클래스임을 의미)UCLASS 매크로를 붙여준 클래스는 해당 클래스를 설명하는 UClass 객체가 런타임에 생성된다.해당 UClass 인스턴스가 곧 CDO와 같다.또한 각 UCLASS 인스턴스는 자신의 부모 클래스를 가리키..

[언리얼 엔진 5] 가비지 컬렉션(+유니티와의 차이), 스마트 포인터

C++에는 가비지 컬렉션 기능이 없기 때문에, 언리얼 엔진에서는 이를 자체적으로 만들어 사용한다. 가비지 컬렉션은 리플렉션 시스템에 의존하는 엔진 내 기능 중 하나이다.리플렉션 시스템에 대해 자세한 내용은 https://ciel45.tistory.com/127 [언리얼 엔진 5] 리플렉션 시스템리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내ciel45.tistory.com 가비지 컬렉션이란?우리가 C++로 동적 할당을 사용할 때 new, delete를 사용하는데, 실수로 사용하지 않는 객체에 delete를 안하면 메모리 누수가 발생한다.또한 실수로 사용 중인 객체를..

[언리얼 엔진 5] Retriggerable Delay 사용법 (FLatentActionInfo)

게임 로직을 구성할 때, 특정 조건으로 인해 이벤트가 트리거되고, 일정 시간 동안 해당 조건이 발생하지 않아야 이벤트가 종료되어야 하는 상황이 있을 수 있다. 예를 들자면, FPS / TPS 게임에서 적에게 피격당했을 시 데미지 방향 표시기가 나타나는데, 일정 시간 동안 추가적인 공격을 받지 않아야 표시기가 페이드 아웃되어 사라지고, 그 전에 추가 공격을 받을 시 표시기가 업데이트된다. 아래는 프로젝트 내에서 해당 로직을 사용한 상황이다.https://ciel45.tistory.com/62 블루아카이브 TPS게임 개발일지 (45) - 피격 방향 표시기 구현 2이제 이 표시기가 피격 시 화면에 떠야 한다. 맞을 때마다 일일히 화면에 띄워주고, 없애주기 귀찮아 약간의 꼼수를 썼다. 사실은 항상 화면에 떠있는..

[OpenGL] Normal Transformation (Normal Matrix)

Phong Reflection Model을 통한 쉐이딩을 위해서는 물체의 표면의 normal을 구해야 한다.이 때의 normal은 World Space(월드 좌표계) 기준이어야 한다. 쉐이딩은 World Space에서 처리할 것이기 때문. 위치나 벡터를 Object Space에서 World Space로 변환하는 방법은 Model Matrix를 곱하는 것이고, normal 역시 uniform scaling(x, y, z 축으로 같은 비율로 scaling)일 경우에는 그냥 Model Matrix를 곱하면 된다. 다만, non-uniform scaling을 수행하는 Model Matrix의 경우 그냥 곱하면 normal에 왜곡이 발생한다. 위 이미지의 경우처럼 x축으로 늘리고 y축으로 찌그러뜨리는 scal..

OpenGL/공부 2025.04.15

[OpenGL] 게임 엔진 개발 (10) - Terrain Collision

플레이어가 이동할 수 있게 되었으므로, 터레인 위에서 자연스럽게 움직일 수 있도록 플레이어와 터레인 간 콜리전을 구현해볼 것이다. 사실 Player 클래스에는 이미 관련 코드가 짜여져 있다.bool Player::Move(float deltaTime, Terrain* terrain){ // 회전 GLfloat* currRot = model->GetRotate(); float rotation = currTurnSpeed * deltaTime; float newRotY = currRot[1] + rotation; // new rotY if(newRotY > 180) newRotY -= 360.f; if (newRotY SetRotate(newRot); // 이동 GLfloat* currPos = model..

[OpenGL] 게임 엔진 개발 (9) - 플레이어 이동

참조 : https://www.youtube.com/watch?v=d-kuzyCkjoQ&pp=ygURb3BlbmdsIHBsYWVyIG1vdmU%3D 지금까지 플레이어 모델이 항상 A포즈로 서있기만 했는데, 이제 조작을 통해 맵 위로 다닐 수 있도록 할 것이다. 우선 Player 클래스를 새로 만들었다. Player.h#pragma once#include "glm/glm.hpp"class Model;class Terrain;class Player{public: Player(Model* model); void HandleInput(bool* keys, float deltaTime); bool Move(float deltaTime, Terrain* terrain); float GetRotY(); Model*..

[OpenGL] 게임 엔진 개발 (8) - Terrain

참조 : https://learnopengl.com/Guest-Articles/2021/Tessellation/Tessellation LearnOpenGL - TessellationTessellation Guest-Articles/2021/Tessellation/Tessellation Tessellation Chapter II: Rendering Terrain using Tessellation Shaders & Dynamic Levels of Detail In order to complete this chapter, you will need to be able to create an OpenGL 4.0+ context. This slearnopengl.comlearnopengl.com에 테셀레이션을 활용..

[OpenGL] 게임 엔진 개발 (7) - Normal Mapping

이번엔 Normal Mapping을 추가해보았다. Normal Mapping이란, 버텍스를 늘리지 않으면서 표면의 복잡성을 취하는 기술이다. 생각해보면, 우리가 처음 텍스쳐를 쓴 이유도 물체 표면의 컬러의 복잡함을 구현하기 위해 버텍스를 여러개 쓰기보다는, 그걸 텍스쳐라는 독립적인 자료구조에 저장하기 위한 것이었다. Normal Map도 이와 똑같다. 다만, 텍스쳐라는 자료구조에 저장하는 것이 컬러 정보가 아닌 normal 정보인 것이다. Normal Mapping의 가장 대표적인 예시이다. 고전적인 방식대로 우측의 결과물을 구현하고자 한다면, 벽돌이 들어가고 나오는 부분마다 버텍스를 포지션을 달리해서 왕창 심어줘야 했겠지만, normal map의 사용을 통해 기존과 마찬가지로 버텍스 4개만 사용하고도 ..

[OpenGL] 게임 엔진 개발 (6) - Scene Hierarchy

전체 소스코드:https://github.com/sys010611/YsEngine  씬에 배치될 게 더 많아지기 전에 Scene Hierarchy 창을 간단하게 만들어보았다. UI 작업에 들어가기 전, 게임 오브젝트들(Model, Light 등)을 한꺼번에 다루는 클래스가 있어야겠다는 생각이 들었다.게임 오브젝트들을 다루는 다른 클래스들은 최대한 해당 클래스에만 의존하도록 하고 싶다. (DIP) DIP에 대한 자세한 내용은https://ciel45.tistory.com/22 [UE5] 블루아카이브 TPS게임 개발일지 (10) - 사격 기능 구현 준비 작업 + DIP사격 애니메이션까지는 만들어 두었으므로, 실제로 총이 발사되는 메커니즘을 만들고자 한다. 우선 발사를 구현하는 데에는 두가지 방법이 있다. 라..