게임 엔진/Unreal

게임 엔진/Unreal

[Unreal] [DateTime] 시간 관리 구조체

DateTime DateTime은 언리얼에서 시간을 관리하기 위해 사용하는 구조체이다. 다음과 같이 현재 시간에 대한 정보를 얻을 수 있다. FDateTime CurrentTimestamp = FDateTime::Now(); 얻은 타임스탬프를 초로 환산하고 싶은 경우 다음과 같이 한다. FDateTime CurrentTimestamp = FDateTime::Now(); FDateTime UnixEpochTime = FDateTime(1970, 1, 1); double TotalMilliseconds = (CurrentTimestamp - UnixEpochTime).GetTotalMilliseconds(); 두 타임스탬프를 비교하고 싶은 경우 둘 다 초로 환산하여 비교하면 된다. 타임스탬프를 직접 비교하는..

게임 엔진/Unreal

[Unreal] [Networking] Http Module 사용 및 API Handler 개발

Unreal HTTP Request HttpModule은 언리얼에서 Rest API를 편하게 이용할 수 있도록 설계될 모듈이다. 현재 프로젝트의 MyExample.Build.cs 파일에서 다음 모듈들을 포함시켜준다. PrivateDependencyModuleNames.AddRange( new string[] { "HTTP", "JsonUtilities", "Json" }); Header // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "Runtime/Online/HTTP/Public/Http.h" #inclu..

게임 엔진/Unreal

[Unreal] [Networking] TCP Socket을 이용한 Client 개발

TCP Socket을 구현하는 방법들 TCP Socket은 네트워크 레벨에서의 기능을 담당한다. Connect, Read, Write, Disconnect 등등과 같은 기능들이 있을 것이다. 다만 이 소켓을 이용한 함수들을 이용하는데에는 필연적으로 직면하게 되는 문제가 있다. 네트워크 레벨을 통해서 데이터를 주고받아야 하기 때문에, 네트워크 레벨에서 버퍼에 데이터가 모두 준비되지 않았을 경우, 이 상황을 어떻게 처리해야할까? 이러한 문제에 대해 여러가지 방법으로 대응이 가능하다. 다음과 방법들이 있다. 1. Blocking I/O TCP 소켓의에서 Blocking I/O는 가장 간단하고 일반적으로 사용되는 접근 방식이다. Blocking I/O를 이용하여 Socket의 기능을 이용하는 경우 어플리케이션은..

게임 엔진/Unreal

[Unreal] [Example] Editor에 Asset 생성 및 저장

Create Asset to Editor Unreal 에디터에 c++을 이용하여 원하는 에셋을 생성하는 예제이다. Target Asset Data Asset을 이용하기 위해서 먼저 사용하고자 하는 데이터 형태를 c++로 작성한다. #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "MyPrimaryDataAsset.generated.h" UCLASS() class TESTPROJECT_API UMyPrimaryDataAsset : public UPrimaryDataAsset { GENERATED_BODY() public: UPROPERTY(EditAnywhere) FString ItemName; UPROPERTY(EditAnywhere) U..

게임 엔진/Unreal

[Unreal] 플러그인과 모듈

Module 언리얼에는 모듈이라는 개념이 있다. 모듈은 언리얼 엔진의 기본 구성요소이다. 모든 언리얼 엔진 프로젝트는 최소 하나의 primary모듈, 하위 모듈, thirdparty 모듈, plugin모듈들의 집합으로 구성된다. 각 모듈은 일정한 함수들을 (경로와 전처리를 포함하여) 캡슐화하고, 다른 모듈에서 사용할 수 있도록 공용 인터페이스와 컴파일 환경을 제공한다. 모듈은 C# 소스파일에 .build.cs 확장자로 선언되고, 프로젝트의 Source 디렉터리 아래에 저장된다. c++ 소스 파일들은 .build.cs 파일 옆이나 그 하위 디렉터리에 저장된다. 각 .build.cs 파일에서는 ModuleRules라는 c# 객체를 상속받은 객체를 정의하고, 이 객체 내부에서 어떻게 빌드할지를 제어하도록 프로..

게임 엔진/Unreal

[Unreal] Android 디버깅 방법들

안드로이드 앱에 대해 로깅이 필요할 수 있다. 선행작업 안드로이드 앱을 로깅하기 위해서는 먼저 선행되어야 하는 부분이 있다. 앱이 shipping으로 빌드되면 로그가 나타나지 않기 때문에 다음과 같이 빌드를 해야한다. 1. 프로젝트 세팅 -> 플랫폼 -> Android -> 앱 번들 -> 앱 번들 생성 = false 2. 프로젝트 세팅 -> 프로젝트 -> 패키징 -> 프로젝트 -> 빌드 환경설정 = Development, 배포용 = false 빌드된 apk파일을 모바일폰에 설치하고, 모바일폰을 usb로 연결한다. 언리얼 에디터를 이용한 방법 언리얼 에디터에서 모바일 디바이스 로그를 확인하기 위해 디바이스 출력 로그를 실행시킨다. 창 -> 개발자 툴 -> 디바이스 출력 로그 밑에 미확인 디바이스를 탭 하여..

