[UE5] 자식 클래스의 서브오브젝트 새로 생성하기
·
게임개발/Unreal Engine
언리얼에서 부모 클래스를 만들고, 이를 파생시킨 서브클래스를 만들 때 막혔던 부분이 있다. 그것은 부모 생성자에서 만든 오브젝트를 자식 클래스에서 새로 할당해줘야 할 때였다. 직관적으로 코드를 짰을 때는 아래와 같이 작성했다.// Parent Class cppAParentClass::AParentClass(){ SampleObject = CreateDefaultSubobject(TEXT("SampleObject");}// Child Class cppAChildClass::AChildClass(){ SampleObject = CreateDefaultSubobject(TEXT("SampleObject");} 그런데 이렇게 작성한 후 빌드를 하면 크래쉬가 나면서 터진다.Fatal error: [File:D:..
[Unity] HDRP의 수동 카메라 렌더링 (Camera.Render() 사용금지)
·
게임개발/Unity
유니티에서 카메라는 성능을 많이 잡아먹기에 조심히 다뤄야한다.나의 경우 카메라를 RenderTexture 용도로 사용했을 때 enable=false 후 Camera.Render() 수동 렌더 방식으로 구현을 했었다.이렇게 했을 경우 카메라 센서가 하나일 때는 문제가 없지만, 카메라 센서가 여러 대 늘어날 수록 프레임이 급격하게 떨어졌다.프로파일링을 통해 원인을 찾고 리서치 해본 결과, HDRP 같은 최신 SRP 환경에서는 Camera.Render()가 아닌 HDRenderPipeline.SubmitRenderRequest를 써야 한다는 것을 알았다. 1. Camera.Render()Camera.Render()는 옛날 빌트인 파이프라인 시절의 함수이다.이걸 호출하면 HDRP 렌더링 커맨드 전체를 메인 스..
[UE5] Unreal Object Pointers
·
게임개발/Unreal Engine
언리얼 개발에서 무조건 알아야 하는 개념 중 하나인 포인터. 언리얼 스크립트는 C++로 작성하기에 기본 원시 포인터 *는 당연히 존재한다.그러나 언리얼 UObject에 맞춰 새롭게 만든 포인터가 있으니, 대표적으로 TObjectPtr가 있다.또한 C++의 스마트 포인터 (WeakPtr, SharedPtr)와 같이 순환참조, 댕글링 포인터 등을 방지하기 위한 포인터들도 존재한다. 이러한 언리얼의 오브젝트 포인터들에 대해 자세히 알아보도록 하자. 언리얼 공식 사이트에 정리된 표를 보면 아래와 같이 되어있다.*: 언리얼 헤더 툴 (UHT)에서는 UPROPERTY()로 표시된 원시 포인터(*)가 GC에 영향을 주거나, Serialization / Networking을 지원하는 경우 †: TObjectPtr는 ..
[Unity] Property 인스펙터에 표시하기
·
게임개발/Unity
유니티에서 변수를 인스펙터에 표시하기 위해 [SerializeField], [Serializable] 등으로 직렬화를 진행한다.대부분의 변수는 public으로 선언할 경우 자동으로 직렬화 되고, 커스텀 클래스의 경우 [Serializable] 붙여주면 된다. 그런데 인터페이스 등을 사용해서 프로퍼티로 관리하는 경우, 인스펙터에 노출시키려면 어떻게 해야할까? 프로퍼티는 단순히 [SerializeField]로 하면 인스펙터에 표시되지 않는다.이때는 [field: SerializeField]를 사용해 인스펙터에 표시한다.주의할 점은 자동 구현된 프로퍼티에만 사용 가능하다.get, set 액세서를 직접 구현하는 경우에는 인스펙터 노출이 안된다.public class A : MonoBehaviour{ [fiel..
[UE5] FName, FText, FString
·
게임개발/Unreal Engine
언리얼에서 개발을 하다 보면 헷갈리는 문자열 타입 3가지가 있다.FName, FText, FString셋 다 문자열을 처리하는데 어디에, 어떤 식으로 사용되는 것일까? 1. FName콘텐츠 브라우저에서 새 에셋 이름을 지을 때, 다이내믹 머티리얼 인스턴스의 파라미터를 변경할 때, 스켈레탈 메시에서 본에 접근할 때, 모두 FName을 사용합니다. FName 은 문자열 사용에 있어서 초경량 시스템을 제공하는데, 주어진 문자열이 재사용된다 해도 데이터 테이블에 한 번만 저장되는 것입니다. FName 은 대소문자를 구분하지 않습니다. 변경도 불가능하여, 조작할 수 없습니다. 이처럼 FName의 정적인 속성과 저장 시스템 덕에 찾기나 키로 FName에 접근하는 속도가 빠릅니다. FName 서브시스템의 또 다른 특..
[Unity] 변수 이름을 바꿔도 인스펙터 값을 유지하는 법(FormerlySerializedAs)
·
게임개발/Unity
유니티 개발에서는 public / [SerializedField]인 변수들을 인스펙터에 노출시킨 후, 값을 직접 할당하여 사용한다. 이렇게 만들어놓은 변수를 잘 사용하다가, 모종의 이유로 변수명을 바꿔야하는 경우가 있다.변수의 오타를 발견했거나, 리팩토링으로 다른 변수명을 사용하거나, 컨벤션에 맞추기 위해 바꾼다거나.. 이때 단순히 변수명을 바꾸게되면 인스펙터에서 할당한 값이 없어지는 현상을 볼 수가 있다. 프리팹 a가 있고 여기에 스크립트 A.cs가 붙어있다고 해보자.스크립트 A는 다음과 같이 public Gameobject Target 변수를 가지고 있으며, 인스펙터에서 프리팹 b를 할당해주었다.using UnityEngine;public class A : MonoBehaviour{ public..
[UE5] 언리얼의 Multi-threading
·
게임개발/Unreal Engine
게임 개발을 하다보면 성능 최적화는 피할 수 없는 문제다.대부분의 작업이 메인 스레드에서 돌아갈 때, 이를 여러 쓰레드에 병렬로 부담을 분산시키면 많은 최적화를 이뤄낼 수 있다.게임 개발에서 중요한 언리얼 엔진 5의 멀티스레딩 시스템에 대해 정리해보려 한다. 1. Multi-threading이란? 멀티스레딩은 프로세스 내에서 여러 실행 흐름을 만들어 CPU 자원을 최대한 활용하는 기술이다.메인 스레드(Game Thread)의 부하를 분산해서 여러 코어에서 동시에 연산을 수행한다.물리적으로 여러 코어에서 동시에 작업을 처리할 수 있다하지만 스레드 생성과 컨텍스트 스위칭에도 비용이 든다작업 단위가 너무 작으면 오히려 단일 스레드보다 느려질 수 있다 2. 동기화 프리미티브멀티스레드 환경에서 여러 스레드가 같은..
[C++] const 정리 (+constexpr이란?)
·
언어/C,C++
C++ 코딩을 하다보면 안전성을 위해 쓰이는 코드가 있다. 값이 바뀌지 않으며 고정되는 상수로 만드는 키워드, 바로 const다 const는 보통 변수 이름 앞에 쓰여 해당 변수의 값을 바꿀 수 없게 만들어준다.const float FRAME_RATE = 60f; 단순하게 쓰면 저정도이지만, const는 함수와 포인터 등 다양한 곳에 쓰일 수 있다. 오늘은 const와 C++11부터 도입된 constexpr에 대해 자세히 알아보자. 1. 함수의 반환 타입 앞에 붙는 constconst [type] Function()가장 기본적인 형태로, 함수의 반환값(Return Value)을 상수로 만들겠다는 의미다.const int GetSomeValue() { return 10;}// 사실 기본 자료형(int..
[Unity] Debug.Log 커스터마이징
·
게임개발/Unity
유니티에서 가장 자주 쓰이는 함수가 뭘까? 개인적으로는 Debug.Log가 아닐까 생각한다.코드가 잘 돌아가는지, 값이 올바른지 등을 확인하기 위해 보통 Debug.Log로 메세지를 출력한다.Debug 종류는 Log, LogWarning, LogError 3가지로 각 상황에 따라 적절하게 사용한다. 그런데 이 Debug.Log에 내가 원하는 방식으로 수정할 수 있으면 좋지 않을까?예를 들어, Debug.Log를 호출한 클래스의 이름을 자동으로 메세지에 넣어 출력하게 해준다거나 Editor에서만 Debug.Log를 호출하도록 바꾸는 등 말이다. 1. 호출한 클래스 출력하기어떤 함수를 호출했을 때 해당 클래스의 이름을 출력하는 방법에는 여러가지가 있다.가장 간단한 방법은 호출하는 함수에서 this.Get..
[Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete)
·
게임개발/Unity
Unity 뿐만 아니라 다른 모든 프로그래밍에서 함수나 클래스를 만들었다가 버리는 경우가 흔하다.보통 주석처리 하거나 아예 지워버리긴 하지만, 다른 사람들과 협업할 때 무작정 없애면 혼란이 생길 수가 있다.또한 이전 버전을 사용하는 사람에게 새로운 함수나 클래스로 변경하라는 메세지가 필요할 때도 있다. 이를 위해 Unity에서는 더 이상 사용하지 않는 함수나 클래스에 Obsolete 키워드를 넣어 해당 함수나 클래스가 더 이상 권장되지 않음을 표시할 수 있다. 0. System.ObsoleteObsolete 키워드는 선언 바로 윗 부분에 [System.Obsolete]를 적어 적용할 수 있다. 형태는 총 3가지가 존재한다.[System.Obsolete]: 기본 형태. 해당 메서드나 클래스가 권장되지 않음..