게임 엔진

게임 엔진/Unity

[Unity] C# Event 컨벤션 정리

Event Convention C#의 이벤트 관련 컨벤션은 꽤나 복잡하다. 개발하는 조직에 따라서도 많이 달라질 수 있으므로 네이밍 컨벤션의 경우에는 현재 속한 조직에 맞게 적용하는것이 바람직할 것이다. 다만, 유니티에서 이벤트와 연관된 개념들이 어떻게 분리되어야 하는지, 어떤 그룹으로 구분되어야 하는지에 대해서는 정리해둘 필요가 있다. 구분 기준을 명확하게 정해두었다면 조직에 따라 네이밍 기준이 달라지더라도 개발에 있어서 컨벤션을 통한 생산성을 극대화시킬 수 있을 것이다. 다음은 MS에서 제공하는 이벤트 네이밍 컨벤션이다. https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members#names-of-ev..

게임 엔진/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의 기능을 이용하는 경우 어플리케이션은..

게임 엔진/Unity

[Unity] 유니티 설계 경험 기록

유니티 설계 경험유니티를 이용하면서 내가 경험한 내용을 정리한 글이다. 이 글은 유니티를 개발하는 과정 속에서 지속적으로 업데이트 될 예정이다. 핵심 개념다음 개념들은 알고 시작하는 것이 좋다. 유니티 버전단위 문서유니티 버전에 따른 매뉴얼이다. 이 문서를 통해 대부분의 유니티 관련한 이용방법을 숙지할 수 있다.https://docs.unity3d.com/2021.2/Documentation/Manual/index.html Unity - Manual:  Unity User Manual 2021.2Use the Unity Editor to create 2D and 3D games, apps and experiences. Download the Editor at unity3d.com. The Unity Us..

게임 엔진/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..

게임 엔진/Unity

[Google Play] 구글 플레이 결제 시스템(IAP) 세팅

Google Play IAP 백엔드 설정 Google Play Console을 이용하여 안드로이드 앱에 결제 시스템(IAP)을 붙일 수 있다. 하지만 대부분의 서비스는 이러한 결제 정보를 따로 관리하는 백엔드 시스템을 구축해야한다. 이 작업이 왜 필요할까? 예를 들어 어떤 게임 유저가 결제를 통해 얻은 아이템이 있다고 해보자. 게임을 하다가 실수로 게임 앱을 지웠다가 다시 깔면 어떻게 될까? 따로 백엔드 서버거 없는 클라이언트 게임 앱의 경우, 결제 데이터가 남아있지 않을 것이다. 그러므로 백엔드 서버가 이러한 게임 데이터에 대한 내용을 모두 기록하고 있도록 하고, 다시 앱을 설치할 때 그 데이터를 로드하도록 해야한다. 하지만 이렇게 백엔드를 구축할 때 반드시 해주어야 하는 작업이, 어떤 클라이언트로부터..

게임 엔진/Unity

[Google Play] 구글 플레이 게임 서비스 세팅

Google Play Game Service Google Play에 게임 앱을 올리고 모바일에서 Google Play에 로그인까지 가능하도록 해보자. 먼저 Google Play Console에 앱을 올리는 방법에 대해 알아둘 필요가 있다. 다음 링크를 참고하자. 이 링크를 통해 개발자 계정 등록과 Google Play Console의 기본적인 세팅까지 작업해야한다. (게임 앱으로 등록해야하기 때문에 앱 게시까지는 할 필요없음) https://algorfati.tistory.com/90 Google Play Console Google Play에 앱을 출시하기 위해서는 Google Play Console을 이용하여야 한다. Google Play Console 페이지 링크 play.google.com/cons..

게임 엔진/Unity

[Unity] [Example] 유니티에서 데이터 관리 방법(ScriptableObject)

ScriptableObject ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너이다. ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄이는 것이다. 이는 연결된 MonoBehaviour 스크립트에 변경되지 않는 데이터를 저장하는 프리팹이 있는 프로젝트의 경우 유용하다. 프리팹은 인스턴스화할 때마다 해당 데이터의 자체 사본이 생성된다. 이처럼 중복 데이터를 저장하는 대신 ScriptableObject를 이용하여 데이터를 저장한 후 모든 프리팹의 레퍼런스를 통해 액세스할 수 있다. 즉, 메모리에 데이터 사본을 하나만 저장한다. https://www.youtube.co..

게임 엔진/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..

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