UnrealEngine(15)
-
Reflection, Garbage Collection
Refection 프로그램이 런타임에 자기 자신을 조사하는 기능 기본 C++는 리플렉션을 지원하지 않음 언리얼엔진은 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 정보를 수집하는 별도의 리플렉션 시스템이 구축되어있음. 프로퍼티 시스템이라고 함. 어떠한 클래스, 구조체, 함수, 변수, 열거형 정보를 리플렉션에 추가하려면 특수한 주석(매크로)를 달아줘야함. 이러한 주석이 달린 정보들은 UHT(Unreal Header Tool)가 프로젝트를 컴파일 할 때 해당 정보를 수집함. https://www.unrealengine.com/ko/blog/unreal-property-system-reflection 언리얼 프로퍼티 시스템 (리플렉션) 리플렉션(Reflection)은 프로그램이 실행시간에 자기..
2023.06.05 -
Unreal Interface
무기의 오버랩 이벤트가 발동할때 오버랩된 액터의 GetHit이라는 함수를 호출하여 오버랩에 반응하도록 하고싶다고 가정해보자. 이럴땐 적 C++ 클래스에 GetHit이라는 함수를 추가해서 무기의 오버랩 이벤트가 발동될때 오버랩된 액터의 GetHit 함수를 호출하면 된다. 그런데 이벤트가 단순히 적 C++ 클래스에 한정하여 작동되는 것이 아니라 부서지는 오브젝트, 고정된 오브젝트, 발사체 등 여러가지 C++ 클래스에 대해서 작동하도록 해야할땐 어떻게 해야할까? 이렇게 유사성이 없는 클래스에 대하여 특정 게임 기능 함수를 공유시키고 싶을때 인터페이스를 사용한다. 인터페이스(Interface)는 특정 기능을 구현할 것을 약속한 추상 형식이다. Java나 C#같은 다른 OOP 언어에선 인터페이스 형식을 따로 제공..
2023.03.17 -
IK 릭 애니메이션 리타기팅
애니메이션은 특정 스켈레톤을 기반으로 동작하게 된다. 같은 스켈레톤을 공유하지만 비율이 다른 캐릭터들에게 애니메이션이 자연스럽게 적용되도록 하는 애니메이션 리타기팅 기술이 존재했지만 언리얼 엔진 5에선 아예 다른 스켈레탈 메시 간에 애니메이션을 리타기팅 할 수 있는 'IK 릭 애니메이션 리타기팅' 기술이 생겼다. IK 릭 애니메이션 리타기팅은 두 스켈레탈 메시의 'IK 릭' 파일과 'IK 리타기팅' 파일이 필요하다. 특정 스켈레탈 메시의 IK 릭 파일을 생성하면 다음과 같이 계층구조가 나온다. 리타깃 루트를 설정해줘야 하는데 이 때 루트본이 아닌 골반(Pelvis)본을 리타깃 루트로 설정해준다. 그리고 두 스켈레탈 메시가 연동될 리타깃 체인들을 지정해 주면 된다. 계층구조에서 본을 다중 선택한 다음 '선..
2023.03.08 -
Delegate
디자인 패턴에서 관찰자 패턴(Observer Pattern)이라는 것이 있다. 관찰자 패턴은 발행자(Subject)와 관찰자(Observer)가 존재하고 발행자는 관찰자에 대한 목록을 갖고있고 관찰자는 각각 Callback() 함수를 갖고있다. 이때 발행자가 특정 이벤트를 발생했을때 관찰자들의 Callback 함수가 호출되게 하는 것이 관찰자 패턴이다. 관찰자 패턴을 사용하는 이유는 종속성이 없는 일대다 관계를 만들 수 있기 때문이다. 발행자는 관찰자에 대해 알 필요도 없고 관찰자가 몇 명이 있는지 미리 알아야 할 필요도 없다. 발행자는 단지 특정 이벤트를 발생시킬 뿐이고 관찰자가 발행자의 리스트에 자신을 추가하고 이벤트에 대한 응답으로 Callback 함수를 호출하는 것이다. 언리얼 엔진도 델리게이트(..
2023.03.07 -
Unreal Foot IK
https://djgameprogramming.tistory.com/84 IK(Inverse Kinematic, 역운동학) 스켈레톤을 사용한 애니메이션에는 '운동역학'이라는 개념이 존재한다. 모델에 리깅(Rigging, 3D 모델링에 뼈대를 할당하여 움직이게 함)을 하여 관절부 움직임을 묘사할때 역학관계 계산이 필요 djgameprogramming.tistory.com Foot IK를 구현하기 위한 단계는 다음과 같다. 먼저 컨트롤 릭 파일을 생성하고 적용할 스켈레톤의 본 계층구조를 불러온다. 이때 IK로 사용할만한 가상 본이 없다면 직접 생성한다.(Root 가상본 -> 양 발의 가상본) 1. 각 발(IK 가상본)에서부터 아래방향으로 스피어 트레이스를 하여 지면까지의 거리를 계산 2. 1항에서 계산된 지..
2023.03.07 -
IK(Inverse Kinematic, 역운동학)
스켈레톤을 사용한 애니메이션에는 '운동역학'이라는 개념이 존재한다. 모델에 리깅(Rigging, 3D 모델링에 뼈대를 할당하여 움직이게 함)을 하여 관절부 움직임을 묘사할때 역학관계 계산이 필요한데 이러한 것을 '애니메이션 운동역학'이라고 한다. 애니메이션의 운동역학은 FK(Forward Kinematics), IK(Inverse Kinematic) 2가지가 존재한다. FK는 로테이션의 값들을 도달해야하는 위치로 바꿔주는 방법이다. 본에 로테이션을 직접 적용하는 것을 생각하면 된다. IK는 이름에서 알 수 있듯이 FK의 반대이다. 관절 체인이 마지막에 도달해야 하는 지점인 엔드 이펙터(End Effector)를 도출한다. 이러한 엔드 이펙터를 기준으로 관절들의 로테이션 값을 바꿔주는게 IK(역운동학)다...
2023.03.07 -
Enhanced Input(향상된 입력)
https://docs.unrealengine.com/5.0/ko/enhanced-input-in-unreal-engine/ 향상된 입력 향상된 입력 플러그인 개요 docs.unrealengine.com 언리얼 5.1 버전부터 기존 입력방법 대신 Enhanced Input(향상된 입력)방법이 적용되었다. 기존의 입력 방법은 프로젝트 세팅에서 축, 액션 매핑에 대한 키를 설정하여 클래스에서 각 매핑에 함수를 바인딩하여 동작을 구현하는 방법이었다면 향상된 입력은 값의 출력을 담당하는 '입력 액션'과 입력 액션을 특정 키에 바인딩해주는 '입력 매핑 컨텍스트'로 과정을 나누어서 보다 다양한 상황에서 통용되는 범용적인 동작방법을 디자인 할 수 있도록 설계되었다. 입력 액션은 동작에 해당되는 함수와 바인딩 되어서 ..
2023.03.01 -
Class Default Object
UClass에는 모든 언리얼 오브젝트에 대하여 각 클래스 계층 구조 정보, 멤버 변수와 함수에 대한 정보를 모두 기록한다. 리플렉션(프로퍼티 시스템)에서 언리얼 헤더 툴이 클래스에 대한 정보를 수집한다고 하였는데 이렇게 수집된 메타 정보를 UClass에 보관되게 되는 것. 컴파일 단계에서 오브젝트마다 UClass가 생성된다면 런타임 단계에선 오브젝트마다 클래스 정보와 함께 특정 인스턴스가 생성되는데 이것을 Class Default Object(CDO)라고 함. CDO는 클래스에 대한 기본(디폴트) 정보가 담겨있는 인스턴스로 클래스 생성자를 통해 최초로 한 번만 할당된다. 해당 클래스를 사용한 오브젝트를 생성할 때 마다 클래스를 초기화시키지 않고 CDO를 복제하는 방법을 사용함. (런타임에서 특정 클래스의..
2023.02.28 -
Character(=Pawn)의 AddMovementInput()
'메인 플레이어 폰'의 움직임을 제어하는 방법은 크게 2가지로 볼 수 있다. 1. Actor의 Location을 직접 조정.(AddActorLocalOffset 등) 2. Character(=Pawn) C++ 클래스에 있는 AddMovementInput을 사용. 보통 캐릭터 C++클래스를 만들면 딸려오는 함수인 AddMovementInput 함수로 이동을 구현하였는데, 어느 강의에서도 DeltaTime으로 보정해준다는 말이 없어서 알아보기로 하였다. (DeltaTime: https://djgameprogramming.tistory.com/28?category=997144) Delta Time 언리얼 엔진의 C++ 클래스에서 AddActorLocalOffset, 혹은 SetActorLocation 함수는 ..
2022.09.20 -
Player Input
플레이어로부터 입력을 받기 위해선 언리얼 엔진의 프로젝트 세팅에서 입력에 대한 환경설정을 해주어야 한다. 입력 매핑을 설정할때 액션 매핑, 축 매핑 두 가지 종류의 매핑이 존재한다. -액션 매핑: 단일적인 입력을 감지한다. 액션 매핑에 바인딩된 함수는 입력을 감지할때만 호출된다. 코드에 따라 누를 때, 뗄 때, 더블클릭할 때, 누르고 있을 때 등등에 대한 상황을 감지할 수 있으며, 점프, 공격, 상호작용 등의 기능에 적합하다. -축 매핑: 연속적인 입력을 감지한다. 축 매핑에 바인딩된 함수는 입력이 없어도 매 프레임마다 값을 탐색하고 호출된다. 이동, 카메라 움직임 등의 기능에 적합하다. PlayerInputComponent의 BindAxis 또는 BindAction 함수로 특정 함수를 입력 매핑에 바인..
2022.09.13 -
Actor, Pawn, Character
Actor 레벨에 배치할 수 있는 오브젝트, 이동, 회전, 스케일과 같은 3D Transform을 지원하는 범용 클래스. Pawn 플레이어나 AI가 제어할 수 있는 Actor. 플레이어나 AI 개체에 대한 물리적 표현.(시각적 표현 뿐만 아니라 콜리전과 같은 물리적 표현도 모두 포함) Character CharacterMovementComponent, CapsuleComponent, SkeletalMeshComponent의 추가를 통해 Pawn 보다 복잡한 애니메이션을 처리하기 위해 고도로 특화된 Pawn. Actor Pawn Character 이동 X O O (플레이어, AI)제어 X O O 애니메이션 X X O
2022.09.13 -
Delta Time
언리얼 엔진의 C++ 클래스에서 AddActorLocalOffset, 혹은 SetActorLocation 함수는 해당 액터의 로케이션 값을 변경할 수 있다. 단순 로케이션 변경이라는 결과를 도출할때는 적합하지만 캐릭터의 이동과 같은 부드러운 로케이션의 변경을 위해선 Tick 함수나 축 매핑에 바인딩하여 사용하여야 한다. 이렇게 사용했을 때 액터의 움직임을 변경하는 함수는 매 프레임=Frame 마다 호출되게 된다. 하지만 이렇게 구현을 했을 때 캐릭터의 이동하는 거리(=함수의 호출 빈도)가 프레임에 종속되어버린다. Tick 함수에 특정 액터를 1만큼 이동하도록 구현했다고 해보자 30fps(초당 프레임)의 성능을 보장하는 A 컴퓨터와 60fps의 성능을 보장하는 B 컴퓨터가 있을때, 동일한 코드일지라도 A컴..
2022.09.13