전체 글
-
[Unreal Engine] C2027 : use of undefine type 'AHUD'Unreal Engine 5._ 2022. 12. 26. 15:02
GameMode를 오버라이드 하는 도중, HUD클래스를 읽어오지 못 하는 이슈가 발생했습니다. 문제가 된 코드는 다음과 같습니다. AMyGameMode::AMyGameMode() { static ConstructorHelpers::FClassFinder MyPawn( TEXT("_C")); if(MyPawn.Succeeded()) DefaultPawnClass = MyPawn.Class; static ConstructorHelpers::FClassFinder MyController( TEXT("_C")); if(MyController.Succeeded()) PlayerControllerClass = MyController.Class; static ConstructorHelpers::FClassFinder..
-
[Unreal Engine] C++ : Log를 남기는 여러가지 방법Unreal Engine 5._ 2022. 12. 6. 11:10
로그는 개발에 있어 가장 중요한 요소 중 하나입니다. 프로그램의 실행이 내 뜻대로 되지 않을 때, 실행 중간 중간의 기록을 남겨야 하는 상황 등 로그의 중요성은 말로 다 할 수 없습니다. 이번 글에서는 언리얼 엔진에서 로그를 출력하는 여러 방법에 대하여 살펴보도록 하겠습니다. 1. UE_LOG 더보기 로그를 남기는 가장 간단한 방법입니다. UE_LOG({Log category}, {Log verbosity level}, {Log message}); Log category 로그의 분류입니다. 기본적으로 LogTemp가 많이 사용됩니다. Log level 로그의 수준입니다. 다음의 7단계가 존재합니다. Fatal, Error, Warning, Display, Log, Verbose, VeryVerbose 로..
-
[Unreal Engine] Spawn actor with parametersUnreal Engine 5._ 2022. 10. 18. 18:49
C++에서 레벨에 액터를 생성하는 방법은 SpawnActor 함수를 이용하는 것 입니다. 이 때 생성되는 액터의 기본 생성자를 호출하기 때문에, 값을 초기화 하는 데 어려움이 있을 수 있습니다. 액터를 생성 후, 값을 설정하는 함수를 추가적으로 호출하는 것을 생각해보았지만, 구조적으로 불안하게 느껴졌습니다. 위 문제를 해결하기 위해 검색을 해본 결과를 공유하고자 합니다. 출처 Spawn actor with dynamic data (Unreal Engine Forums) 1. 기본적인 액터 생성 방법 (SpawnActor) 더보기 액터를 생성하고자 할 때에는 다음과 같은 코드를 사용할 수 있습니다. FTransform spawnTransform; AMyActor* act = GetWorld()->Spawn..
-
[Unreal Engine] Component가 Details Panel에서 안 보일 때Unreal Engine 5._ 2022. 10. 13. 12:25
C++로 특정 컴포넌트를 생성했을 때, 잘 작동이 되지만 에디터에서 볼 수 없는 경우가 있었습니다. 해결 방법은 간단했지만, 기록을 위해 남겨둡니다. 구체적인 예시를 들기 위한 예제입니다. ComponentTestActor.h protected UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Root") USceneComponent* DefaultRoot = nullptr; ComponentTestActor.cpp AComponentTestActor::AComponentTestActor() { DefaultRoot = CreateDefaultSubobject(TEXT("DefaultRoot")); SetRootComponent(DefaultRoot); U..
-
[C++] 랜덤 이벤트 (확률) 구현하기C++/미분류 2022. 10. 6. 17:51
이번 글에서 다룰 랜덤 이벤트 라는 것은 게임에서 발생할 수 있는, 다음과 같은 상황을 의미합니다. N%의 확률로 발생하는 ~ (후략) 동전 던지기, 트럼프 카드 뭉치에서 특정 카드를 뽑을 확률 등의 예시가 있을 수 있겠습니다. 위와 같은 기능의 구현에, 다음과 같은 코드를 사용할 수 있습니다. #include #include #include int main() { srand(time(NULL)); int number = rand() % 100 + 1; if(number > 50) std::cout
-
[Effective Modern C++] Lambda와 std::bindC++/Effective Modern C++ 2022. 10. 3. 15:57
std::bind를 간단하게 설명하면 함수에 매개변수를 지정하여 래핑(Wrapping)하는 기능입니다. 특정 매개변수에 대하여 고정된 값을 설정할 수 있는 부분에서 std::function과는 다른 차별점을 지니고 있습니다. std::bind는 실제로 특정 값을 고정한 함수를 만들 때 유용합니다. 그런데, 람다가 발표되면서 std::bind보다 람다를 쓰는 것이 좋아졌습니다. 이번 글에서는 람다가 std::bind보다 선호되는 이유에 대하여 살펴보도록 하겠습니다. 0. 이번 글의 시나리오 더보기 알람을 설정하는 함수를 만든다고 가정하도록 하겠습니다. // 특정 시간을 지정 using Time = std::chrono::steady_clock::time_point; // 특정 알람음을 지정 enum cla..
-
[Effective Modern C++] Lambda : auto 매개변수C++/Effective Modern C++ 2022. 9. 25. 13:30
C++14의 주요 기능 중 하나는, 람다 매개변수에 auto를 사용할 수 있게 된 것입니다. 이 기능의 구현은 람다의 클로저 클래스의 수정에 있습니다. auto f = [](auto x){ return normalize(x); } 다음과 같은 람다가 있을 때, 이 람다가 만드는 클로저 클래스의 operator()연산자는 다음과 같이 됩니다. class CLASS_GENERATED_BY_COMPILER { public: template auto operator()(T x) const { return normalize(x); } ... }; 이 코드는, 호출하는 함수에 따라 문제가 발생할 여지가 있습니다. 예를 들어 위 예제에서 호출한 normalize함수가 R-value와 L-value를 다른 방식으로 처..
-
[Effective Modern C++] Lambda : Init captureC++/Effective Modern C++ 2022. 9. 20. 09:08
람다를 사용하다 보면 값 캡쳐도 참조 캡쳐도 적절하지 않을 때가 있습니다. std::unique_ptr등의 이동 전용 객체를 사용하거나, 로직을 최적화 하기 위해 이동 연산을 사용하려 할 때가 그렇습니다. 위와 같은 경우는 객체를 클로저 내부로 이동시키는 것이 바람직한데, C++11에서는 그것이 용이하지 않습니다. 하지만 용이하지만 않을 뿐, 이동 연산을 흉내내는 방법이 있으며, C++14에서는 그것을 정식으로 지원합니다. 이번 글에서는 람다에 이동을 지원하는 매커니즘인 초기화 캡쳐 (Init capture)에 대하여 살펴보도록 하겠습니다. 1. Init capture 더보기 다음은 초기화 캡쳐를 사용하는 예제입니다. auto ptr = std::make_unique(); ... auto func = [..