[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..