본문 바로가기
Delegate를 인자로 사용하기 위한 방법 - 구조체 왜 Delegate를 인자로 사용하지 못할까?간단한 내부 구조DECLARE_DELEGATE_OneParam과 같이 선언한 Delegate 타입은 함수 포인터 + 캡처 객체주소를 포함하는 구조이다.MyDelegate.AddUObject(this, &AClassName::FunctionName);다음과 같이 사용한다면 AClassName이 함수 포인터(힙에 할당)이며 this가 캡처 객체 인스턴스 주소이다.즉, 내부적으론 어떤 함수를 가리키는 포인터, 그 함수가 멤버 함수라면 해당 객체에 대한 포인터가 있다.또한 바인딩 상태, 종류(멤버, 람다, 정적), 등록 해제 상태 등 다양한 값들이 관리가 된다. 그래서 왜 못하는가?Delegate는 내부적으로 함수 포인터 정보(힙 메모리) +  캡처 객체 정보로 이루.. 2025. 3. 25.
게임 시작 시 포커스가 뷰포트로 들어가게 하기 void APlayerController::BeginPlay(){ Super::BeginPlay(); FInputModeGameOnly GameOnlyInputMode; SetInputMode(GameOnlyInputMode);}다음과 같이 입력하면 되며GameOnlyInputMode의 의미가 게임 입력만 활성화하고 마우스 커서나 UI 포커스는 무시한다는 의미이다.즉, 시작하자마자 모든 입력처리는 게임 안에서 처리가 된다.SetInputMode()함수가 APlayerCotroller에 있는 함수임으로 PlayerController에서만 사용이 가능하다. 2025. 3. 21.
경로기반 Class & Object 정보를 들고오는 방법 Asset해당 Asset에서 우클릭하여 Copy Reference를 해준다.이렇게 Asset주소를 들고온 후 생성자에서 다음과 같이 TEXT에 붙여주면 된다.붙여넣기를 하면 앞부분과 마지막에 '가 하나 더 붙는데 이건 삭제해주면 된다.'부분을 삭제하지 않으면 Crash가 난다. 그리고 Class 정보를 들고오기에 _C를 붙여주면 된다.여기서 _C는 해당 BP의 Generated Class를 의미한다.  CPPCPP도 동일하게 Copy Reference를 해준다.붙여넣기하면 여기도 '가 생기는데 동일하게 삭제해주면 된다. C++ 직접 참조(StaticClass()) vs 경로 기반 로딩 (FClassFinder)C++직접 참조컴파일 타임에 타입 안정성을 검사한다.런타임 시에 오류 위험이 없다.StaticC.. 2025. 3. 21.
Unreal StaticClass() StaticClass()이 함수는 클래스의 UClass 객체를 반환하는 정적 메서드로 주어진 클래스에 대한 정보를 저장한다.특정 클래스의 인스턴스를 생성할 때 또는 해당 클래스와 관련된 작업을 수행할 때 유용하게 사용된다.더보기정적 메서드: 객체 인스턴스와 관련 없이 클래스 자체에 속하는 메서드이다.객체를 생성하지 않고 호출이 가능하며 보통 클래스의 공통 기능이나 유틸리티 기능을 제공하는데 사용된다.더보기UclassUClass는 UE에서 클래스를 정의하고 관리하는 시스템.모든 UObject 파생 클래스(Actor, Component)는 UClass를 통해 인스턴스를 생성하고 조작이 가능하다. 또한 클래스의 구조, 속성, 메서드, 가상 함수, 에디터 노출 등 다양한 메타 정보를 저장한다. StaticCla.. 2024. 10. 3.
C++ 람다 표현식 (Lambda expression) auto basicLambda = [] (int i) {cout C++ 코드를 보니 람다 표현식이 많이 나오는데 정확하게 무엇인지 몰라서 공부하게 되었다. 람다 표현식함수나 객체를 별도로 정의하지 않고 필요한 시점에서 바로 함수를 만들어 쓸 수 있는 일종의 익명함수이다.잘 사용하면 코드를 깔끔하게 만들 수 있다. 문법기본적인 문법auto basicLambda = [] {cout 람다 표현식은 람다 선언자(람다 소개자)라는 []로 시작하고 람다 표현식의 본문을 담는 {}가 나온다.람다 표현식은 auto 타입 변수인 basicLambda에 대입된다. auto basicLambda = [] (int i) {cout 람다 표현식도 일반 함수와 마찬가지로 ()안에 매개변수를 넣을 수 있다.람다 표현식에서 매개변수.. 2024. 9. 5.
Unreal Module 추가 방법 이번에 Enhanced Input System을 공부하면서 C++에서 #include "EnhancedInputSubsystems.h" 라는 헤더 파일을 추가하는 일이 생겼다. 이때 이 헤더파일을 추가하니까 에러가 생겼고 그 이유는 Module을 추가해주지 않았기 때문이었다. 이렇게 References에 Module이 있는데 우리가 프로젝트에 추가를 해줘야한다. Default로는 이렇게 되어 있고 Core, CoreUObject 등 String 값이 들어가 있는 곳에 다음과 같이 EnhancedInput이라는 Module을 추가해준다. 이래도 에러가 사라지지 않는다. 그 이유는 우리가 컴파일 할 때 자동적으로 일시적인 파일을 만들기 때문이다. 이 파일을 우리가 지우고 새로 만들어야한다. 해당 프로젝트가 .. 2023. 1. 26.
Unreal Axis Mapping (Unreal 움직임 만들기) Unreal에서 Brid라는 이름으로 Pawn을 부모로하는 C++을 만들면 Actor로 만들었을 때 보이지 않는 함수가 생기게 된다. Pawn과 Actor의 가장 큰 차이점은 Player의 Input을 받을 수 있다는 점이다. 이 과정을 순차적으로 알아보면 Edit -> Project Settings에 들어가서 Axis Mapping에서 +를 눌러준 후 추가를 해주고 추가된 칸 (MoveForward_Brid)의 +를 눌러주면 아래처럼 생기게 된다. 어떤 키로 설정할지는 좌측에 있는 키보드를 눌러 직접 키를 눌러주거나 Dropdown에서 찾아서 선택하면 된다. Scale은 해당 키를 눌렀을 때 넘어가는 값이다. 이제 이렇게 설정을 한 뒤 C++로 들어가서 header file에 MoveForward라는 .. 2023. 1. 22.
Unreal Default Subobject A라는 클래스가 있고 AMesh라는 Component를 추가한다고 가정해보자. 이 AMesh라는 Component를 추가하기 위해선 AMesh Default Subobject를 만들어야한다. Default Subobject는 제가 썼던 주제 중 Class Default Object와 비슷하게 동작한다. https://daisy0461.tistory.com/72 간단하게 모든 Default 프로퍼티를 갖고 있는 것이 Default Subobject이며 AMesh Default Subobject는 AMesh라는 Component의 Default 프로퍼티를 갖고 있는 것이다. Default Subobject를 만들 때 몇가지 정보를 줘야한다. Subobject의 Object Type을 정해줘야한다. 예를 들어.. 2023. 1. 18.
Unreal Class Default Object Unreal에서 A라는 Class를 만들게 되면 A라는 Class를 기반으로 A Class Default Object(CDO)를 생성한다. 이 Class Default Object는 Unreal Engine Reflection System을 가지고 있는 원본 Object이다. Unreal Engine이 시작할 때 혹은 컴파일 할때 만들어진다. 말이 조금 어려워 보이는데 간단하게 원본이라고 했다. 즉, Default 값을 들고 있다는 의미와 동일하다고 생각하면 된다. 이 Default 값은 A라는 Class를기반으로 World에 생성된 Blueprint Object들의 프로퍼티를 Reflection System에 접근해서 초기화시켜준다. 간단하게 A기반 BP Object의 값은 생성됐을 때 A Class .. 2023. 1. 17.