| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- BFS
- C++
- tweakobjectptr
- 정렬
- map
- stl
- 정렬알고리즘
- 약참조
- 자료구조
- unorder_map
- UE_LOG
- 크리티컬섹션
- 선택정렬
- 구조적 바인딩
- 데이터애셋
- 스마트포인터
- 람다
- 델리게이트
- 강참조
- enumasByue
- 알고리즘
- 비동기호출방법
- 애셋로드
- C++최적화
- 언리얼가비지컬렉터
- makeweakobjectptr
- dataasset
- moreeffectiveC++
- 프로그래머스
- UML관련
- Today
- Total
목록UnrealEngine (89)
기억을 위한 기록들
클래스 구조를 생각하다보면 개인적으로 바로바로 안떠오르기도 하고, 적용에 있어서 신중해지는게 인터페이스 클래스 인 것 같다. 그러다 문득 언제 사용해야할까? 라는 질문을 스스로 하게 됐고, 이에 대해 정리해보자 한다. 언리얼 엔진에서 인터페이스 클래스는 "역할 기반 설계"와 "다중 상속의 필요성"을 기준으로 판단할 때 가장 효과적이다.올바른 시점에 인터페이스를 사용하면 코드의 확장성과 유지보수성을 극적으로 향상시킬 수 있다. 언리얼의 인터페이스는 순수 가상 함수 선언만 포함하므로, 상태 데이터가 필요 없으면서도 여러 클래스 계층에 동일한 기능을 부여해야 할 때 최적이고, 블루프린트와의 호환성을 제공하며, TScriptInterface를 통해 느슨한 결합(Loose Coupling)을 실현할 수 있습니다..
원본 영상: https://www.youtube.com/watch?v=v9k-J2GeEKI 이 글을 해당 영상과 공식문서를 참조하여 정리한 글입니다. 해당 영상에 나오는 내용과 찾아본 내용들에 대해 정리하였습니다.해당 영상에 따르면 영상 내용은 패턴, 철학, 설계 철학 중심이며, 구현 예시는 추후 별도 영상으로 제공 예정이라고 합니다. UI 시스템이 점점 엉망이 되는 이유많은 프로젝트에서 UI 시스템이 커지면서:마스터 위젯이 모든 것을 관리.작은 변경이 전체를 깨뜨리는 구조.폰트나 색상 하나 바꾸는 것도 힘듦.해당 영상은 모듈식, 확장 가능, 최적화된 UI 시스템 구현을 위한 모범 사례를 소개합니다.Tip 1 — 재사용 가능한 Base Widget 만들기문제점프로젝트 전역 텍스트 색상 바꾸려면 하나하나..
FGCObject란 언리얼 엔진의 가비지 컬렉션(이하 GC) 시스템에게 "이 UObject는 내가 가지고 있으니 지우지 마"라고 알려주는 인터페이스이다.UPROPERTY()가 없이 보관해야 할 경우 GC가 모르게 들고 있다가 크래시나는 문제를 해결하는 안전한 방법이다. 언리얼엔진의 GC는 UObject를 자동으로 추적하지는 않는다.GC가 자동으로 추적하는 경우는 다음과 같다.리플렉션 시스템에 등록된 객체일 경우RootSet에 등록 된 경우 문제는 다음과 같은 경우들에서 발생한다.일반 C++ 클래스에서 UObject* 포인터를 저장할 경우TSharedPtr안에서 UObject 넣어야 할 경우커스텀으로 사용하는 UObjectPoolingManager 처럼 GC 외부에서 관리하는 경우 GC 입장에서는 이렇게..
1. 들어가며언리얼 엔진에서 멀티플레이 게임을 개발하려면 RPC(Remote Procedure Call)와 Replication의 정확한 이해가 필수적이다. 언리얼은 서버-클라이언트 구조를 기반으로 하고 있으며, 단순히 UFUNCTION()을 호출한다고 해서 클라이언트와 서버가 같은 결과를 얻는 것은 아닙니다. 이 글에서는 RPC의 종류, Replication의 원리, 그리고 클래스별 네트워크 특성을 정리해보려고한다. 참고 자료 : https://dev.epicgames.com/documentation/ko-kr/unreal-engine/remote-procedure-calls-in-unreal-engine 2. 왜 중요한가?멀티플레이 게임에서 가장 큰 문제는 데이터 불일치입니다.클라이언트에서만 ..
언리얼엔진에서 월드 내의 특정 액터들을 효율적으로 찾고 순회하는 방법으로 TActorIterator 라는 템플릿 클래스가 있다. UWorld안에 존재하는 액터들을 타입 기반으로 자동 필터링하며 순회하는 템플릿 반복자로써, 액터들을 찾기 위한 함수 중에 하나로 GetAllActosOfClss() 라는 함수를 예전에 사용 했었지만, 결국 이 함수도 내부적으로 TActorIterator를 기반으로 TArray를 할당하고 복사를 발생시켜 비용이 크다. 예시) 월드안에 있는 AMyEnemy 기반 혹은 자식 클래스 액터 탐색하기for (TActorIterator It(GetWorld()); It; ++It){ AMyEnemy* Enemy = *It; if (Enemy->IsAlive()) ..
언리얼엔진에서 UObject 객체들에 참조하려고 할 때, 유효성 검사하더라도 포인터만 남아서 문제가 생길 때가 있다. UObject* CachedObject = GetSomeObject(); // 이 시점엔 유효// ...if (CachedObject) // 이게 true라도 실제 메모리는 이미 파괴되었을 수 있음{ CachedObject->DoSomething(); // 크래시 가능} 혹은 FTimerDelegate TimerDel;TimerDel.BindLambda([=](){ MyObject->DoSomething(); // MyObject는 이미 GC에 의해 삭제됐을 수 있음 });이럴때의 TWeakObjectPtr 템플릿으로 감싸서 IsValid 검사를 하며 사용할 수 있다. 객체가..
블루프린트에서 비동기방식을 다루고 싶다면 UBlueprintAsyncActionBase 클래스를 사용하자. 옛날에 블루프린트 상에서 다른 애셋에 대한 로딩을 하는 과정에서 기다리기 위해 임의로 delay 블루프린트 함수를 쓰는 걸 본 적이 있었다. 다른 좋은 방법은 그 당시에 생각나지 않았고, delay로 임의의 시간을 입력하고 그렇게 사용하는게 좋지 않다는 것만 인지하고 지나간 기억이 있다. 그러다가 최근에 알게된 클래스가 UBlueprintAsyncActionBase 이다. 예를 들어 서버 요청 응답, 외부 SDK 호출이나 다운로드, 내부 로직 처리 대기 등등 을 블루프린트에서 기다리고 싶을때 UBlueprintAsyncActionBase 클래스를 사용하면된다. 예로 살펴보면 해당 코드는 LyraS..
언리얼엔진에서 모바일 앱들에 대해 앱 이름을 지정해줄 수 있다. 하지만, 추가로 모바일 기기 자체에 설정된 언어에 따라 앱 이름이 현지화 적용되어 필요한 경우도 있다. 그 방법을 살펴보자. Android - strings.xml로 다국어 처리하기1. 경로: "프로젝트/Build/Android/res/"이곳은 Android 리소스가 들어가는 위치로 해당 경로에 추가해줘야한다. 2. 국가별 폴더 생성아래와 같은 형식으로 언어별 폴더를 생성한다한국어: values-ko영어: values-en일본어: values-ja베트남어: values-vi중국어 간체 : zh-rCN중국어 번처 : zh-tTW등등..3. 각 폴더에 strings.xml 생성예시: values-en/strings.xml MyGame 예시:..
최근에 안드로이드 라이브러리를 제공받아 언리얼엔진 프로젝트에 적용해야 하는 작업을 진행했고, 그 과정에서 경험했던것에 대해 나중을 위해 적어보려고 한다. (글에 틀린 부분이 있을 수도 있습니다.) 우선 안드로이드 라이브러리에 대해서 간단하게 알아보면 안드로이드 스튜디오를 통해 작성된 java 기반 aar 파일, 혹은 jar 파일이 있다. jar파일은 Java archive 의 약자로 자바로 생성된 클래스파일과 이미지등의 리소스 파일들의 포함되고, aar파일은 Android archive의 약자로, 안드로이드에 특화된 Jar파일이라고 보면 된다. aar파일은 안드로이드의 layouts, drawables 등 리소스 파일이 포함될 수 있다. (jar파일, aar 파일의 내부를 보려면 확장자를 zip으로 변..
(해당 정보는 대부분 웹 서칭을 통해 찾아보고 나중에 제가 혼자 참고하려고 정리해보고 있습니다.) 렌더링 프로세스에 대해 Game thread(게임 스레드)에서 Slate Tick은 프레임당 두 번 위젯 트리를 탐색.1번 틱 :Prepass 트리를 아래->위로 탐색하여 각 위젯의 이상적인 크기( DesiredSize )를 계산.2번 틱: OnPaint 트리를 위->아래로 탐색하여 렌더링에 필요한 Draw Elements 를 계산. Render Thread에서 Slate 렌더링은 두 단계로 나뉜다.1. Widget Render: UI의 RTT를 수행합니다. Retainer Box를 사용하는 경우 Draw Elements는 Retainer Box의 Rtain Target에 렌더링됩니다.2. Slate R..
기존에는 언리얼엔진에서는 플레이어 입력관련 바인딩 이벤트를 프로젝트 설정을 통해서 매핑을 시켜줬었다.하지만, 언리얼 엔진4부터 존재하다가 5부터 본격적으로 어필하고 있는 새로운 프레임워크 Enhanced Input System 직역하면 "향상된 입력시스템"을 도입했다. 그래서 언리얼엔진 5 부터는 기존 프로젝트 설정을 통한 입력 설정을 들어가서 살펴보면, 이제 사용하지 않을거라는 안내메시지가 나오면서, InputActions(IA)와 InputMappingContext(IMC) 를 사용하라고 안내해주고 있다. 향상된 입력 시스템은 우선 플러그인부터 활성화 해줘야한다. 활성화를 해준뒤, 애셋 생성창에서 보면향상된 입력 시스템은 입력 액션(Input Actions) , 입력 매핑 컨텍스트(Input M..
CDO(CDO: Class Default Object)는 C++ 클래스의 기본 인스턴스를 나타냅니다. 클래스의 CDO는 클래스의 기본 속성을 정의하고, 클래스의 인스턴스화 및 초기화 과정에서 사용됩니다. 이는 클래스의 인스턴스를 만들 때 적용되는 초기 속성 값들을 포함합니다. 언리얼 엔진에서는 CDO가 게임 객체의 기본 상태를 정의하는 데 사용됩니다. 예를 들어, 게임에서 사용하는 캐릭터 클래스의 CDO는 이 캐릭터가 소유할 수 있는 초기 속성 값을 정의합니다. 따라서 클래스의 인스턴스를 생성할 때마다 CDO의 초기값이 사용되어 해당 클래스의 객체가 초기화됩니다. UClass 매크로는 UObject 에게 자신의 언리얼에서 기반으로 삼은 유형에 대해 설명해 주는 UClass 로의 레퍼런스를 넘겨줍니다. 각..