Editor Customize 유니티에서 에디터를 커스터마이징 하는 방법이다. 에디터 커스터마이징은 개발자로 하여금 유니티 에디터 자체에 특정 기능을 추가하는 방법이다. 예를 들면 인스펙터의 스크립트에 어떤 버튼을 누르면 자동으로 에셋들을 로드해준다거나, 자동으로 맵을 생성해준다거나 등등 잘 활용한다면 개발하는데 굉장한 편의성을 갖출 수 있다. (이전에 근무하던 팀에서는 따로 에디터만 작업하는 개발자들도 있었다.) 유니티 에디터 커스터마이징을 하기에 앞서 몇가지 알아두어야 하는 개념들이 있다. 먼저 유니티의 에디터 코드가 동작하는 레벨에 대해 알아두어야 한다. 우리가 일반적으로 이용하는 C# 스크립트들은 모든 레벨에서 이용된다. 즉 에디터에서도 동작하고, 빌드된 디바이스에서도 동작한다. 하지만 에디터 코..
Pathfinder with Animation Movement 기본적으로 Unity에서는 NavMeshAgent를 지원한다. 이 컴포넌트를 이용한다면 굉장히 쉽게 길찾기(Pathfinding)가 가능한 오브젝트를 제작할 수 있다. 하지만, NavMeshAgent의 SetDestination함수를 이용하면 타겟 위치를 주었을 때 해당 위치까지 이동시키는 기능을 쉽게 구현할 수 있다. 하지만 이 함수는 GameObject의 Transform을 엔진 코드 내에서 직접 수정하도록 설계되어 있고, 이동 관련 로직이 숨겨져 있어서 커스텀 이동을 사용하는 경우 문제가 생길 수 있다. 예를 들면 애니메이션 자체에 루트 모션이 포함되어 있는 경우 루트 모션을 활용하여 길찾기 로직을 구현하고 싶을 수 있겠지만 (보폭에 맞..
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..
Profile In Code언리얼 개발 과정중 소스코드 단위로 프로일링이 필요한 상황이 올 수 있다.이를 대비하여 언리얼 엔진에서 지원해주는 기능이 있다. 프로파일링을 위한 그룹 선언먼저 프로파일링 그룹을 선언한다. DECLARE_STATS_GROUP(TEXT("Sample"), STATGROUP_Sample, STATCAT_Advanced); 프로파일링 영역 설정을 위한 개체 선언코드 영역에 적용하기 전에 영역 개체를 정의한다.DECLARE_CYCLE_STAT(TEXT("Agent [Tick]"), STAT_AgentTick, STATGROUP_Sample);프로파일링 대상 영역에 적용이제 프로파일링 대상 영역에 적용한다.void ACharacterAgent::Tick(float DeltaTime){..
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)..