게임 엔진/Unreal

[Unreal] 언리얼로 Google Play 결제 시스템 이용하기

언리얼에서 google play 결제 시스템을 이용하기 위한 메뉴얼이다. 언리얼 시스템은 google play 결제 시스템을 한번 래핑해 두었기 때문에, 결제 시스템을 구축하기 위해서 해주어야 할 작업이 google play 결제 관련 공식 문서와 조금 다르다. 준비해주어야 할 것들이 있다. 1. Google Play Console의 internal test 준비. (internal test 링크로 다운받은 앱으로 테스트하는것이 좋다.) 다음 링크를 참고하여 Google Play Game Services에 내부테스트까지 등록하자. algorfati.tistory.com/90 Google Play Console Google Play에 앱을 출시하기 위해서는 Google Play Console을 이용하여야 ..

게임 엔진/Unreal

[Unreal] 언리얼 안드로이드 프로젝트 Google Play에 출시하기

언리얼로 안드로이드 프로젝트를 만들 수 있도록 환경세팅을 하고, 프로젝트를 패키징하고, Google Play Game Service에 출시가 가능하도록 세팅하는 방법에 대한 내용이다. 안드로이드 스튜디오 먼저 Android Studio를 설치하고 Android SDK를 연동하여, 언리얼에서 안드로이드 작업이 가능하도록 한다. docs.unrealengine.com/en-US/SharingAndReleasing/Mobile/Android/Setup/AndroidStudio/index.html Setting Up Android SDK and NDK for Unreal How to set up your Android development environment for Unreal 4.25 and later do..

게임 엔진/Unreal

[Unreal] 언리얼 Tick 시스템

Tick Tick이란 코드나 블루프린트 스크립트를 프레임과 같은 일정한 주기로 실행시키는 것을 의미한다. 게임의 Actor, Component들이 Tick을 수행하는 상대적인 순서를 이해하는 것은 게임 실행 방식의 일관성을 보장하고, 또 엔진에서 따로 수행되는 작업과의 Tick이 어긋나며 생기는 문제를 피할 수 있다. Actor와 Component는 설정된 최소 시간 간격으로 프레임 Tick을 설정할 수도 있고, Tick을 전혀 하지 않도록 할 수도 있다. 또한 엔진의 프레임 별 업데이트 루프에서 서로 다른 단계에서 Grouping이 가능하며, 특정 Tick이 완료될 때까지 기다리도록 설정도 가능하다. TickFunction 언리얼 엔진에서 Tick을 어떻게 발생시키는지 알아보자. 가장 기본적으로는 FT..

게임 엔진/Unreal

[Unreal] 언리얼 프로젝트 소스코드를 옮기는 방법 (Redirect)

언리얼 엔진을 사용하다 보면 가끔 프로젝트 소스를 다른 프로젝트로 옮겨야 하는 상황이 생긴다. Blueprint나 기본 리소스들의 경우 이주를 통해 쉽게 옮길 수 있다. 하지만 c++ 소스코드의 경우 옮기는 과정이 어렵다. 예를들어 모듈 이름 AAA라는 프로젝트 에서 모듈 이름 BBB라는 프로젝트로 소스코드를 옮겨서 빌드하면, 코드 내 클래스들의 이름은 같지만, 내부적으로는 다음과 같이 저장된다. (옮겨지는 클래스 이름이 MyClass라고 가정) "/Script/AAA.MyClass" -> "/Script/BBB.MyClass" 엔진 내부에서 이름이 같더라도 다른 URL로 클래스를 인식하기 때문에, 이렇게 코드를 옮겨놓은 상태에서 Contents를 옮기게 되면, c++ 소스와 연결고리가 있는 모든 파일들..

게임 엔진/Unreal

[Unreal] 언리얼 메모리 관리 시스템 (Smart Pointer, GC)

언리얼 메모리 관리 시스템 스마트 포인터와 가비지 컬렉터는 메모리 관리를 위한 개념들로 프로그래밍 영역에서 굉장히 일반적으로 통용되는 개념이다. 언리얼은 스마트 포인터와 가비지 컬렉터(GC)를 모두 사용하여 메모리를 관리하는데, 두 개념 모두 c++로 자체 제작한 코드를 이용한다. 순수 c++을 이용하는 상황에서는 스마트 포인터들을 사용하고, UObject와 관련된 부분에서는 GC를 사용한다. Smart Pointer 1. TUniquePtr 메모리의 유일한 소유권을 넘겨주고, 해제를 자동화한 개념. (c++ stl의 unique_ptr과 대응된다.) 일반적인 포인터와 달리 객체가 파괴될 때 소유한 메모리도 해제한다. 아래 예제를 보자. 해당 코드대로 실행 시 메모리는 해제되지 않고 남아있게 된다. 이러..

