언리얼 114

언리얼 구형 입력 시스템

이번 포스트에서는 언리얼 엔진의 구형 입력 시스템에 대해 알아보겠습니다.언리얼 엔진 5.1 부터는 향상된 입력 시스템(Enhenced Input System)이 도입되었지만,그 이전의 버전에서는 구형 입력 시스템이 사용된 경우가 많기에 구형 입력 시스템도 알아두는 것이 좋습니다. 1) 구형 입력 시스템의 처리구형 입력 시스템에서 플레이어의 입력은 PlayerController를 통해 Pawn에 전달됩니다.Pawn은 나중에 관련 포스팅을 작성하겠지만,언리얼 오브젝트의 기본인 Actor에서 이동과 같은 움직임이 추가된 것이라고 생각해주시면 됩니다. 이때 들어온 입력은 PlayerController에서 처리하거나 Pawn이 처리하게끔 결정할 수 있지만,PlayerController에서는 입력외의 많은 정보를 ..

언리얼 엔진의 메모리 관리 (3) ~ 패키지

기존의 포스트에서 다룬 예제들을 보면, 하나의 프로젝트에 한두개의 언리얼 오브젝트가 포함되었습니다.하지만 프로젝트가 점점 커질수록 그 안의 데이터의 양은 점점 늘어나고,이는 곧 손으로 셀 수 없을 정도의 언리얼 오브젝트가 프로젝트에 포함되는 것을 의미합니다. 이런 상황에 대비하기 위해 언리얼 엔진은 언리얼 오브젝트를 효과적으로 저장하고 불러들이고자패키지 단위로 언리얼 오브젝트를 관리합니다. 이번 포스트에서는 언리얼 오브젝트의 관리 단위인 패키지와 그 휘하 단위들을 알아보겠습니다. 1) Package와 Asset패키지는 다수의 언리얼 오브젝트를 포장하는데 사용되는 언리얼 오브젝트입니다.그리고 모든 언리얼 오브젝트는 패키지에 소속되어 있습니다. 그리고 이런 패키지에 소속된 서브 오브젝트들을 Asset이라고 ..

언리얼 엔진의 메모리 관리 (2) ~ 직렬화

저번 포스팅에서는 언리얼 엔진이 메모리를 관리하는 방법 중 하나인 가비지 컬렉터에 대해 알아보았습니다.이번 포스팅에서는언리얼 엔진에서 메모리, 그 중에서도 오브젝트를 관리하는 방법 중 하나인 직렬화에 대해 알아보겠습니다. 1) 직렬화(Serialization)란?직렬화는 오브젝트나 연결된 오브젝트의 묶음을 바이트 스트림으로 변환하는 과정을 의미합니다.이때 직렬화는 바이트 스트림에서 오브젝트로 변환하는 과정도 포함해서 의미합니다. 직렬화로 얻을 수 있는 장점은 다음과 같습니다. 1) 현재 프로세스의 상태를 저장하고 필요한 경우에 복원이 가능합니다.2) 현재 인스턴스의 정보를 복사하여 다른 프로그램에 전송이 가능합니다.3) 네트워크를 통해 현재 프로세스의 상태를 다른 컴퓨터에서 복원이 가능합니다.4) 데이터..

Mixamo를 통한 간단한 애니메이션 포즈 만들기

게임을 만들다 보면 여러가지 애니메이션 포즈를 사용해야 할 필요가 있습니다.이럴 때 Adobe에서 지원하는 Mixamo를 이용하면 쉽게 애니메이션에 필요한 포즈를 만들 수 있습니다. 1) Mixamo제일 먼저 Mixamo로 이동합니다.https://www.mixamo.com/ Mixamo www.mixamo.com 그 후 상단의 Characters에서 사용할 캐릭터를 지정합니다.  캐릭터를 선택하였다면, 캐릭터에 적용할 애니메이션을 지정해야 합니다. 애니메이션까지 지정했다면 우측의 Download를 통해 다운로드를 진행합니다.  만들고 있는 게임의 설정에 맞게 프레임이나 여러 설정을 조정하여 다운로드해주시면 됩니다.다운로드된 파일을 확인해보면 위와 같이 애니메이션과 메쉬가 있는 것을 확인할 수 있습니다...

언리얼 엔진의 메모리 관리 (1) ~ 가비지 컬렉션 시스템

이전의 포스팅에서 언리얼 엔진은 C++을 사용함으로서장점은 장점대로 취하면서, 단점은 현대 객체지향 언어의 특성을 사용하여 극복한다고 말씀드렸습니다. 특히, 포인터를 사용함으로써 발생하는 문제는 메모리에 직접적인 손상을 가할 수가 있기에 매우 중요하게 다뤄야 합니다.포인터를 사용함으로써 발생하는 문제는 크게 다음의 3가지로 분류할 수 있습니다. 1) 메모리 누수 : delete가 되지 않아 heap에 메모리가 그대로 남겨짐 이로 인해 지속적인 자원 낭비 발생2) 허상 포인터 : nullptr는 아니지만, delete된 오브젝트의 주소를 가리키는 포인터3) 와일드 포인터 : 값이 초기화되지 않아 엉뚱한 주소를 가리키는 포인터 이번 포스팅에서는 언리얼 엔진이 현대적인 객체지향 언어의 특징, 그 중에서도 가비..

