UnrealEngine
-
Reflection, Garbage Collection
Refection 프로그램이 런타임에 자기 자신을 조사하는 기능 기본 C++는 리플렉션을 지원하지 않음 언리얼엔진은 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 정보를 수집하는 별도의 리플렉션 시스템이 구축되어있음. 프로퍼티 시스템이라고 함. 어떠한 클래스, 구조체, 함수, 변수, 열거형 정보를 리플렉션에 추가하려면 특수한 주석(매크로)를 달아줘야함. 이러한 주석이 달린 정보들은 UHT(Unreal Header Tool)가 프로젝트를 컴파일 할 때 해당 정보를 수집함. https://www.unrealengine.com/ko/blog/unreal-property-system-reflection 언리얼 프로퍼티 시스템 (리플렉션) 리플렉션(Reflection)은 프로그램이 실행시간에 자기..
-
Unreal Interface
무기의 오버랩 이벤트가 발동할때 오버랩된 액터의 GetHit이라는 함수를 호출하여 오버랩에 반응하도록 하고싶다고 가정해보자. 이럴땐 적 C++ 클래스에 GetHit이라는 함수를 추가해서 무기의 오버랩 이벤트가 발동될때 오버랩된 액터의 GetHit 함수를 호출하면 된다. 그런데 이벤트가 단순히 적 C++ 클래스에 한정하여 작동되는 것이 아니라 부서지는 오브젝트, 고정된 오브젝트, 발사체 등 여러가지 C++ 클래스에 대해서 작동하도록 해야할땐 어떻게 해야할까? 이렇게 유사성이 없는 클래스에 대하여 특정 게임 기능 함수를 공유시키고 싶을때 인터페이스를 사용한다. 인터페이스(Interface)는 특정 기능을 구현할 것을 약속한 추상 형식이다. Java나 C#같은 다른 OOP 언어에선 인터페이스 형식을 따로 제공..
-
IK 릭 애니메이션 리타기팅
애니메이션은 특정 스켈레톤을 기반으로 동작하게 된다. 같은 스켈레톤을 공유하지만 비율이 다른 캐릭터들에게 애니메이션이 자연스럽게 적용되도록 하는 애니메이션 리타기팅 기술이 존재했지만 언리얼 엔진 5에선 아예 다른 스켈레탈 메시 간에 애니메이션을 리타기팅 할 수 있는 'IK 릭 애니메이션 리타기팅' 기술이 생겼다. IK 릭 애니메이션 리타기팅은 두 스켈레탈 메시의 'IK 릭' 파일과 'IK 리타기팅' 파일이 필요하다. 특정 스켈레탈 메시의 IK 릭 파일을 생성하면 다음과 같이 계층구조가 나온다. 리타깃 루트를 설정해줘야 하는데 이 때 루트본이 아닌 골반(Pelvis)본을 리타깃 루트로 설정해준다. 그리고 두 스켈레탈 메시가 연동될 리타깃 체인들을 지정해 주면 된다. 계층구조에서 본을 다중 선택한 다음 '선..
-
Delegate
디자인 패턴에서 관찰자 패턴(Observer Pattern)이라는 것이 있다. 관찰자 패턴은 발행자(Subject)와 관찰자(Observer)가 존재하고 발행자는 관찰자에 대한 목록을 갖고있고 관찰자는 각각 Callback() 함수를 갖고있다. 이때 발행자가 특정 이벤트를 발생했을때 관찰자들의 Callback 함수가 호출되게 하는 것이 관찰자 패턴이다. 관찰자 패턴을 사용하는 이유는 종속성이 없는 일대다 관계를 만들 수 있기 때문이다. 발행자는 관찰자에 대해 알 필요도 없고 관찰자가 몇 명이 있는지 미리 알아야 할 필요도 없다. 발행자는 단지 특정 이벤트를 발생시킬 뿐이고 관찰자가 발행자의 리스트에 자신을 추가하고 이벤트에 대한 응답으로 Callback 함수를 호출하는 것이다. 언리얼 엔진도 델리게이트(..
-
Unreal Foot IK
https://djgameprogramming.tistory.com/84 IK(Inverse Kinematic, 역운동학) 스켈레톤을 사용한 애니메이션에는 '운동역학'이라는 개념이 존재한다. 모델에 리깅(Rigging, 3D 모델링에 뼈대를 할당하여 움직이게 함)을 하여 관절부 움직임을 묘사할때 역학관계 계산이 필요 djgameprogramming.tistory.com Foot IK를 구현하기 위한 단계는 다음과 같다. 먼저 컨트롤 릭 파일을 생성하고 적용할 스켈레톤의 본 계층구조를 불러온다. 이때 IK로 사용할만한 가상 본이 없다면 직접 생성한다.(Root 가상본 -> 양 발의 가상본) 1. 각 발(IK 가상본)에서부터 아래방향으로 스피어 트레이스를 하여 지면까지의 거리를 계산 2. 1항에서 계산된 지..
-
IK(Inverse Kinematic, 역운동학)
스켈레톤을 사용한 애니메이션에는 '운동역학'이라는 개념이 존재한다. 모델에 리깅(Rigging, 3D 모델링에 뼈대를 할당하여 움직이게 함)을 하여 관절부 움직임을 묘사할때 역학관계 계산이 필요한데 이러한 것을 '애니메이션 운동역학'이라고 한다. 애니메이션의 운동역학은 FK(Forward Kinematics), IK(Inverse Kinematic) 2가지가 존재한다. FK는 로테이션의 값들을 도달해야하는 위치로 바꿔주는 방법이다. 본에 로테이션을 직접 적용하는 것을 생각하면 된다. IK는 이름에서 알 수 있듯이 FK의 반대이다. 관절 체인이 마지막에 도달해야 하는 지점인 엔드 이펙터(End Effector)를 도출한다. 이러한 엔드 이펙터를 기준으로 관절들의 로테이션 값을 바꿔주는게 IK(역운동학)다...
-
Enhanced Input(향상된 입력)
https://docs.unrealengine.com/5.0/ko/enhanced-input-in-unreal-engine/ 향상된 입력 향상된 입력 플러그인 개요 docs.unrealengine.com 언리얼 5.1 버전부터 기존 입력방법 대신 Enhanced Input(향상된 입력)방법이 적용되었다. 기존의 입력 방법은 프로젝트 세팅에서 축, 액션 매핑에 대한 키를 설정하여 클래스에서 각 매핑에 함수를 바인딩하여 동작을 구현하는 방법이었다면 향상된 입력은 값의 출력을 담당하는 '입력 액션'과 입력 액션을 특정 키에 바인딩해주는 '입력 매핑 컨텍스트'로 과정을 나누어서 보다 다양한 상황에서 통용되는 범용적인 동작방법을 디자인 할 수 있도록 설계되었다. 입력 액션은 동작에 해당되는 함수와 바인딩 되어서 ..
-
Class Default Object
UClass에는 모든 언리얼 오브젝트에 대하여 각 클래스 계층 구조 정보, 멤버 변수와 함수에 대한 정보를 모두 기록한다. 리플렉션(프로퍼티 시스템)에서 언리얼 헤더 툴이 클래스에 대한 정보를 수집한다고 하였는데 이렇게 수집된 메타 정보를 UClass에 보관되게 되는 것. 컴파일 단계에서 오브젝트마다 UClass가 생성된다면 런타임 단계에선 오브젝트마다 클래스 정보와 함께 특정 인스턴스가 생성되는데 이것을 Class Default Object(CDO)라고 함. CDO는 클래스에 대한 기본(디폴트) 정보가 담겨있는 인스턴스로 클래스 생성자를 통해 최초로 한 번만 할당된다. 해당 클래스를 사용한 오브젝트를 생성할 때 마다 클래스를 초기화시키지 않고 CDO를 복제하는 방법을 사용함. (런타임에서 특정 클래스의..
C++
-
데이터베이스
데이터베이스는 조직의 운영에 필요한 데이터들을 여러 사용자들이 공유하고 접근할 수 있도록 만든 데이터의 집합이다. 데이터를 조직적으로 통합하여 중복을 최소화하고 데이터들을 구조화하여 저장한다. 통합 데이터(Intergrated Data) 데이터 베이스는 여러 개의 연관된 데이터를 하나로 통합하여 저장, 관리한다. 이러한 방법으로 데이터의 중복을 최소화하고 일관성을 유지시킨다. 저장 데이터(Stored Data) 데이터베이스는 디스크, 메모리같은 컴퓨터가 접근할 수 있는 저장 매체에 데이터를 저장한다. 운영 데이터(Operational Data) 데이터베이스는 조직의 운영에 필요한 데이터를 포함한다. 공용 데이터(Shared Data) 데이터베이스는 여러 사용자 또는 응용 프로그램이 동시에 데이터에 접근하..
-
해시 테이블, 해시 함수
해시 테이블 데이터를 Key, Value 조합으로 관리하는 비선형적 자료구조. 해시 함수를 사용하여 각 Key를 해시 값으로 변환하고, 해시 값을 인덱스로 사용하여 해시 테이블에 저장한다. 데이터가 저장되는 공간을 버킷(bucket)이라고 한다. 삽입/삭제/탐색 모두 상수 시간(O(1))으로 처리가 가능하다. 단, 서로 다른 Key가 같은 해시 값을 도출해내는 해시 충돌이 일어날 경우 탐색 시간이 증가할 수 있다. 해시 함수 임의의 길이를 가진 데이터를 고정된 길이의 해시 값으로 변환(매핑)해주는 함수. 동일한 입력에 대해 항상 동일한 해시 값을 반환해야 한다. 대부분 해시 함수는 출력 범위가 입력 범위 보다 작으므로 다른 입력에 대해 동일한 해시 값을 반환하는 해시 충돌이 발생할 수 있다(비둘기집 원리..
-
부동 소수점
프로그램에선 정수 뿐 아니라 소수점이 존재하는 실수를 다뤄야 할 때가 많다. 이러한 실수를 저장하는 변수로 부동 소수점(floating point) 변수를 사용하게 된다. 32bits로 실수를 표현한다고 해보자. 고정 소수점의 경우 MSB를 부호 비트, 15bits와 16bits를 각각 정수부/소수부 표기에 사용한다. 부동 소수점의 경우 MSB를 부호 비트, 8bits를 지수부, 23bits를 가수부 표기에 사용한다. 지수와 가수는 다음을 따른다 = (가수)*(2^(지수)) 이러한 표현의 방법 때문에 부동 소수점은 더 넓은 범위의 실수를 표현할 수 있게 된다. 4bytes(32bits)로 표현하는 방법을 single precision, 단정밀도(1: 부호, 8: 지수, 23: 가수) 8bytes(64bi..
-
인코딩(ASCII, Unicode, UTF-8, UTF-16)
ASCII American Standard Code for Information Interchange 1byte 공간 중 7bit를 사용하여 128개의 문자를 표현할 수 있다. 나머지 1bit는 오류 검산을 위한 패리티 비트로 사용하거나 확장 아스키를 표현하는데에 사용된다. 간단하고 메모리 공간을 효율적으로 사용하지만 지원하는 문자가 한정적이다. Unicode 전 세계의 모든 문자를 표현하기 위한 국제 표준 문자 규격. 각 문자에 고유한 코드 값을 할당하여 문자를 유일하게 식별할 수 있도록 함. 4바이트(32비트) 테이블을 사용하여 약 42억개의 문자를 다룰 수 있다. 유니코드를 그대로 사용할 경우 사용 비중이 높은 로마자(ASCII) 입장에서는 4배 가량의 비효율성이 발생. 이러한 유니코드의 문제를 보..
Algorithm
-
풍선 터트리기(선형 탐색)
https://school.programmers.co.kr/learn/courses/30/lessons/68646 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 인접한 두 풍선 중 하나를 터트릴때 작은 풍선을 터트리는 행위는 단 한 번만 할 수 있음에 유의하여야 한다. 풍선들의 값들은 모두 다르다고 하였으므로 풍선 중에는 최솟값인 풍선이 존재할 것이고 해당 풍선은 무조건 모든 풍선을 터트릴 수 있을 것이다. 그리고 다른 풍선의 관점으로는 최솟값인 풍선과 만났을때 작은 풍선을 터트려야 하므로 최솟값인 풍선을 만나기 전에는 큰 풍선만 터트리는 행위만 하여야 ..
-
입국심사(이분 탐색)
https://school.programmers.co.kr/learn/courses/30/lessons/43238 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이번 이분탐색 문제도 헤매다가 결국 힌트를 보고 깨달았는데... 심사 받는 사람의 수를 탐색하는 것이 아닌 소요되는 시간을 이분탐색으로 최대한 줄여나가면 된다. 이전에 풀었던 공유기 설치 문제와 동일한 방법이다. https://djgameprogramming.tistory.com/117 공유기 설치(이분 탐색, 그리디) https://www.acmicpc.net/problem/2110 2110번:..
-
경주로 건설(DP)
https://school.programmers.co.kr/learn/courses/30/lessons/67259 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 해당 문제에서 고려해야 하는 점은 x, y 좌표뿐 아니라 해당 좌표에서 들어오게 된 경로, 즉 방향까지 고려야하여야 한다. 특정 좌표에서 특정 방향으로 접근했을때의 도로의 최소 건설 비용을 저장하는 방법의 DP 접근을 사용한다. DP[x][y][direction] = x, y좌표의 지점에서 direction 방향으로 접근했을때 건설한 도로의 최소 비용 만약 현재 노드에서 동쪽으로 다음 노드에 접근..
-
숫자 게임(BST)
https://school.programmers.co.kr/learn/courses/30/lessons/12987 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 상대의 숫자를 선형탐색하면서 상대의 숫자보다 크면서 최소인 값을 구하면 된다. 없다면 갖고있는 숫자 중 최소값을 사용한다. A의 숫자마다 B의 모든 숫자를 탐색한다면 N^2의 시간이 소요되므로 이진탐색트리를 사용하도록 한다. 이진 탐색의 lower bound, upper bound의 활용을 보는 문제라고 생각된다. set.lower_bound(): 특정 값 이상의 값이 처음 나타나는 위치를 반환한..