게임 엔진/Unreal

[Unreal] 언리얼 엔진 디버깅

Editor Debug Symbol 엔진 코드를 디버깅해야하는 상황이 생길 수 있다. 에픽게임즈 라이브러리에서 Editor Debug Symbol을 설치하면 엔진 코드 디버깅이 가능하다. 추가로, 코드 최적화로 인해 중단점을 놓지 못하거나, 콜스택이 생략되는 문제가 있는데, 이 경우 Visual Studio의 Editor configuration을 DebugGame Editor로 설정하면 된다. 에픽 게임즈 런처 디버깅을 위한 편집기 기호 설치 Full Build Unreal Engine 다른 방법으로 언리얼 엔진을 풀빌드하는 방법도 있다. 다음 링크를 통해 언리얼 엔진을 클론하고, 디버깅 심볼도 포함되도록 풀빌드하면 엔진 코드를 디버깅할 수 있다. 또한, 이 방법을 이용한다면 엔진코드 자체를 수정할수도..

게임 엔진/Unreal

[Unreal] [Example] 인공지능 에이전트 (AISense)

인공지능을 제작할 때, 인공지능의 인지능력을 개발해야하는 상황이 생긴다. 인지능력의 예로는, 주변 객체들을 시각적으로 인지함, 주변 객체의 소리를 인지함, 주변 객체로부터의 공격을 인지함, 등의 상황을 생각해볼 수 있다. AISense를 사용하기 위해서는 필요한 객체들은 다음과 같다. 1. 인공지능이 들어간 객체 (Pawn) 2. 인지능력을 통해 Pawn을 조종할 객체 (AIController) 3. 인지능력들을 관리할 객체 (AIPerception) 4. 추가될 인지능력들 (AISense_Sight, AISense_Damage) Pawn (AAICharacter.cpp) // 공격을 받으면 이 함수를 호출해준다. // ex) Player가 인공지능을 공격 시, Player의 함수에서 이 함수를 호출 b..

게임 엔진/Unreal

[Unreal] 테이블 데이터 이용 방법 (DataTable)

Data Table 대량의 데이터를 table 형태로 관리해야하는 상황도 생길 수 있다. 이런 경우 unreal engine의 data table을 사용하면 유용하다. 소스코드 #include "Engine/DataTable.h" USTRUCT() struct FPhysicsPoseData : public FTableRowBase { GENERATED_USTRUCT_BODY() UPROPERTY(EditAnywhere) float x; UPROPERTY(EditAnywhere) float y; UPROPERTY(EditAnywhere) float z; UPROPERTY(EditAnywhere) float quatX; UPROPERTY(EditAnywhere) float quatY; UPROPERTY(Ed..

게임 엔진/Unreal

[Unreal] [Example] Delegate 사용방법

Delegate언리얼 엔진에서도 delegate을 이용할 수 있다. 먼저 delegate의 시그니쳐를 정의하여한다. 시그니쳐는 언리얼에서 제공하는 메크로를 통해 정의할 수 있는데, 싱글 delegate와 멀티 delegate가 있다. 싱글 delegate에는 함수를 한 개만 bind 가능하지만, 멀티 delegate에는 여러개의 함수를 bind 할 수 있다. 그리고 메크로에 몇개의 파라메터를 넣을 것인지까지 메크로 이름으로 구분되어 있다. 일반 delegate와 달리 다이나믹 delegate가 있는데 이는 블루프린트에서도 이용이 가능한 delegate이다.// 싱글 일반 delegate, 파라메터 x DECLARE_DELEGATE(FDelegateSingleSignature); // 싱글 일반 deleg..

게임 엔진/Unreal

[Unreal] [Example] 타이머 이용 방법 (Timer)

