| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- 선택정렬
- 약참조
- 강참조
- makeweakobjectptr
- 데이터애셋
- UML관련
- BFS
- 람다
- 비동기호출방법
- map
- 언리얼가비지컬렉터
- 크리티컬섹션
- 델리게이트
- stl
- 구조적 바인딩
- C++최적화
- UE_LOG
- tweakobjectptr
- 정렬알고리즘
- 프로그래머스
- 자료구조
- 알고리즘
- moreeffectiveC++
- 스마트포인터
- unorder_map
- enumasByue
- 정렬
- dataasset
- 애셋로드
- C++
- Today
- Total
목록UnrealEngine (87)
기억을 위한 기록들
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 로의 레퍼런스를 넘겨줍니다. 각..
언리얼엔진 공식홈페이지에 기반하여 개인적인 정리 목적에 의해 작성되었습니다. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/networking-overview-for-unreal-engine 언리얼 엔진의 네트워킹 개요 멀티플레이어용 네트워크 게임 구성하기 dev.epicgames.com 로컬 플레이(싱글플레이)의 경우 싱글 플레이 게임이나 로컬 멀티플레이어 게임에서는 게임이 독립형으로 로컬에서 실행되고, 한 컴퓨터에서 액터들과 월드 및 각 플레이어의 UI 등 모든것을 직접 제어한다. 예를 들어 서로에게 발사체를 발사하는 게임이 있다고 치자. 네트워크 멀티플레이 게임 네트워크의 경우 언리얼엔진에서는 클라이언트-서버 모델을 사용합니다. 네트워크에..
이전에 std의 정규표현식에 관해 글을 작성하고, 언리얼에서 제공하는 정규표현식을 찾아보았다. https://hyo-ue4study.tistory.com/613 [CPP] C++ 정규 표현식 (regex / regular expression)에 관하여 C++ 11부터 포함된 정규 표현식( regular expression )이라는 라이브러리가 존재합니다. 정규표현식이란 문자열에서 특정 패턴을 찾거나 혹은 매치시키기 위해 사용되는 문자열의 표현으로, 헤더 파일 hyo-ue4study.tistory.com 언리얼엔진에서 정규표현식 관련된 클래스가 정의 되어 있다. FRegexPattern 이라는 클래스로 엔진 경로 "UE_5.2\Engine\Source\Runtime\Core\Public\Internatio..