C++ 25

(1) errno와 파일 입출력

리눅스 운영체제에서 사용되는 시스템 함수는 에러가 발생했을 시 헤더에 정의된 전역 변수에 에러코드가 저장된다. extern int errno; 에러 코드에 대한 에러 메시지를 편하게 출력하기 위한 방법은 다음과 같다. #include void perror (const char* str); // ex if (open("file.txt", O_RDONLY) == -1) { perror("open failed."); } 파일 열기 open() #include #include #include int open (const char* name, int flags); int open (const char* name, int flags, mode_t mode); flags 인자 : O_RDONLY, O_WRONLY, ..

C++/linux 2022.05.10

[C++] libcurl (2) JSON 데이터 다루기

C++ 언어로 객체를 JSON 데이터로 직렬화하고 다시 스트링으로부터 역직렬화 하는 방법을 알아본다. Modern C++을 이용해서 JSON 데이터를 효과적으로 다루는 다음 공개 소스 코드를 사용한다. https://github.com/nlohmann/json GitHub - nlohmann/json: JSON for Modern C++ JSON for Modern C++. Contribute to nlohmann/json development by creating an account on GitHub. github.com nlohmnn json의 경우 header-only 라이브러리로 include 폴더 내의 json.hpp만 포함시키면 링크 없이 바로 적용할 수 있다. json_define.h #pr..

C++ 2022.04.17

[UE4] Behavior Tree 정리

관련 모듈 : 블랙보드, 비헤이비어 트리 : "AIModule", 네비게이션 "NavigationSystem", 태스크 클래스 : "GameplayTasks" Character(Pawn)에서 생성시 사용되는 컨트롤러를 지정 AIControllerClass = ASimpleAIController::StaticClass(); AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; AIController의 OnPossess(APawn* InPawn) 혹은 BeginPlay() 에서 BT 에셋과 BB 에셋을 등록 1) AIController의 멤버 BlackboardComponent와 블랙보드 에셋을 바인딩 bool AAIController::UseBlackboard..

C++/Unreal Engine 2021.10.15

[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

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

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

C++/Unreal Engine 2021.10.11

[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

[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

[UE4] 게임 플레이 프레임워크 (GameMode, PlayerController, Pawn)

참고 : https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Framework/ 플레이어를 중심으로 진행되는 게임 프레임워크를 구성하는 요소를 알아본다. GameMode : 게임의 규칙을 지정한다. PlayerController: 폰을 소유하여 플레이어의 조종 방법을 정의한다. Pawn: 플레이어의 실제 게임 공간상의 오브젝트를 지칭한다. PlayerController에 정의된 조종 방식을 사용하거나 고유 방법으로 Pawn의 동작 방식을 설계한다. 폰과 캐릭터 Pawn : 실제 월드 상의 Agent 역할을 하는 Actor 클래스로 Controller에 의해 소유될 수 있다. Character : 휴머노이드 방식의 폰 클래스를 지칭한다. 기본적..

C++/Unreal Engine 2021.09.30

[UE4] Actor 클래스

Actor 액터 클래스 레벨에 배치되는 모든 오브젝트를 지칭한다. 빛, 카메라, 스태틱 메시, 플레이어 시작지점 등이 액터에 속한다. 3D 변환을 지원하며 생성되고 삭제되는 라이프 사이클이 있다. 모든 Actor 클래스의 기반 클래스는 AActor이다. - 에디터 월드 아웃라이너 윈도우에서 씬에 존재하는 모든 액터를 확인할 수 있다. 액터의 속성은 디테일 윈도우에서 확인가능하다. - 모빌리티 (이동가능함) 액터 클래스는 게임 상황 중 이동 가능함을 암시하고 보통 Static Mesh Actors와 Light Actor에 해당한다. Mobility State Description Static (정적) Static Mesh Actors - 미리 계산된 라이트맵에 의해 생성되는 그림자를 갖게된다. 게임 중 움..

C++/Unreal Engine 2021.09.30

[자료 구조] 원형 버퍼 CircularBuffer

배열 기반 원형 버퍼 덱(deque)과 리스트(list)처럼 맨 앞과 맨 뒤의 데이터에 대한 접근이 가능하다. 이를 위해 Head와 Tail에 대한 인덱스가 존재한다. 새로 삽입되는 데이터는 TailIdx에 삽입되며 가장 먼저 꺼내지는 데이터는 HeadIdx가 지칭한다. 메모리의 연속성 이점을 사용하기 위해 배열로 많이 구현하여 사용할 수 있다. #pragma once #include #include template class CircularBuffer { private: static constexpr int MAX_QUEUE_LENGTH = 8; private: T m_arrBuffer[MAX_QUEUE_LENGTH]; int m_iTailIdx; int m_iHeadIdx; public: Circul..

C++/자료 구조 2021.08.23