├── .gitignore ├── Config ├── DefaultEditor.ini ├── DefaultEditorPerProjectUserSettings.ini ├── DefaultEngine.ini ├── DefaultGame.ini └── DefaultInput.ini ├── Content ├── Engine │ ├── Fonts │ │ └── RobotoDistanceField.uasset │ ├── Materials │ │ ├── DefaultLightFunctionMaterial.uasset │ │ ├── DefaultPhysicalMaterial.uasset │ │ ├── WireframeMaterial.uasset │ │ └── WorldGridMaterial.uasset │ └── Resources │ │ ├── DefaultDiffuse.uasset │ │ ├── DefaultTexture.uasset │ │ ├── FastBlueNoise_scalar_128x128x64.uasset │ │ ├── FastBlueNoise_vec2_128x128x64.uasset │ │ ├── T_Default_Material_Grid_M.uasset │ │ └── T_Default_Material_Grid_N.uasset └── Maps │ └── Welcome │ ├── M_WelcomeTextMaterial.uasset │ ├── Welcome.umap │ └── WelcomeText.uasset ├── CookGameContent.cmd ├── CookServerContent.cmd ├── EzCompile.cmd ├── LICENCE ├── README.md ├── RegenerateWorkspace.cmd ├── RemoveBuildIntermediate.cmd ├── RunGame.cmd ├── RunServer.cmd ├── Source ├── StarterEditor.Target.cs ├── StarterEditor │ ├── StarterEditor.Build.cs │ └── StarterEditorModule.cpp ├── StarterGame.Target.cs ├── StarterRuntime │ ├── StarterRuntime.Build.cs │ └── StarterRuntimeModule.cpp └── StarterServer.Target.cs ├── Starter.uproject └── Tools └── Scripts ├── CookGameContent.ps1 ├── CookServerContent.ps1 ├── EzCompile.ps1 ├── RegenerateWorkspace.ps1 ├── RemoveBuildIntermediate.ps1 ├── RunGame.ps1 ├── RunServer.ps1 └── SetupEnv.ps1 /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio user specific files 2 | .vs/ 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Compiled Static libraries 20 | *.lai 21 | *.la 22 | *.a 23 | *.lib 24 | 25 | # Executables 26 | *.exe 27 | *.out 28 | *.app 29 | *.ipa 30 | 31 | # These project files can be generated by the engine 32 | *.xcodeproj 33 | *.xcworkspace 34 | *.sln 35 | *.suo 36 | *.opensdf 37 | *.sdf 38 | *.VC.db 39 | *.VC.opendb 40 | *.vsconfig 41 | 42 | # Precompiled Assets 43 | SourceArt/**/*.png 44 | SourceArt/**/*.tga 45 | 46 | # Binary Files 47 | Binaries/* 48 | Plugins/*/Binaries/* 49 | 50 | # Builds 51 | Build/* 52 | 53 | # Whitelist PakBlacklist-.txt files 54 | !Build/*/ 55 | Build/*/** 56 | !Build/*/PakBlacklist*.txt 57 | 58 | # Don't ignore icon files in Build 59 | !Build/**/*.ico 60 | 61 | # Built data for maps 62 | *_BuiltData.uasset 63 | 64 | # Configuration files generated by the Editor 65 | Saved/* 66 | 67 | # Compiled source files for the engine to use 68 | Intermediate/* 69 | Plugins/*/Intermediate/* 70 | 71 | # Platforms like Hololens 72 | Platforms/ 73 | 74 | # Cache files for the editor to use 75 | DerivedDataCache/* 76 | 77 | # Rider stuff 78 | .idea/ 79 | *.user 80 | Plugins/Developer/RiderLink* 81 | 82 | # Plastic SCM 83 | ignore.conf 84 | .plastic/ 85 | 86 | .ignore 87 | .vscode/ 88 | *.code-workspace -------------------------------------------------------------------------------- /Config/DefaultEditor.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Config/DefaultEditor.ini -------------------------------------------------------------------------------- /Config/DefaultEditorPerProjectUserSettings.ini: -------------------------------------------------------------------------------- 1 | [ContentBrowser] 2 | ContentBrowserTab1.SelectedPaths=/Game/ThirdPersonBP 3 | 4 | [/Script/UnrealEd.EditorLoadingSavingSettings] 5 | bForceCompilationAtStartup=True -------------------------------------------------------------------------------- /Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | 2 | 3 | [/Script/EngineSettings.GameMapsSettings] 4 | GameDefaultMap=/Game/Maps/Welcome/Welcome.Welcome 5 | EditorStartupMap=/Game/Maps/Welcome/Welcome.Welcome 6 | 7 | [/Script/Engine.RendererSettings] 8 | r.AllowStaticLighting=False 9 | r.GenerateMeshDistanceFields=True 10 | r.DynamicGlobalIlluminationMethod=2 11 | r.ReflectionMethod=2 12 | r.SkinCache.CompileShaders=True 13 | r.RayTracing=False 14 | r.Shadow.Virtual.Enable=0 15 | r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True 16 | r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 17 | r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 18 | r.Nanite=0 19 | r.Nanite.ProjectEnabled=False 20 | r.PathTracing=False 21 | r.CustomDepth=3 22 | r.DefaultFeature.AutoExposure=True 23 | r.AntiAliasingMethod=1 24 | r.MSAACount=1 25 | r.SupportLocalFogVolumes=False 26 | r.HeterogeneousVolumes=False 27 | r.DefaultFeature.MotionBlur=False 28 | r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject=False 29 | r.VirtualTextures=True 30 | r.VT.AnisotropicFiltering=True 31 | bEnableVirtualTexturePostProcessing=True 32 | 33 | [/Script/WindowsTargetPlatform.WindowsTargetSettings] 34 | DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 35 | -D3D12TargetedShaderFormats=PCD3D_SM5 36 | +D3D12TargetedShaderFormats=PCD3D_SM6 37 | -D3D11TargetedShaderFormats=PCD3D_SM5 38 | Compiler=Default 39 | AudioSampleRate=48000 40 | AudioCallbackBufferFrameSize=1024 41 | AudioNumBuffersToEnqueue=1 42 | AudioMaxChannels=0 43 | AudioNumSourceWorkers=4 44 | SpatializationPlugin= 45 | SourceDataOverridePlugin= 46 | ReverbPlugin= 47 | OcclusionPlugin= 48 | CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0) 49 | CacheSizeKB=65536 50 | MaxChunkSizeOverrideKB=0 51 | bResampleForDevice=False 52 | MaxSampleRate=48000.000000 53 | HighSampleRate=32000.000000 54 | MedSampleRate=24000.000000 55 | LowSampleRate=12000.000000 56 | MinSampleRate=8000.000000 57 | CompressionQualityModifier=1.000000 58 | AutoStreamingThreshold=0.000000 59 | SoundCueCookQualityIndex=-1 60 | 61 | [/Script/LinuxTargetPlatform.LinuxTargetSettings] 62 | SpatializationPlugin= 63 | SourceDataOverridePlugin= 64 | ReverbPlugin= 65 | OcclusionPlugin= 66 | SoundCueCookQualityIndex=-1 67 | -TargetedRHIs=SF_VULKAN_SM5 68 | 69 | [/Script/HardwareTargeting.HardwareTargetingSettings] 70 | TargetedHardwareClass=Desktop 71 | AppliedTargetedHardwareClass=Desktop 72 | DefaultGraphicsPerformance=Maximum 73 | AppliedDefaultGraphicsPerformance=Maximum 74 | 75 | [/Script/WorldPartitionEditor.WorldPartitionEditorSettings] 76 | CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet' 77 | 78 | [/Script/Engine.UserInterfaceSettings] 79 | bAuthorizeAutomaticWidgetVariableCreation=False 80 | FontDPIPreset=Standard 81 | FontDPI=72 82 | 83 | [/Script/Engine.Engine] 84 | +ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/Starter") 85 | +ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/Starter") 86 | WireframeMaterialName=/Game/Engine/Materials/WireframeMaterial.WireframeMaterial 87 | DefaultMaterialName=/Game/Engine/Materials/WorldGridMaterial.WorldGridMaterial 88 | DefaultLightFunctionMaterialName=/Game/Engine/Materials/DefaultLightFunctionMaterial.DefaultLightFunctionMaterial 89 | DefaultPhysMaterialName=/Game/Engine/Materials/DefaultPhysicalMaterial.DefaultPhysicalMaterial 90 | DefaultTextureName=/Game/Engine/Resources/DefaultTexture.DefaultTexture 91 | DefaultDiffuseTextureName=/Game/Engine/Resources/DefaultDiffuse.DefaultDiffuse 92 | BlueNoiseScalarTextureName=/Game/Engine/Resources/FastBlueNoise_scalar_128x128x64.FastBlueNoise_scalar_128x128x64 93 | BlueNoiseVec2TextureName=/Game/Engine/Resources/FastBlueNoise_vec2_128x128x64.FastBlueNoise_vec2_128x128x64 94 | 95 | [/Script/AndroidRuntimeSettings.AndroidRuntimeSettings] 96 | bSupportsVulkan=False 97 | 98 | -------------------------------------------------------------------------------- /Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | 2 | 3 | [/Script/EngineSettings.GeneralProjectSettings] 4 | ProjectID=8A7E81F547F730CA505F79B19606A226 5 | CopyrightNotice=Copyright (c) 2025 Daft Software. 6 | 7 | [/Script/UnrealEd.ProjectPackagingSettings] 8 | Build=IfProjectHasCode 9 | BuildConfiguration=PPBC_Shipping 10 | BuildTarget=StarterGame 11 | FullRebuild=False 12 | ForDistribution=True 13 | IncludeDebugFiles=False 14 | BlueprintNativizationMethod=Disabled 15 | bIncludeNativizedAssetsInProjectGeneration=False 16 | bExcludeMonolithicEngineHeadersInNativizedCode=False 17 | UsePakFile=True 18 | bUseIoStore=True 19 | bUseZenStore=False 20 | bMakeBinaryConfig=False 21 | bGenerateChunks=False 22 | bGenerateNoChunks=False 23 | bChunkHardReferencesOnly=False 24 | bForceOneChunkPerFile=False 25 | MaxChunkSize=0 26 | bBuildHttpChunkInstallData=False 27 | HttpChunkInstallDataDirectory=(Path="") 28 | WriteBackMetadataToAssetRegistry=Disabled 29 | bWritePluginSizeSummaryJsons=False 30 | bCompressed=True 31 | PackageCompressionFormat=Oodle 32 | bForceUseProjectCompressionFormatIgnoreHardwareOverride=False 33 | PackageAdditionalCompressionOptions= 34 | PackageCompressionMethod=Kraken 35 | PackageCompressionLevel_DebugDevelopment=4 36 | PackageCompressionLevel_TestShipping=4 37 | PackageCompressionLevel_Distribution=7 38 | PackageCompressionMinBytesSaved=1024 39 | PackageCompressionMinPercentSaved=5 40 | bPackageCompressionEnableDDC=False 41 | PackageCompressionMinSizeToConsiderDDC=0 42 | HttpChunkInstallDataVersion= 43 | IncludePrerequisites=False 44 | IncludeAppLocalPrerequisites=False 45 | bShareMaterialShaderCode=False 46 | bDeterministicShaderCodeOrder=False 47 | bSharedMaterialNativeLibraries=True 48 | ApplocalPrerequisitesDirectory=(Path="") 49 | IncludeCrashReporter=False 50 | InternationalizationPreset=English 51 | -CulturesToStage=en 52 | +CulturesToStage=en 53 | LocalizationTargetCatchAllChunkId=0 54 | bCookAll=False 55 | bCookMapsOnly=False 56 | bTreatWarningsAsErrorsOnCook=False 57 | bSkipEditorContent=True 58 | bSkipMovies=False 59 | -IniKeyDenylist=KeyStorePassword 60 | -IniKeyDenylist=KeyPassword 61 | -IniKeyDenylist=DebugKeyStorePassword 62 | -IniKeyDenylist=DebugKeyPassword 63 | -IniKeyDenylist=rsa.privateexp 64 | -IniKeyDenylist=rsa.modulus 65 | -IniKeyDenylist=rsa.publicexp 66 | -IniKeyDenylist=aes.key 67 | -IniKeyDenylist=SigningPublicExponent 68 | -IniKeyDenylist=SigningModulus 69 | -IniKeyDenylist=SigningPrivateExponent 70 | -IniKeyDenylist=EncryptionKey 71 | -IniKeyDenylist=DevCenterUsername 72 | -IniKeyDenylist=DevCenterPassword 73 | -IniKeyDenylist=IOSTeamID 74 | -IniKeyDenylist=SigningCertificate 75 | -IniKeyDenylist=MobileProvision 76 | -IniKeyDenylist=IniKeyDenylist 77 | -IniKeyDenylist=IniSectionDenylist 78 | +IniKeyDenylist=KeyStorePassword 79 | +IniKeyDenylist=KeyPassword 80 | +IniKeyDenylist=DebugKeyStorePassword 81 | +IniKeyDenylist=DebugKeyPassword 82 | +IniKeyDenylist=rsa.privateexp 83 | +IniKeyDenylist=rsa.modulus 84 | +IniKeyDenylist=rsa.publicexp 85 | +IniKeyDenylist=aes.key 86 | +IniKeyDenylist=SigningPublicExponent 87 | +IniKeyDenylist=SigningModulus 88 | +IniKeyDenylist=SigningPrivateExponent 89 | +IniKeyDenylist=EncryptionKey 90 | +IniKeyDenylist=DevCenterUsername 91 | +IniKeyDenylist=DevCenterPassword 92 | +IniKeyDenylist=IOSTeamID 93 | +IniKeyDenylist=SigningCertificate 94 | +IniKeyDenylist=MobileProvision 95 | +IniKeyDenylist=IniKeyDenylist 96 | +IniKeyDenylist=IniSectionDenylist 97 | -IniSectionDenylist=HordeStorageServers 98 | -IniSectionDenylist=StorageServers 99 | -IniSectionDenylist=/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings 100 | +IniSectionDenylist=HordeStorageServers 101 | +IniSectionDenylist=StorageServers 102 | +IniSectionDenylist=/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings 103 | +DirectoriesToNeverCook=(Path="/Engine/EngineSky/VolumetricClouds") 104 | +DirectoriesToNeverCook=(Path="/Engine/BasicShapes") 105 | +DirectoriesToNeverCook=(Path="/Engine/Maps") 106 | +DirectoriesToNeverCook=(Path="/Engine/ArtTools") 107 | +DirectoriesToNeverCook=(Path="/Engine/EngineMaterials") 108 | +DirectoriesToNeverCook=(Path="/Engine/EditorMeshes") 109 | +DirectoriesToNeverCook=(Path="/Engine/VREditor") 110 | +DirectoriesToNeverCook=(Path="/Engine/SlateDebug") 111 | +DirectoriesToNeverCook=(Path="/Engine/MobileResources") 112 | +DirectoriesToNeverCook=(Path="/Subtrate") 113 | bRetainStagedDirectory=False 114 | CustomStageCopyHandler= 115 | 116 | [/Script/Engine.AssetManagerSettings] 117 | -PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=Unknown)) 118 | -PrimaryAssetTypesToScan=(PrimaryAssetType="PrimaryAssetLabel",AssetBaseClass=/Script/Engine.PrimaryAssetLabel,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=Unknown)) 119 | +PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass="/Script/Engine.World",bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=Unknown)) 120 | +PrimaryAssetTypesToScan=(PrimaryAssetType="PrimaryAssetLabel",AssetBaseClass="/Script/Engine.PrimaryAssetLabel",bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=Unknown)) 121 | bOnlyCookProductionAssets=False 122 | bShouldManagerDetermineTypeAndName=False 123 | bShouldGuessTypeAndNameInEditor=True 124 | bShouldAcquireMissingChunksOnLoad=False 125 | bShouldWarnAboutInvalidAssets=True 126 | MetaDataTagsForAssetRegistry=() 127 | 128 | -------------------------------------------------------------------------------- /Config/DefaultInput.ini: -------------------------------------------------------------------------------- 1 | [/Script/Engine.InputSettings] 2 | -AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 3 | -AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 4 | -AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 5 | -AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) 6 | -AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 7 | -AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 8 | -AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) 9 | +AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 10 | +AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 11 | +AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 12 | +AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 13 | +AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 14 | +AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 15 | +AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) 16 | +AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 17 | +AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 18 | +AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 19 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 20 | +AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 21 | +AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 22 | +AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 23 | +AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 24 | +AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 25 | +AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 26 | +AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 27 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 28 | +AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 29 | +AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 30 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 31 | +AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 32 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 33 | +AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 34 | +AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 35 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 36 | +AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 37 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 38 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 39 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 40 | +AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 41 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 42 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 43 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 44 | +AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 45 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 46 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 47 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 48 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 49 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 50 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 51 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 52 | +AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 53 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 54 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 55 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 56 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 57 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 58 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 59 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 60 | +AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) 61 | bAltEnterTogglesFullscreen=True 62 | bF11TogglesFullscreen=True 63 | bUseMouseForTouch=False 64 | bEnableMouseSmoothing=True 65 | bEnableFOVScaling=True 66 | bCaptureMouseOnLaunch=True 67 | bEnableLegacyInputScales=True 68 | bEnableMotionControls=True 69 | bFilterInputByPlatformUser=False 70 | bShouldFlushPressedKeysOnViewportFocusLost=True 71 | bAlwaysShowTouchInterface=False 72 | bShowConsoleOnFourFingerTap=True 73 | bEnableGestureRecognizer=False 74 | bUseAutocorrect=False 75 | DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown 76 | DefaultViewportMouseLockMode=LockOnCapture 77 | FOVScale=0.011110 78 | DoubleClickTime=0.200000 79 | DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput 80 | DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent 81 | DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks 82 | -ConsoleKeys=Tilde 83 | +ConsoleKeys=Tilde 84 | 85 | -------------------------------------------------------------------------------- /Content/Engine/Fonts/RobotoDistanceField.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Fonts/RobotoDistanceField.uasset -------------------------------------------------------------------------------- /Content/Engine/Materials/DefaultLightFunctionMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Materials/DefaultLightFunctionMaterial.uasset -------------------------------------------------------------------------------- /Content/Engine/Materials/DefaultPhysicalMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Materials/DefaultPhysicalMaterial.uasset -------------------------------------------------------------------------------- /Content/Engine/Materials/WireframeMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Materials/WireframeMaterial.uasset -------------------------------------------------------------------------------- /Content/Engine/Materials/WorldGridMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Materials/WorldGridMaterial.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/DefaultDiffuse.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/DefaultDiffuse.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/DefaultTexture.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/DefaultTexture.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/FastBlueNoise_scalar_128x128x64.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/FastBlueNoise_scalar_128x128x64.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/FastBlueNoise_vec2_128x128x64.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/FastBlueNoise_vec2_128x128x64.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/T_Default_Material_Grid_M.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/T_Default_Material_Grid_M.uasset -------------------------------------------------------------------------------- /Content/Engine/Resources/T_Default_Material_Grid_N.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Engine/Resources/T_Default_Material_Grid_N.uasset -------------------------------------------------------------------------------- /Content/Maps/Welcome/M_WelcomeTextMaterial.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Maps/Welcome/M_WelcomeTextMaterial.uasset -------------------------------------------------------------------------------- /Content/Maps/Welcome/Welcome.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Maps/Welcome/Welcome.umap -------------------------------------------------------------------------------- /Content/Maps/Welcome/WelcomeText.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daftsoftware/StarterProject/32a5e841325c651fdcb8a5a2f5761941df20e7e7/Content/Maps/Welcome/WelcomeText.uasset -------------------------------------------------------------------------------- /CookGameContent.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/CookGameContent.ps1'" 4 | 5 | pause -------------------------------------------------------------------------------- /CookServerContent.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/CookServerContent.ps1'" 4 | 5 | pause -------------------------------------------------------------------------------- /EzCompile.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/EzCompile.ps1'" 4 | 5 | REM Check if there was an error (ERRORLEVEL non-zero means an error occurred) 6 | if %ERRORLEVEL% neq 0 ( 7 | echo Compiled with Errors 8 | pause 9 | ) -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2025 Daft Software. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # DaftSoftware Minimal Project 3 | 4 | ## Important 5 | By using this repository you agree to the Epic EULA. 6 | https://www.unrealengine.com/en-US/eula/unreal 7 | 8 | This project may not be used outside of Unreal projects, the code source is MIT, and any file with the daftsoftware copyright you are free to use it as such but any content belonging to Epic applies the EULA and if I haven't marked the copyright as such, you can assume the copyright belongs to Epic. 9 | 10 | ## About 11 | 12 | **Currently supported versions are Unreal 5.5 and Unreal 5.6**, It's possible to backport to 5.4 or earlier but you will need to replace the Custom Engine Content yourself which is described later in this readme. 13 | 14 | This uproject uses a few tricks to drastically reduce the size of packaged builds, and essentially disables all plugins in the entire engine (even the ones that aren't able to be turned off by default). Disabling all plugins essentially cuts the legs off the engine and you will have considerable loss in functionality with the benefit of a huge increase of speed in the editor load times for assets and startup, however it can be treated more like an opt-in model where the things you need can be turned back on. 15 | 16 | As is suggested by Epic there are things in this project that are an **advanced workflow** and I do not recommend using this project unless you absolutely know what you are doing. It's not reasonable to assume that Epic has tested internally having some of these core engine plugins disabled and therefore you may get crashes upon using certain features with some plugins disabled, therefore in these scenarios debugging and some educated guessing is usually required to figure out which dependency from the engine you need to turn back on. 17 | 18 | This project also defaultly kills the vast majority of the stock engine content. It is very important to identify what you use from the engine content because *this content will be missing in your builds by default and cause errors*. In this project the world grid and a few other essential default materials have been moved out of Engine content into Project content, but you will need to do this to any additional content from the engine you use and there is very important process around this, you can't just copy the content - More on this later. 19 | 20 | **Disclaimer** - This project is also primarily targeting **Win64** platform, other platforms (eg MacOS or Android) have not been tested and probably crash due to missing plugin dependencies or required content, if you enable new platforms you will likely need to debug missing dependencies or unsupported settings. 21 | 22 | ## Fast Rendering 23 | 24 | You can access faster rendering for Windows using DirectX Mobile on the fastrendering branch which has both the base lightweight project available in main branch but also a bunch of very aggressive optimizations and disabled rendering features yielding high performance usually in the realm of 10x increase. 25 | [Look here for a full list of which features are available / unavailable for mobile rendering](https://dev.epicgames.com/documentation/en-us/unreal-engine/rendering-features-for-mobile-games-in-unreal-engine). 26 | 27 | ## Plugin Dependencies 28 | 29 | A few plugins from the engine, while you can turn off, it's not a good idea to do so because you basically chop the arms and legs off the engine, or otherwise cause instability. The following plugins are: 30 | 31 | **EngineAssetDefinitions** - *Required* for describing all the core asset factories and types the engine uses, without this you will be missing literally almost every core asset type in the engine and the editor will not understand what a Level, Blueprint, Material or other primitive asset type is, opening them will be treated like a data asset and they won't function as expected. 32 | 33 | **ContentBrowserAssetDataSource** - *Required*, Without this the content browser is lobotomized and doesn't understand what an asset is, it will just show empty results on everything, so pretty much required. 34 | 35 | **AnimationData** - *Required temporary workaround*, to open Blueprints assets. Without this plugin enabled you will get a crash when Unreal scans the Blueprint skeleton type, as it will try to determine if said asset is an animation blueprint and crash on the spot when expected nodes are missing. Should imagine Epic will fix this one if anyone can be bothered to PR it or if they find out for themselves. 36 | 37 | **PluginBrowser** - *Not required*, you can turn this one off if you like, but honestly it makes working with Game Features or any other plugin a nightmare since you have to manually describe your configuration in the .uproject - and it's editor only anyway. Maybe useful turning it off if your artists are really annoying and turn on plugins lol. 38 | 39 | **TraceUtilities** - *Not required*, you can turn this one off but you will lose a lot of the nice functionality to do with Insights and a large part of the QoL that was built around the trace server in recent versions. Maybe if you never use insights this one can be turned off, but I thought it was too handy to be turned off personally. 40 | 41 | **Niagara** - *Not required*, can be turned off for a small speed boost on the Game Thread and improved editor startup time at the cost of entirely losing FX from the engine, while it's still possible to use Cascade I absolutely don't recommend this and probably the only people that are going to want this off are people rocking custom FX systems or people with no FX in their games, which I figure probably doesn't cover most people. 42 | 43 | **EnhancedInput** - *Not required*, can be turned off if you just prefer to use the legacy input system or a custom one, however I don't recommend using legacy input in UE5 as Epic no longer supports it. 44 | 45 | *How do we disable all the plugins if the uproject is almost empty?* 46 | 47 | `"DisableEnginePluginsByDefault": true` 48 | 49 | This setting essentially instructs the engine to operate on an IYWU basis for plugins, disabling all engine and editor plugins, even the ones hidden in the plugin browser. These plugins can be found under [YourEngineInstall/Engine/Plugins](https://github.com/EpicGames/UnrealEngine/tree/release/Engine/Plugins), a large amount of which are under the [YourEngineInstall/Engine/Plugins/Editor](https://github.com/EpicGames/UnrealEngine/tree/release/Engine/Plugins/Editor) directory. It is advisable to look at these plugins top to bottom to understand exactly what you are disabling by using the project, as most people are going to immediately need to turn some things back on, which you can do by finding the name of their .uplugin and adding them manually in your .uproject file, e.g: 50 | ```json 51 | { 52 | "Name": "EngineAssetDefinitions", 53 | "Enabled": true 54 | }, 55 | ``` 56 | 57 | ## Package Size 58 | 59 | **Disclaimer** - It is possible to get the size of a project much smaller than this project offers out of the box. However the goal of this project is to min-max rendering, cpu and IO performance at runtime and improve editor startup times where possible. While the package can be made much smaller using compression, shared shaders, DX11 / OpenGL, or otherwise eliminating the global shader cache (which would kill around 60MB out the box) doing so would generally result in performance reduction or an unsatisfactory or reduced experience for players, however may be desirable for some projects like game jams. Therefore I won't be doing these mods myself, but they are easy to do and [Epic offers a decent guide to do so](https://dev.epicgames.com/documentation/en-us/unreal-engine/reducing-packaged-game-size?application_version=4.27). By default this project also does not use CryptoKeys, PAK or IOStore - 211.8MB is the uncompressed size of the project, and with the equivalent size of a blank project package without PAK or IOStore the size would be 621.9MB. 60 | 61 | It's worth noting that most of the mods that have been done in this uproject are highly opinionated, suited primarily for the needs of Daft Software, and not suitable for many projects, especially those in AAA where due to large teams it may not be possible or reasonable to have very tightly controlled content pipelines, and artists may place engine content into levels, but hopefully should still provide a good jumping off point for your own projects or game jams. In this scenario I would recommend adding validators and aggressive asset referencing policies to control which Engine Content is allowed to be included to the project. 62 | 63 | As of Unreal 5.5.2: 64 | The current size of a brand new blank project being packaged is **457.3MB** 65 | The current size of the DaftSoftware Minimal Project is **211.8MB** 66 | 67 | Uncompressed Daft Minimal Project is **2.16x smaller than compressed blank template and 2.94x smaller than uncompressed blank template.** 68 | 69 | Blank Template (No PAK, No IOStore) - 621.9 MB 70 | ![image](https://github.com/user-attachments/assets/b1f8c3fb-ada3-4c5e-8e7e-4b92baaca903) 71 | 72 | Blank Template (PAK + IOStore) - 457.3 MB 73 | ![image](https://github.com/user-attachments/assets/d503eaac-4911-4485-82c5-616cc94b2d9e) 74 | 75 | Daft Minimal Project **Default** (No PAK, No IOStore) - 211.8 MB 76 | ![image](https://github.com/user-attachments/assets/aba17a5a-6eb4-42d1-a39a-661286c8bb34) 77 | 78 | Daft Minimal Project (PAK + IOStore) - 181.6MB 79 | ![image](https://github.com/user-attachments/assets/cda65650-5a70-4834-a821-de0789a0348e) 80 | 81 | Performance / savings of using PAK and IOStore may vary per project, by default it is disabled, however it's very easily enabled in Project Settings > Packaging: 82 | 83 | ![image](https://github.com/user-attachments/assets/fde482b4-1c4e-4dc6-be6b-0c5bc2be8b4c) 84 | 85 | If you need to change how the engine / editor content is excluded from the cook, it is done in DefaultGame.ini under packaging settings, eg: 86 | ```ini 87 | [/Script/UnrealEd.ProjectPackagingSettings] 88 | +DirectoriesToNeverCook=(Path="/Engine/EngineMaterials") 89 | ``` 90 | 91 | ## Editor Speed 92 | 93 | If we measure in Development Editor config from the start of LaunchEngineLoop to when the Engine Tick Loop starts, which doesn't necessarily represent real world speed of pressing compile to seeing the editor open, but does provide a technical basis to measure the editor speed. We can see that Daft Minimal Project offers a significant speedup to the Editor startup times. 94 | 95 | Epic's default "Blank" C++ Template comes in at around **10.9 Seconds** from Init to First Tick. 96 | ![image](https://github.com/user-attachments/assets/11a5346e-d66f-42fb-8231-776dd5a72acc) 97 | 98 | Daft Minimal Project comes in around **6.9 Seconds** from Init to First Tick. 99 | ![image](https://github.com/user-attachments/assets/a75394bd-a131-4a76-b7b2-d2c29dd7ac6a) 100 | 101 | ## Project Engine Content 102 | 103 | As described earlier, in this project we deploy a bit of a cheeky trick to move important Engine content into Project level so that it's more managable and you can IWYU. The engine itself has the concept of "Special Engine Materials", if you ever tried opening the world grid material in the Engine Content for example, then you will be familiar with the warning where Epic tells you basically don't modify these unless you know what you're doing. 104 | 105 | ![image](https://github.com/user-attachments/assets/2231744a-becc-4f69-92d6-549c63ca83fa) 106 | 107 | 108 | This is essentially because these are materials loaded into globals which are used by all systems in the entire engine, including Nanite, Niagara, Static Meshes, basically everything that might at any time be able to display a null material. However because of this they are particularly tricky to edit, since you are modifying stuff that is actively always in VRAM or being utilized, so editing these directly usually causes a crash. 109 | 110 | You can find a total list of all of these engine contents in BaseEngine.ini and in our case the ones that have been overridden inside DefaultEngine.ini like so: 111 | ```ini 112 | [/Script/Engine.Engine] 113 | DefaultMaterialName=/Game/Engine/Materials/WorldGridMaterial.WorldGridMaterial 114 | ``` 115 | 116 | One very nice benefit this affords us is that we can actually directly change the world grid material to look however we like, and even reduce it's shader instructions if we find it too expensive or make it a bright color like purple to identify missing materials or content. When editing these materials, you should comment them out in the ini to fallback to the engine material, make your edits, then uncomment. Just remember to uncomment because the engine materials are killed in package builds 117 | ```ini 118 | [/Script/Engine.Engine] 119 | ;DefaultMaterialName=/Game/Engine/Materials/WorldGridMaterial.WorldGridMaterial 120 | ``` 121 | 122 | When adding additional content from Engine Materials to Project Content, you cannot just directly copy the assets across and add them in the ini. This is because internally Epic has a flag which is not trivial to set by accident and it is required for any of these global materials to function correctly, when you copy engine content to project level Epic automatically removes this flag because they assume you're just using the material business as usual and wanted to use it like a normal material. 123 | 124 | You can enable this flag on assets you add to the project with a console command: 125 | `Daft.MakeMaterialSpecial /Game/Engine/Materials/WorldGridMaterial` 126 | 127 | You can find the correct path you need by locating the material asset you copied, then right clicking and doing "Copy Package Path" or pressing Ctrl+Alt+C while selecting it. 128 | ![image](https://github.com/user-attachments/assets/4c200498-1102-41ee-8dd7-0386e4e7d89e) 129 | 130 | Then you must locate the ini to override from BaseEngine.ini and add it into your DefaultEngine.ini with the project level path rather than the engine one it defaults to. 131 | 132 | A very easy and quick 5MB that can be reclaimed is by removing blue noise from the engine by commenting out the following 2 lines in DefaultEngine.ini, however I usually like to use this on my projects and it's one of those things where provided you do use it, you likely aren't going to do it much better than the built in engine one, so for examples sake I have left it there, feel free to get rid of it if you won't bother using it. 133 | 134 | ```ini 135 | [/Script/Engine.Engine] 136 | ;BlueNoiseScalarTextureName=/Game/Engine/Resources/FastBlueNoise_scalar_128x128x64.FastBlueNoise_scalar_128x128x64 137 | ;BlueNoiseVec2TextureName=/Game/Engine/Resources/FastBlueNoise_vec2_128x128x64.FastBlueNoise_vec2_128x128x64 138 | ``` 139 | 140 | Similarly, you can bring back various engine textures if they are required by copying them from Engine Content to Project Content and then just adding whichever ones you need from BaseEngine.ini to DefaultEngine.ini and changing the path to point at the one in the project. 141 | 142 | ## Rendering Features 143 | 144 | **Important Note**: 145 | 146 | While Volumetric Clouds themselves have not been disabled, the default materials have as by default they consume nearly 20MB! When using Volumetric Clouds, set them to use a custom material, copy the default cloud materials to project level, or just remove the following line from DefaultGame.ini if you want to use the base engine sky materials at the cost of 20MB package size: 147 | ```ini 148 | +DirectoriesToNeverCook=(Path="/Engine/EngineSky/VolumetricClouds") 149 | ``` 150 | 151 | Defaultly disabled rendering features which were disabled for speed or my opinions but you may want to enable include: 152 | - Nanite 153 | - Lumen 154 | - RT Reflections 155 | - VSM 156 | - Path Tracing 157 | - Local Fog Volumes 158 | - Heterogenous Volumes 159 | - Auto Exposure 160 | - Motion Blur 161 | 162 | Defaulty enabled rendering features which were enabled for speed or my opinions but you may want to disable include: 163 | - Virtual Texturing 164 | - VT Anisotropic Filtering 165 | - VT Post Processing 166 | - Screen Space Reflections 167 | - FXAA 168 | - CSM 169 | - Custom Depth + Stencil Buffer 170 | 171 | ## Known Issues 172 | 173 | MacOS will crash on startup - This platform requires TextureFormatOodle to be enabled otherwise you get a crash relating to FNVTTCompressor. 174 | 175 | ## Thanks 176 | - Siliex for showing me the cool trick to disable all engine / editor plugins 177 | - Zeblote / Brickadia team for inspiring me to do this in the first place 178 | - BarronKane for sharing his own research into small uprojects 179 | - Vori for moral support and for bringing significant attention to this project 180 | - Alex Nye for finding solution to startup crash on MacOS 181 | -------------------------------------------------------------------------------- /RegenerateWorkspace.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/RegenerateWorkspace.ps1'" -------------------------------------------------------------------------------- /RemoveBuildIntermediate.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/RemoveBuildIntermediate.ps1'" -------------------------------------------------------------------------------- /RunGame.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/RunGame.ps1'" 4 | -------------------------------------------------------------------------------- /RunServer.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "& '%~dp0/Tools/Scripts/RunServer.ps1'" 4 | -------------------------------------------------------------------------------- /Source/StarterEditor.Target.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class StarterEditorTarget : TargetRules 7 | { 8 | public StarterEditorTarget( TargetInfo Target) : base(Target) 9 | { 10 | Type = TargetType.Editor; 11 | DefaultBuildSettings = BuildSettingsVersion.V5; 12 | IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5; 13 | //BuildEnvironment = TargetBuildEnvironment.Unique; 14 | 15 | //bCompilePython = false; 16 | 17 | ExtraModuleNames.AddRange(new string[] 18 | { 19 | "StarterRuntime", 20 | "StarterEditor" 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Source/StarterEditor/StarterEditor.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class StarterEditor : ModuleRules 6 | { 7 | public StarterEditor(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicDependencyModuleNames.AddRange(new string[] 12 | { 13 | "Core", 14 | "CoreUObject", 15 | "Engine", 16 | "InputCore", 17 | "EnhancedInput" 18 | }); 19 | 20 | PrivateDependencyModuleNames.AddRange(new string[] 21 | { 22 | 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/StarterEditor/StarterEditorModule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | #include "Modules/ModuleManager.h" 4 | #include "Materials/Material.h" 5 | #include "Misc/Paths.h" 6 | #include "Misc/Parse.h" 7 | #include "Logging/StructuredLog.h" 8 | 9 | namespace Daft 10 | { 11 | FAutoConsoleCommandWithArgsAndOutputDevice MakeMaterialSpecialCmd( 12 | TEXT("Daft.MakeMaterialSpecial"), 13 | TEXT("Write the special engine material flag into the material at the given path."), 14 | FConsoleCommandWithArgsAndOutputDeviceDelegate::CreateStatic([](const TArray& Params, FOutputDevice& Out) 15 | { 16 | FString Path; 17 | if (Params.Num() == 1) 18 | { 19 | Path = Params[0]; 20 | } 21 | else 22 | { 23 | Out.Logf(TEXT("Usage: Daft.MakeMaterialSpecial ")); 24 | return; 25 | } 26 | 27 | UMaterial* Material = Cast(StaticLoadObject(UMaterial::StaticClass(), nullptr, *Path)); 28 | if (Material) 29 | { 30 | Material->bUsedAsSpecialEngineMaterial = true; 31 | Material->PostEditChange(); 32 | Material->MarkPackageDirty(); 33 | 34 | UE_LOGFMT(LogTemp, Log, "Material at path {0} is now a special engine material.", *Path); 35 | } 36 | else 37 | { 38 | UE_LOGFMT(LogTemp, Error, "Material not found at path: {0}", *Path); 39 | } 40 | } 41 | )); 42 | } 43 | 44 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, StarterEditor, "StarterEditor" ); 45 | -------------------------------------------------------------------------------- /Source/StarterGame.Target.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class StarterGameTarget : TargetRules 7 | { 8 | public StarterGameTarget(TargetInfo Target) : base(Target) 9 | { 10 | Type = TargetType.Game; 11 | DefaultBuildSettings = BuildSettingsVersion.Latest; 12 | IncludeOrderVersion = EngineIncludeOrderVersion.Latest; 13 | ExtraModuleNames.Add("StarterRuntime"); 14 | //BuildEnvironment = TargetBuildEnvironment.Unique; 15 | 16 | //bCompilePython = false; 17 | 18 | //if (Target.Type != TargetType.Editor) 19 | //{ 20 | //Target.DisablePlugins.Add("OpenImageDenoise"); 21 | //Target.DisablePlugins.Add("MeshModelingTools"); 22 | //} 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Source/StarterRuntime/StarterRuntime.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class StarterRuntime : ModuleRules 6 | { 7 | public StarterRuntime(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicDependencyModuleNames.AddRange(new string[] 12 | { 13 | "Core", 14 | "CoreUObject", 15 | "Engine", 16 | "InputCore", 17 | "EnhancedInput" 18 | }); 19 | 20 | PrivateDependencyModuleNames.AddRange(new string[] 21 | { 22 | 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/StarterRuntime/StarterRuntimeModule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | #include "Modules/ModuleManager.h" 4 | 5 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, StarterRuntime, "StarterRuntime" ); 6 | -------------------------------------------------------------------------------- /Source/StarterServer.Target.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Daft Software. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | [SupportedPlatforms(UnrealPlatformClass.Server)] 7 | public class StarterServerTarget : TargetRules 8 | { 9 | public StarterServerTarget(TargetInfo Target) : base(Target) 10 | { 11 | Type = TargetType.Server; 12 | DefaultBuildSettings = BuildSettingsVersion.Latest; 13 | IncludeOrderVersion = EngineIncludeOrderVersion.Latest; 14 | ExtraModuleNames.Add("StarterRuntime"); 15 | //BuildEnvironment = TargetBuildEnvironment.Unique; 16 | 17 | //bCompilePython = false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Starter.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "5.5", 4 | "Category": "", 5 | "Description": "", 6 | "DisableEnginePluginsByDefault": true, 7 | "Modules": [ 8 | { 9 | "Name": "StarterRuntime", 10 | "Type": "Runtime", 11 | "LoadingPhase": "Default" 12 | }, 13 | { 14 | "Name": "StarterEditor", 15 | "Type": "Editor", 16 | "LoadingPhase": "Default" 17 | } 18 | ], 19 | "Plugins": [ 20 | { 21 | "Name": "EngineAssetDefinitions", 22 | "Enabled": true 23 | }, 24 | { 25 | "Name": "ContentBrowserAssetDataSource", 26 | "Enabled": true 27 | }, 28 | { 29 | "Name": "AnimationData", 30 | "Enabled": true 31 | }, 32 | { 33 | "Name": "PluginBrowser", 34 | "Enabled": true 35 | }, 36 | { 37 | "Name": "TraceUtilities", 38 | "Enabled": true 39 | }, 40 | { 41 | "Name": "Niagara", 42 | "Enabled": true 43 | }, 44 | { 45 | "Name": "EnhancedInput", 46 | "Enabled": true 47 | } 48 | ], 49 | "TargetPlatforms": [ 50 | "Windows" 51 | ] 52 | } -------------------------------------------------------------------------------- /Tools/Scripts/CookGameContent.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | & $uat BuildCookRun ` 6 | -target=StarterGame ` 7 | -project="$uprojectPath" ` 8 | -targetplatform=Win64 ` 9 | -clientconfig=Development ` 10 | -cook ` 11 | -iostore ` 12 | -nop4 -------------------------------------------------------------------------------- /Tools/Scripts/CookServerContent.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | & $uat BuildCookRun ` 6 | -target=StarterServer ` 7 | -project="$uprojectPath" ` 8 | -targetplatform=Win64 ` 9 | -serverconfig=Development ` 10 | -cook ` 11 | -iostore ` 12 | -nop4 -------------------------------------------------------------------------------- /Tools/Scripts/EzCompile.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | $Global:buildTarget = "{0}Editor" -f $projectName 6 | 7 | # Compile C++ for Development. 8 | & $ubt -project="$uprojectPath" $buildTarget Win64 Development ` 9 | -WaitMutex ` 10 | -FromMsBuild ` 11 | -architecture=x64 ` 12 | 13 | & $unreal -project="$uprojectPath" -------------------------------------------------------------------------------- /Tools/Scripts/RegenerateWorkspace.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | function Find-UnrealVersionSelector { 6 | # First, check the specified directory 7 | $specifiedPath = "C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe" 8 | if (Test-Path $specifiedPath) { 9 | return $specifiedPath 10 | } 11 | 12 | # If not found, define likely base paths for a broader search 13 | $basePaths = @( 14 | "C:\Program Files\Epic Games", 15 | "C:\Program Files (x86)\Epic Games" 16 | ) 17 | 18 | # Search for UnrealVersionSelector.exe in each base path 19 | foreach ($basePath in $basePaths) { 20 | $versionSelectorPaths = Get-ChildItem -Path $basePath -Recurse -Filter "UnrealVersionSelector.exe" -ErrorAction SilentlyContinue -File 21 | foreach ($path in $versionSelectorPaths) { 22 | if ($path) { 23 | return $path.FullName 24 | } 25 | } 26 | } 27 | 28 | throw "UnrealVersionSelector.exe not found." 29 | } 30 | 31 | function GenerateProjectFiles($uproject) { 32 | try { 33 | $versionSelector = Find-UnrealVersionSelector 34 | if (-not $versionSelector) { 35 | throw "Unreal Version Selector not found." 36 | } 37 | 38 | $fullProjectPath = (Resolve-Path $uproject).Path 39 | Write-Host "Using Unreal Version Selector at $versionSelector to generate project files for $fullProjectPath..." 40 | 41 | & $versionSelector /projectfiles "$fullProjectPath" 42 | if ($?) { 43 | Write-Host "Project files generated successfully." 44 | } else { 45 | Write-Host "Failed to generate project files." 46 | } 47 | } catch { 48 | Write-Host $_.Exception.Message 49 | } 50 | } 51 | 52 | GenerateProjectFiles $uproject 53 | -------------------------------------------------------------------------------- /Tools/Scripts/RemoveBuildIntermediate.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | $pathToRemove = "$projectRoot/Intermediate/Build/Win64" 6 | if (Test-Path -Path $pathToRemove) { 7 | Remove-Item -Path $pathToRemove -Recurse -Force 8 | Write-Host "Removed $pathToRemove" 9 | } else { 10 | Write-Host "Directory $pathToRemove does not exist" 11 | } 12 | 13 | Start-Sleep -Seconds 2 -------------------------------------------------------------------------------- /Tools/Scripts/RunGame.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | # Compile C++ for Development. 6 | & $ubt -project="$uprojectPath" $projectName Win64 Development ` 7 | -WaitMutex ` 8 | -FromMsBuild ` 9 | 10 | & $unreal $uprojectPath -game -log -newconsole 11 | -------------------------------------------------------------------------------- /Tools/Scripts/RunServer.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | . $PSScriptRoot/SetupEnv.ps1 4 | 5 | & $unreal $uprojectPath -server -log -newconsole 6 | -------------------------------------------------------------------------------- /Tools/Scripts/SetupEnv.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025 Daft Software. 2 | 3 | # Setup Environment Script - Provides scripts with paths like engine locations ect. 4 | 5 | # Go up 2 directories from this script 6 | $projectRoot = Split-Path -Parent -Path (Split-Path -Parent -Path (Split-Path -Parent -Path $MyInvocation.MyCommand.Definition)) 7 | 8 | $uproject = Get-ChildItem -Path $projectPath -Filter "*.uproject" 9 | $uprojectPath = Join-Path $projectRoot $uproject 10 | 11 | # Extract the game name from the left-hand side of the .uproject file 12 | $projectName = $uproject.Name.Split(".")[0] 13 | 14 | # Since .uproject is really just a json file we can just read the unrealVersion from it 15 | $unrealVersion = (Get-Content -Raw $uproject.FullName | ConvertFrom-Json).EngineAssociation 16 | 17 | # Check if we are using a source build - launcher versions aren't wrapped in {} 18 | $sourceBuild = $unrealVersion -match "\{" -and $unrealVersion -match "\}" 19 | 20 | function Get-LauncherInstalledUEVersions($Ver = "*") 21 | { 22 | $Ret = [System.Collections.ArrayList]@() 23 | $ProgramData = [Environment]::GetFolderPath([Environment+SpecialFolder]::CommonApplicationData) 24 | $LauncherInstalledFile = Join-Path $ProgramData "Epic\UnrealEngineLauncher\LauncherInstalled.dat" 25 | $JSONData = Get-Content -Raw $LauncherInstalledFile | ConvertFrom-JSON 26 | $JSONData.InstallationList | Where-Object {$_.AppName -like "UE_$Ver"} | ForEach-Object {[String]$_.InstallLocation} 27 | } 28 | 29 | function Get-RegistryInstalledUEVersion($Ver = "*") 30 | { 31 | $path = "HKCU:\Software\Epic Games\Unreal Engine\Builds" 32 | $versionPath = (Get-ItemProperty -Path $path -Name $Ver -ErrorAction SilentlyContinue).$unrealVersion 33 | return $versionPath 34 | } 35 | 36 | write-host "---------------------- ENVIRONMENT ----------------------" 37 | 38 | $enginePath = if($sourceBuild) { Get-RegistryInstalledUEVersion -Ver $unrealVersion } else { Get-LauncherInstalledUEVersions -Ver $unrealVersion } 39 | write-host "Engine Path: $enginePath" 40 | 41 | $unreal = Join-Path $enginePath "Engine\Binaries\Win64\UnrealEditor.exe" 42 | write-host "Unreal Editor Path: $unreal" 43 | 44 | $unrealCmd = Join-Path $enginePath "Engine\Binaries\Win64\UnrealEditor-Cmd.exe" 45 | write-host "Unreal Editor Command Line Path: $unrealCmd" 46 | 47 | $ubt = Join-Path $enginePath "Engine\Build\BatchFiles\Build.bat" 48 | write-host "UBT Path: $ubt" 49 | 50 | $uat = Join-Path $enginePath "Engine\Build\BatchFiles\RunUAT.bat" 51 | write-host "UAT Path: $uat" 52 | 53 | write-host "UProject Path: $uprojectPath" 54 | write-host "Project Root: $projectRoot" 55 | write-host "Project Name: $projectName" 56 | write-host "Unreal Version: $unrealVersion" 57 | write-host "Source Build: $sourceBuild" 58 | 59 | write-host "---------------------- ENVIRONMENT ----------------------" 60 | write-host "" 61 | --------------------------------------------------------------------------------