언리얼 C++ - 구조체

C++을 통해 동작하는 무언가를 만들게 되면, 대부분의 상황에서는 클래스를 사용합니다.클래스라는 거대한 틀에서 찍어낸 인스턴스라는 객체를 사용하여 프로그램을 구성하는 것이 객체지향 프로그래밍의 기본구조이기 때문입니다. 그런데, 다른 코드 예시를 살펴보면 눈에 띄는 구조가 하나 있습니다.구조체(Struct)라는 것인데, 살펴보면 클래스와는 그렇게 큰 차이가 없는 듯 합니다.하지만, 클래스처럼 구조체 역시 프로그램의 구성에 있어서 매우 유용하고 중요한 개념입니다. 이러한 구조체를 언리얼 엔진에서는 어떻게 사용하는지 한번 알아보겠습니다. 1) 구조체에 대하여구조체는 클래스와 마찬가지로 자신만의 멤버를 갖게 됩니다.하지만 클래스가 멤버와 더불어 수행하는 동작만을 갖고 있다면구조체는 오로지 멤버에만 집중하는 것이..

언리얼 C++ - 자료 구조 ~ TMap

https://monstrosite.tistory.com/44 언리얼 C++ - 자료 구조 ~ TSethttps://monstrosite.tistory.com/43 언리얼 C++ - 자료 구조 ~ TArray언리얼 엔진은 자체 제작한 자료 구조 라이브러리 줄여서 UCL(Unreal Container Libarary)를 제공합니다.이는 언리얼 엔진을 안정적으로 지원하며monstrosite.tistory.comTSet에 이은 언리얼 C++의 자료구조 마지막 포스트입니다.이번 포스트에서는 TMap에 대해 알아보도록 하겠습니다. 1) TMapTMap에는 std::map이 대응됩니다. 이번에도 std::map과 TMap과의 차이점을 한번 알아보겠습니다.우선 std::map의 특징을 간단하게 적어보겠습니다.set과..

언리얼 C++ - 자료 구조 ~ TSet

https://monstrosite.tistory.com/43 언리얼 C++ - 자료 구조 ~ TArray언리얼 엔진은 자체 제작한 자료 구조 라이브러리 줄여서 UCL(Unreal Container Libarary)를 제공합니다.이는 언리얼 엔진을 안정적으로 지원하며 다수의 오브젝트 처리에 유용하게 사용할 수 있습니다.monstrosite.tistory.com위의 포스팅에서 이어지는 이번 포스팅에서는 언리얼 C++의 자료구조 중 하나인 TSet에 대해 알아보겠습니다.TSet 역시 TArray와 마찬가지로 언리얼 엔진에서 제공되어 많이 사용되는 자료구조입니다. 1) TSetTArray는 std::vector와 큰 차이점이 존재하지 않았습니다.그러나 TSet은 std::set과는 큰 차이점이 존재하는데, 이..

언리얼 C++ - 자료 구조 ~ TArray

언리얼 엔진은 자체 제작한 자료 구조 라이브러리 줄여서 UCL(Unreal Container Libarary)를 제공합니다.이는 언리얼 엔진을 안정적으로 지원하며 다수의 오브젝트 처리에 유용하게 사용할 수 있습니다.이번 포스팅에서는 언리얼 엔진의 자료 구조에서 TArray에 대해 알아보겠습니다. 1) TArrayTArray는 동적 배열 자료구조입니다. 다시 말해 C++의 std::vector와 유사한 성격을 가집니다. 게임을 제작하는 경우에 동적 배열 자료구조를 효과적으로 활용하는 것이 좋은데, 이유는 다음과 같습니다.  데이터가 순차적으로 모여있어 메모리를 효과적으로 사용가능하고 또 캐시 효율이 높습니다.임의의 데이터에 대한 접근이 빠르고, 빠른 속도로 원소를 순회하는 것이 가능합니다.위의 특징에서 알..

언리얼 C++ - 델리게이트

객체 지향 프로그래밍을 하다 보면, 클래스들간의 관계가 형성되는 경우가 있습니다.이 경우를 클래스간의 결합이 생겼다고 표현하는데, 결합에는 2개의 구분이 있습니다. 1) 결합의 구분 - 강한 결합 VS 느슨한 결합하나의 예시를 들어보겠습니다.이전의 포스트에서 Weapon 클래스는 UndefinedPlayer 클래스의 컴포지션으로 사용되었습니다.그런데, 만약 Weapon 클래스의 프로퍼티가 변경되었다고 가정한다면UndefinedPlayer로부터 상속된 자식 클래스들의 컴포지션도 수정해줘야 할 것입니다. 이처럼 클래스들이 서로 의존성을 갖는 경우를 강한 결합이라고 표현합니다.강한 결합이 유지된 클래스는 클래스들간의 관계로 인해 유지, 보수가 매우 어려워집니다. 이와는 반대로 인터페이스도 동작한 SummonI..