익명 타이머 { FTimerHandle UnusedHandle; float Duration = 0.1f; bool bLoop = false; GetWorldTimerManager().SetTimer( UnusedHandle, this, &ClassName::FunctionName, Duration, bLoop); } 람다를 이용한 등록 { FTimerHandle TimerHandle; FTimerDelegate TimerCallback; TimerCallback.BindLambda( [this, FaceId] { // .. }); World->GetTimerManager().SetTimer(TimerHandle, TimerCallback, 1.0f, false); } 타이머 등록/제거 FTimerHand..

게임 엔진/Unreal

[Unreal] [Example] C++에서 Blueprint 호출, Blueprint에서 C++ 호출

1. C++에서 Blueprint 함수를 호출하는 방법 UFUNCTION(BlueprintImplementableEvent, Category = "Blueprint") void K2_CreatePickupWidget(AActor* InOwner, TSubclassOf WidgetClass, APickupActor* PickupActor); void CreatePickupWidget(AActor* InOwner, TSubclassOf WidgetClass, APickupActor* PickupActor) { K2_CreatePickupWidget(InOwner, WidgetClass, PickupActor); } 이후 구체적인 구현은 상속된 blueprint 에서 마무리 지어준다. 호출은 c++에서 가능하..

게임 엔진/Unreal

[Unreal] 인공지능 에이전트 개발 방법 (AIController, BehaviorTree, Blackboard, Decorator, Service, Task)

AIController 먼저 AIController를 만든다. AIController는 언리얼 인공지능을 위한 가장 핵심적인 개념이다. Pawn에 의해 소유될 수 있고, 자체적인 로직이나 behavior tree를 이용한 로직을 통해 인공지능을 표현할 수 있다. 그리고 모든 AIController는 server에서만 존재할 수 있다. ShooterAIController.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AIController.h" #include "PhysicsNNAnimationComponent.h" #inc..

게임 엔진/Unreal

[Unreal] 프로퍼티 관련 예제

언리얼 구조체를 Property로 사용하는 방법 USTRUCT(Blueprintable) struct FTestStructData { GENERATED_USTRUCT_BODY() UPROPERTY(EditAnywhere) float x; UPROPERTY(EditAnywhere) float y; UPROPERTY(EditAnywhere) float z; UPROPERTY(EditAnywhere) float quatX; UPROPERTY(EditAnywhere) float quatY; UPROPERTY(EditAnywhere) float quatZ; UPROPERTY(EditAnywhere) float quatW; }; class PHYSICSANIMATION_API TestCharacter : publi..

게임 엔진/Unreal

[Unreal] Interface 이용 방법

언리얼 Interface 이용 방법 Unreal engine에서도 interface를 사용할 수 있다. 먼저 기본적인 C++ 인터페이스에 대해 이해하기 위해 다음 글을 참고하면 좋다. https://algorfati.tistory.com/205 [C++] C++에서 Interface 구현 방법 인터페이스란? Java나 C#과 같은 언어들을 보면 Interface라는 강력한 개념이 존재한다. 인터페이스는 객체에 대한 명세서만 나타내고 구체적인 구현은 각 파생 객체에서 작업하도록 한다. 명세서에 algorfati.tistory.com Interface를 TSharedPtr의 형태로 이용하는 예제를 만들어보자. class IInterfaceA { public: virtual ~IInterfaceA() {} v..

게임 엔진/Unreal

[Unreal] [Example] Animation에서 Physics Velocity 계산

Animation 데이터의 delta transform을 계산하여 각 body에 대한 물리 선형속도, 각속도를 만들어보는 예제이다. TestUtils.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" class UWorld; class USkinnedMeshComponent; class USkeletalMeshComponent; class PHYSICSANIMATIONCPP_API TestUtils { public: TestUtils(); ~TestUtils(); public: static const TArray BoneNames; static..

게임 엔진/Unreal

[Unreal] [Example] Transform

언리얼 Transform 관련 예제이다 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "TestActor.generated.h" UCLASS() class PHYSICSANIMATIONCPP_API ATestActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ATestActor(); protected: // Called when the game ..

게임 엔진/Unreal

[Unreal] [Editor] Slate를 이용한 커스텀 에디터 List View 제작

Slate List View Slate ListView 예제이다. 다음과 같은 ui를 제작 할 수 있다. SMyListViewWidget.h #pragma once #include "CoreMinimal.h" #include "SlateFwd.h" #include "SlateBasics.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Input/Reply.h" #include "Widgets/SWidget.h" #include "Widgets/SCompoundWidget.h" #include "Widgets/Views/STableViewBase.h" #include "Widgets/Views/STableRow.h" #include "Widgets/..

게임 엔진/Unreal

[Unreal] [Editor] 프로퍼티 에디터 제작 방법

Detail Editor Customization 언리얼 커스텀 에디터를 제작함에 있어서 가장 중요한 부분인 custom property editor를 제작하는 내용이다. Property editor란 다음과 같이 사용자가 정의한 어떤 데이터의 프로퍼티를 언리얼 ui상에 표시하고, 또 수정할 수 있도록 해주는 editor이다. Modules 다음 모듈들을 미리 추가해두자. PrivateDependencyModuleNames.AddRange( new string[] { "Projects", "InputCore", "UnrealEd", "LevelEditor", "CoreUObject", "Engine", "Slate", "SlateCore", "EditorScriptingUtilities", "Editor..

AlgorFati
'게임 엔진/Unreal' 카테고리의 글 목록