전체 글 262

[UE4] 디버깅 기록 UTextBlock의 TextDelegate

UE 4.27 기준 UI중에 블루프린트로 UTextBlock의 Text 설정을 함수를 만들어서 바인딩할 수 있으나 C++에서 해당 기능을 구현 중에 있었는데, 관련 델리게이트가 보이길래 UTextBlock의 TextDelegate를 이용하여 특정 이벤트가 발생했을 때 TextDelegate함수를 호출하고 다음과 같이 UI에 해당 내용을 바꾸려고 했다. //UPROPERTY(VisibleAnywhere, Category = UI, Meta = (PrivateAccess = true)); //class UTextBlock* AmmoText; AmmoText->SetText(AmmoText->TextDelegate.Execute()); 하지만 실제로는 한번만 실행되고 해당 델리게이트가 Empty가 되어 어디서..

C++/Unreal Engine 2021.10.11

[C#] 배열 / 컬렉션 / 인덱서

배열의 선언과 사용 데이터형식[] 이름 = new 데이터형식[용량]; - 5개 원소를 가지는 배열 int[] scores = new int[5]; 배열은 메모리가 연속적인 구조를 갖는다. 배열은 다음과 같이 3가지 방법으로 초기화할 수 있다. string[] array1 = new string[3] { "hello", "안녕", "Halo" }; string[] array2 = new string[] { "안녕", "Hello", "Halo" }; string[] array3 = { "안녕", "Hello", "Halo" }; ^연산자를 이용한 배열 인덱스 접근 c#8.0에서부터 ^숫자는 인덱스를 지칭하게 된다. 실제 타입은 System.Index 형식이다. ^숫자 = 배열.Length - 숫자의 의미를..

C#/C# 기본 2021.10.11

[UE4] 디버깅 기록 PostActorCreated / 월드에서 스폰시

게임 중 액터를 스폰시 사용하는 함수 T* SpawnedActor = GetWorld()->SpawnActor(...); 위 함수를 호출하게 되면 PostActorCreated()까지의 함수를 모두 호출한 액터를 반환한다. 정확히 생성자 -> PreRegisterAllComponents() -> PostRegisterAllComponents() -> PostActorCreated() -> 반환순으로 이루어진다. 플레이어 액터가 PostActorCreated()에서 무기(웨폰)액터를 소환한다면 무기 웨폰도 PostActorCreated()까지 호출된 상태이다. SetupAttachment vs AttachToComponent 두 함수 모두 첫번째 인자로 전달하는 씬 컴포넌트의 트랜스폼을 부모로 두는 함수이..

C++/Unreal Engine 2021.10.11

[C++ Thread] 동기화 방법에 따른 성능 비교

쓰레드 동기화 - 유저 모드 동기화 커널 모드로 전환하지 않고 동기화를 수행한다. 커널 모드보다 빠르지만 기능이 제한적이다. 크리티컬 섹션 Critical Section 스핀락 인터락 함수 기반 Interlocked Family of Function SRWLock Slim Reader/Writer Lock - 커널 모드 동기화 커널 모드로 전환하여 커널이 제공하는 동기화 방법을 사용한다. 느리지만 더 다양한 기능을 사용할 수 있다. 뮤텍스 Mutex 세마포어 Semphore 이름있는 뮤텍스 Named Mutex 이벤트 Event CriticalSection 뮤텍스처럼 락을 걸고 임계 영역을 진입하며 공유 자원을 사용한 이후 다시 반납한다. 생성과 소멸에 관한 함수 // 생성 void InitializeC..

[C++] 메모리 관리 (4) 정적 메모리 풀

정적 메모리 풀을 설계해본다. 정적 메모리 풀 정적 메모리 풀은 조각의 크기가 정해진 메모리를 배열처럼 사용하는 것으로 조각의 메모리 주소가 연속적이기 때문에 캐시에 유리하다. 또한 여러번 할당에서 한번 블록을 생성하는 것으로 줄이므로 동적할당 발생하는 비용을 줄일 수 있다. 임의의 타입 T에 배수만큼 큰 힙 메모리를 할당하여 T* pObject = new T;를 통해 동적할당할때 마다 미리 할당한 메모리 블록으로 부터 한 조각을 T 타입으로 초기화하여 반납하고 delete pObject;를 할때 다시 해당 조각을 반납한다. 인덱스를 이용한 요청과 반납 방식 조각 마다 인덱스를 부여하고 해당 인덱스는 큰 블록을 생성할 때 만들어준다. 메모리 요청시 현재 꺼내야하는 인덱스를 가지고 메모리 블록과 블록에서 ..

Advanced C++ 2021.10.10

[UE4] 디버깅 기록 Delegate / BeginDestroy

콜백을 지정하는 Delegate를 쓸 때 주의사항 Delegate는 함수가 바인딩 되어 있는지 확인하는 IsBound()함수가 있다. 바인드 되지 않은 델리게이트를 Execute()혹은 Broadcast() 시 런타임 에러가 발생한다. (어설션 실패) Clear()는 바인드 된 함수를 모두 제거하는 데 바인드된 함수가 없어도 런타임 에러가 발생하지 않는다. Delegate로 설정할 바탕 함수(실질적인 함수)는 반드시 UFUNCTION으로 등록해 엔진이 찾을 수 있게한다. ※ 2021-10-09 가끔씩 델리게이트 함수 오류로 보이는 가비지 컬렉터가 메모리를 지우거나 pure virtual function is calle와 같은 크래시가 발생하는데 델리게이트 함수를 사용하는 클래스에서 BeginDestroy..

C++/Unreal Engine 2021.10.09

[C#] 프로퍼티

클래스의 필드에 안전하게 접근하는 방법과 수정하는 방법을 제공한다. class CLASSNAME { 데이터 형식 FIELD_NAME; 접근한정자 데이터 형식 PROPERTY_NAME { get { return FIELD_NAME; } set { FIELD_NAME = value; } } } C#에서 클래스 필드를 접근하는 방법에 대해 GetXXX(), SetXXX()를 우아한 방법으로 선언할 수 있다. - 예시 class MyClass { private int data; public int Data { get { return data; } set { data = value; } } } 값을 변경하고 싶지 않다면 get만 선언하여 읽기 전용 프로퍼티를 만들 수 있다. class ReadOnlyClass {..

C#/C# 기본 2021.10.08

[UE4] 생성과 관련된 호출 함수

AActor 관련 Actor를 레벨에 배치하거나 스폰시킬 때 호출되는 함수 https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/GameFramework/AActor/ 함수 설명 연계되는 호출 virtual PostLoad() 에디터나 게임 플레이 도중 혹은 디스크에서 로드되어 배치된 경우 제일 처음으로 호출된다. UActorComponent::OnComponentCreated() 로드된 경우를 제외하고 모든 생성된 컴포넌트에 호출된다. virtual PreRegisterAllComponents() Actor의 생성 도중 호출되며, native root component를 가지고 있는 상태이다. UActorComponent::RegisterCompon..

C++/Unreal Engine 2021.10.08

[C#] 인터페이스와 추상 클래스

인터페이스 interface interface ILogger { void WriteLog(string message); } 클래스와 비슷한 인터페이스는 필드를 가지지 않으며 메서드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다. 정의한 메서드가 구현부가 없어도 되며 인터페이스를 상속하는 클래스에서 반드시 해당 메서드(혹은 프로퍼티)를 구현할 것을 강제한다. 인터페이스에 접근 제한자를 사용할 수 없으며 기본적으로 public이다. 인터페이스는 인스턴스화가 불가능하고 인터페이스 메서드를 모두 구현한 파생클래스를 인스턴스화 하여 사용한다. ILogger 인터페이스를 상속한 다양한 파생 클래스 class ConsoleLogger : ILogger { public void WriteLog(string message..

C#/C# 기본 2021.10.07

[C#] 클래스

C# 클래스 클래스 선언 class Cat { public string Name; public string Color; public void Meow() { Console.WriteLine("{0} : 야옹", Name); } // 기본 생성자 public Cat() { Name = "미정"; Color = "알 수 없음"; } ~Cat() { Console.Write("안녕 {0}", Name); } } 필드(속성)과 메소드로 구성된다. 기본 생성자를 정의하지 않으면 컴파일러가 만들어 주며 소멸자는 객체가 소멸될 때 호출된다. C# 클래스 인스턴스 static void Example1() { // 모든 C# 클래스는 복합 데이터 형식으로 참조 형식이다 // 힙 메모리에 개체를 동적 할당하고 그 메모리를..

C#/C# 기본 2021.10.06