TCP Socket을 구현하는 방법들 TCP Socket은 네트워크 레벨에서의 기능을 담당한다. Connect, Read, Write, Disconnect 등등과 같은 기능들이 있을 것이다. 다만 이 소켓을 이용한 함수들을 이용하는데에는 필연적으로 직면하게 되는 문제가 있다. 네트워크 레벨을 통해서 데이터를 주고받아야 하기 때문에, 네트워크 레벨에서 버퍼에 데이터가 모두 준비되지 않았을 경우, 이 상황을 어떻게 처리해야할까? 이러한 문제에 대해 여러가지 방법으로 대응이 가능하다. 다음과 방법들이 있다. 1. Blocking I/O TCP 소켓의에서 Blocking I/O는 가장 간단하고 일반적으로 사용되는 접근 방식이다. Blocking I/O를 이용하여 Socket의 기능을 이용하는 경우 어플리케이션은..
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..
언리얼 메모리 관리 시스템 스마트 포인터와 가비지 컬렉터는 메모리 관리를 위한 개념들로 프로그래밍 영역에서 굉장히 일반적으로 통용되는 개념이다. 언리얼은 스마트 포인터와 가비지 컬렉터(GC)를 모두 사용하여 메모리를 관리하는데, 두 개념 모두 c++로 자체 제작한 코드를 이용한다. 순수 c++을 이용하는 상황에서는 스마트 포인터들을 사용하고, UObject와 관련된 부분에서는 GC를 사용한다. Smart Pointer 1. TUniquePtr 메모리의 유일한 소유권을 넘겨주고, 해제를 자동화한 개념. (c++ stl의 unique_ptr과 대응된다.) 일반적인 포인터와 달리 객체가 파괴될 때 소유한 메모리도 해제한다. 아래 예제를 보자. 해당 코드대로 실행 시 메모리는 해제되지 않고 남아있게 된다. 이러..
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/..
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..
Serialization (Memory Archive) 언리얼에서 제공하는 기본적인 메모리 직렬화 객체 FMemoryArchive를 활용한 예제이다. 언리얼에서는 메모리 읽기, 쓰기 기능을 지원하기 위해 FMemoryArchive를 상속하여 FMemoryReader, FMemoryWriter 형태로 제공한다. #include "Serialization/MemoryWriter.h" #include "Serialization/MemoryReader.h" void SerializationExamples::BaseExample() { UE_LOG(LogTemp, Log, TEXT("BaseExample Begin")); // write data to memory TArray BufferArray; FMemory..
Asset Path Pick Dialog 예제 다음 코드로 에셋의 경로를 가져오는 다이얼로그를 띄울 수 있다. if문 내부에서 다이얼로그가 닫히고, 가져온 경로를 사용할 수 있다. FString NewNameSuggestion = FString(TEXT("Suggestion")); FString PackageNameSuggestion = FString(TEXT("/Game/")) + NewNameSuggestion; FString Name; TSharedPtr PickAssetPathWidget = SNew(SDlgPickAssetPath) .Title(LOCTEXT("MyTitleName", "Choose Your Location")) .DefaultAssetPath(FText::FromString(P..
Custom Slate Class 만들기 Slate를 이용한 커스텀 클래스 ui 제작 예제이다. 참고 영상 https://www.youtube.com/watch?v=jeK6DPB5weA MyPlugin.Build.cs ... PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); ... SMainMenuWidget.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "SlateBasics.h" #include "SlateExtras.h" class MENU_API SMainMenuWidget..
Plugin Start Unreal plugin 시작방법 예제이다. 1. 메뉴바 -> 편집 -> 플러그인 2. 오른쪽 하단 새 플러그인 클릭 3. 에디터 툴바를 사용하는 "에디터 툴바 버튼"으로 플러그인 생성 (MyPlugin) 4. 프로젝트 재시작 시 에디터 툴바에 MyPlugin을 확인할 수 있음 5. 플러그인 소스는 visual studio 프로젝트에서 수정할 수 있음 모듈 기본 코드 Header #pragma once #include "CoreMinimal.h" #include "Modules/ModuleManager.h" class FToolBarBuilder; class FMenuBuilder; class FMyPluginModule : public IModuleInterface { publi..
Collision by Animation Notify 애니메이션 notify를 통해 캐릭터 객체의 공격 궤적에 따른 충돌처리 예제이다. Header // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "MyCharacter.generated.h" class UStaticMeshComponent; UCLASS() class ANIMATIONRETARGET_API AMyCharacter : public ACharacter { GENERATED_BODY() public: /..
Physics Collision with AggregateGeom Shapes 캐릭터가 공격할때 오른손 캡슐에 의한 충돌판정을 위한 예제이다. Physics Asset 먼저 충돌판정에 사용할 BodyInstance이다. 이후 코드를 통해 이 BodyInstance의 궤적에 따른 충돌을 판정할 것이다. Header #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "MyCharacter.generated.h" class UStaticMeshComponent; UCLASS() class ANIMATIONRETARGET_API AMyCharacter : public ACharacter { GENERATED_BO..
Console Command Unreal 콘솔 커맨드 관련 예제이다. Source #include "HAL/IConsoleManager.h" ... // call this from start - ex) gamemode being void Utility::InitConsoleCommand() { FConsoleCommandWithArgsDelegate Delegate; Delegate.BindStatic(&Utility::ConsoleCommand); IConsoleManager::Get().RegisterConsoleCommand( TEXT("insooneelifeCmd"), TEXT("insooneelife test cmd"), Delegate); } // this is static function v..
Data Asset Unreal engine에서 파일에 저장된 데이터를 읽어오거나, 파일로 데이터를 저장하는 형태로 데이터를 사용해야 하는 상황이 생길 수 있다. 이러한 상황에서 엔진에서 지원하는 data asset을 이용하면 효과적이다. Data asset을 이용하기 위해서 먼저 사용하고자 하는 data 형태를 c++로 작성한다. Data Asset 정의하기 #include "Engine/DataAsset.h" UCLASS() class TESTWORLD_API UCustomDataAsset : public UPrimaryDataAsset { GENERATED_BODY() public: UPROPERTY(EditAnywhere) FString itemName; UPROPERTY(EditAnywhere)..