From aad14c127b314492193906534006aa2fcf05eaa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 11:06:46 +0200 Subject: [PATCH 01/30] Add unity project --- .gitignore | 432 ++++++++++-- UnityResourceGenerator/.gitignore | 79 +++ UnityResourceGenerator/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 259 +++++++ .../Assets/Scenes/SampleScene.unity.meta | 7 + UnityResourceGenerator/Packages/manifest.json | 42 ++ .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 34 + .../ProjectSettings/EditorBuildSettings.asset | 8 + .../ProjectSettings/EditorSettings.asset | 35 + .../ProjectSettings/GraphicsSettings.asset | 63 ++ .../ProjectSettings/InputManager.asset | 295 ++++++++ .../ProjectSettings/NavMeshAreas.asset | 91 +++ .../ProjectSettings/Physics2DSettings.asset | 56 ++ .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 662 ++++++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 232 ++++++ .../ProjectSettings/TagManager.asset | 43 ++ .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 34 + .../ProjectSettings/VFXManager.asset | 12 + .../ProjectSettings/XRSettings.asset | 10 + 24 files changed, 2398 insertions(+), 47 deletions(-) create mode 100644 UnityResourceGenerator/.gitignore create mode 100644 UnityResourceGenerator/Assets/Scenes.meta create mode 100644 UnityResourceGenerator/Assets/Scenes/SampleScene.unity create mode 100644 UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta create mode 100644 UnityResourceGenerator/Packages/manifest.json create mode 100644 UnityResourceGenerator/ProjectSettings/AudioManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/ClusterInputManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/DynamicsManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/EditorSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/GraphicsSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/InputManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/NavMeshAreas.asset create mode 100644 UnityResourceGenerator/ProjectSettings/Physics2DSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/PresetManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/ProjectSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/ProjectVersion.txt create mode 100644 UnityResourceGenerator/ProjectSettings/QualitySettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/TagManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/TimeManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/UnityConnectSettings.asset create mode 100644 UnityResourceGenerator/ProjectSettings/VFXManager.asset create mode 100644 UnityResourceGenerator/ProjectSettings/XRSettings.asset diff --git a/.gitignore b/.gitignore index 8af868e..4a4851a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,60 +1,398 @@ -# This .gitignore file should be placed at the root of your Unity project directory -# -# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore -# -/[Ll]ibrary/ -/[Tt]emp/ -/[Oo]bj/ -/[Bb]uild/ -/[Bb]uilds/ -/[Ll]ogs/ -/[Mm]emoryCaptures/ - -# Asset meta data should only be ignored when the corresponding asset is also ignored -!/[Aa]ssets/**/*.meta - -# Uncomment this line if you wish to ignore the asset store tools plugin -# /[Aa]ssets/AssetStoreTools* - -# Autogenerated Jetbrains Rider plugin -[Aa]ssets/Plugins/Editor/JetBrains* - -# Visual Studio cache directory -.vs/ -# Gradle cache directory -.gradle/ +# Created by https://www.toptal.com/developers/gitignore/api/visualstudio +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore -# Autogenerated VS/MD/Consulo solution and project files -ExportedObj/ -.consulo/ -*.csproj -*.unityproj -*.sln +# User-specific files +*.rsuser *.suo -*.tmp *.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) *.userprefs -*.pidb -*.booproj -*.svd + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch *.pdb -*.mdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb *.opendb +*.opensdf +*.sdf +*.cachefile *.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace -# Unity3D generated meta files -*.pidb.meta -*.pdb.meta -*.mdb.meta +# Local History for Visual Studio Code +.history/ -# Unity3D generated file on crash reports -sysinfo.txt +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp -# Builds -*.apk -*.unitypackage +# JetBrains Rider +.idea/ +*.sln.iml -# Crashlytics generated file -crashlytics-build.properties +### VisualStudio Patch ### +# Additional files built by Visual Studio +# End of https://www.toptal.com/developers/gitignore/api/visualstudio \ No newline at end of file diff --git a/UnityResourceGenerator/.gitignore b/UnityResourceGenerator/.gitignore new file mode 100644 index 0000000..14dd96e --- /dev/null +++ b/UnityResourceGenerator/.gitignore @@ -0,0 +1,79 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/unity +# Edit at https://www.toptal.com/developers/gitignore?templates=unity + +### Unity ### +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Asset meta data should only be ignored when the corresponding asset is also ignored +!/[Aa]ssets/**/*.meta + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* + +# End of https://www.toptal.com/developers/gitignore/api/unity + +!Packages/* diff --git a/UnityResourceGenerator/Assets/Scenes.meta b/UnityResourceGenerator/Assets/Scenes.meta new file mode 100644 index 0000000..93ad2cb --- /dev/null +++ b/UnityResourceGenerator/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4978353de51404640acd3f206566c8f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/Scenes/SampleScene.unity b/UnityResourceGenerator/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000..d7548dd --- /dev/null +++ b/UnityResourceGenerator/Assets/Scenes/SampleScene.unity @@ -0,0 +1,259 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta b/UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..952bd1e --- /dev/null +++ b/UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fc0d4010bbf28b4594072e72b8655ab +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Packages/manifest.json b/UnityResourceGenerator/Packages/manifest.json new file mode 100644 index 0000000..9e7c23a --- /dev/null +++ b/UnityResourceGenerator/Packages/manifest.json @@ -0,0 +1,42 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "1.2.16", + "com.unity.ide.rider": "1.1.4", + "com.unity.ide.vscode": "1.2.0", + "com.unity.test-framework": "1.1.14", + "com.unity.textmeshpro": "2.0.1", + "com.unity.timeline": "1.2.14", + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/UnityResourceGenerator/ProjectSettings/AudioManager.asset b/UnityResourceGenerator/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..07ebfb0 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 1024 diff --git a/UnityResourceGenerator/ProjectSettings/ClusterInputManager.asset b/UnityResourceGenerator/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/UnityResourceGenerator/ProjectSettings/DynamicsManager.asset b/UnityResourceGenerator/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..cdc1f3e --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/UnityResourceGenerator/ProjectSettings/EditorSettings.asset b/UnityResourceGenerator/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..f920544 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/EditorSettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 0 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 diff --git a/UnityResourceGenerator/ProjectSettings/GraphicsSettings.asset b/UnityResourceGenerator/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..43369e3 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/UnityResourceGenerator/ProjectSettings/InputManager.asset b/UnityResourceGenerator/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/UnityResourceGenerator/ProjectSettings/NavMeshAreas.asset b/UnityResourceGenerator/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/UnityResourceGenerator/ProjectSettings/Physics2DSettings.asset b/UnityResourceGenerator/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..47880b1 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/UnityResourceGenerator/ProjectSettings/PresetManager.asset b/UnityResourceGenerator/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/UnityResourceGenerator/ProjectSettings/ProjectSettings.asset b/UnityResourceGenerator/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..8436748 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,662 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 20 + productGUID: 6cd761ad7f7e99245904181cbea76a74 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: UnityResourceGenerator + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidBlitType: 0 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 1 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 0 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + lumin: + depthFormat: 0 + frameTiming: 2 + enableGLCache: 0 + glCacheMaxBlobSize: 524288 + glCacheMaxFileSize: 8388608 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 1 + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 19 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 1 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 10.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 10.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@4.2.8 + templateDefaultScene: Assets/Scenes/SampleScene.unity + AndroidTargetArchitectures: 1 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 1 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 1 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 1 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 1 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 0 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 0 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 16 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLWasmStreaming: 0 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 0 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Template_3D + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Template_3D + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: + UNet: 1 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/UnityResourceGenerator/ProjectSettings/ProjectVersion.txt b/UnityResourceGenerator/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..d6e4713 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2019.4.0f1 +m_EditorVersionWithRevision: 2019.4.0f1 (0af376155913) diff --git a/UnityResourceGenerator/ProjectSettings/QualitySettings.asset b/UnityResourceGenerator/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..7b7658d --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/QualitySettings.asset @@ -0,0 +1,232 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + Nintendo 3DS: 5 + Nintendo Switch: 5 + PS4: 5 + PSP2: 2 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/UnityResourceGenerator/ProjectSettings/TagManager.asset b/UnityResourceGenerator/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/UnityResourceGenerator/ProjectSettings/TimeManager.asset b/UnityResourceGenerator/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/UnityResourceGenerator/ProjectSettings/UnityConnectSettings.asset b/UnityResourceGenerator/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..fa0b146 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/UnityResourceGenerator/ProjectSettings/VFXManager.asset b/UnityResourceGenerator/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/UnityResourceGenerator/ProjectSettings/XRSettings.asset b/UnityResourceGenerator/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/UnityResourceGenerator/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file From ab3d5a8bcb48440d0cfe40447994ad7858bf7096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 11:13:33 +0200 Subject: [PATCH 02/30] clean up packages --- UnityResourceGenerator/Packages/manifest.json | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/UnityResourceGenerator/Packages/manifest.json b/UnityResourceGenerator/Packages/manifest.json index 9e7c23a..91db48f 100644 --- a/UnityResourceGenerator/Packages/manifest.json +++ b/UnityResourceGenerator/Packages/manifest.json @@ -1,11 +1,8 @@ { "dependencies": { - "com.unity.collab-proxy": "1.2.16", "com.unity.ide.rider": "1.1.4", - "com.unity.ide.vscode": "1.2.0", - "com.unity.test-framework": "1.1.14", - "com.unity.textmeshpro": "2.0.1", - "com.unity.timeline": "1.2.14", + "com.unity.ide.vscode": "1.2.4", + "com.unity.test-framework": "1.1.29", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", From 2d2267b1804c4dc71061c26fc752371d093ce82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 11:20:10 +0200 Subject: [PATCH 03/30] add initial implementation --- UnityResourceGenerator/.vsconfig | 6 ++ .../Assets/UnityResourceGenerator.Sample.meta | 8 ++ .../ResourcePaths.cs | 11 +++ .../ResourcePaths.cs.meta | 11 +++ .../Scenes.meta | 0 .../Scenes/SampleScene.unity | 0 .../Scenes/SampleScene.unity.meta | 0 .../UnityResourceGenerator.Sample.asmdef | 15 ++++ .../UnityResourceGenerator.Sample.asmdef.meta | 7 ++ .../Assets/UnityResourceGenerator.meta | 8 ++ .../EnumerableExtensions.cs | 31 ++++++++ .../EnumerableExtensions.cs.meta | 3 + .../IModuleGenerator.cs | 7 ++ .../IModuleGenerator.cs.meta | 3 + .../IResourcePostProcessor.cs | 8 ++ .../IResourcePostProcessor.cs.meta | 3 + .../RemoveUnnecessaryNewLines.cs | 12 +++ .../RemoveUnnecessaryNewLines.cs.meta | 11 +++ .../UnityResourceGenerator/ResourceContext.cs | 31 ++++++++ .../ResourceContext.cs.meta | 3 + .../ResourceFileGenerator.cs | 77 +++++++++++++++++++ .../ResourceFileGenerator.cs.meta | 3 + .../ResourceFileMenu.cs | 30 ++++++++ .../ResourceFileMenu.cs.meta | 3 + .../UnityResourceGenerator/ScenesModule.cs | 51 ++++++++++++ .../ScenesModule.cs.meta | 11 +++ .../UnityResourceGenerator.asmdef | 15 ++++ .../UnityResourceGenerator.asmdef.meta | 7 ++ 28 files changed, 375 insertions(+) create mode 100644 UnityResourceGenerator/.vsconfig create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta rename UnityResourceGenerator/Assets/{ => UnityResourceGenerator.Sample}/Scenes.meta (100%) rename UnityResourceGenerator/Assets/{ => UnityResourceGenerator.Sample}/Scenes/SampleScene.unity (100%) rename UnityResourceGenerator/Assets/{ => UnityResourceGenerator.Sample}/Scenes/SampleScene.unity.meta (100%) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta diff --git a/UnityResourceGenerator/.vsconfig b/UnityResourceGenerator/.vsconfig new file mode 100644 index 0000000..1586a48 --- /dev/null +++ b/UnityResourceGenerator/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta new file mode 100644 index 0000000..7f8537b --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3005e45e2604e024abeac6f7280539a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs new file mode 100644 index 0000000..65e8c32 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs @@ -0,0 +1,11 @@ +namespace UnityResourceGenerator.Sample +{ + // ReSharper disable PartialTypeWithSinglePart + public static partial class ResourcePaths + { + public static partial class Scenes + { + public const string SampleSceneScene = "UnityResourceGenerator.Sample/Scenes/SampleScene.unity"; + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta new file mode 100644 index 0000000..ab0f49b --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9365b69addd5f26478ccf0a6a4715b74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/Scenes.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes.meta similarity index 100% rename from UnityResourceGenerator/Assets/Scenes.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes.meta diff --git a/UnityResourceGenerator/Assets/Scenes/SampleScene.unity b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity similarity index 100% rename from UnityResourceGenerator/Assets/Scenes/SampleScene.unity rename to UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity diff --git a/UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity.meta similarity index 100% rename from UnityResourceGenerator/Assets/Scenes/SampleScene.unity.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef new file mode 100644 index 0000000..94639c6 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef @@ -0,0 +1,15 @@ +{ + "name": "UnityResourceGenerator.Sample", + "references": [ + "GUID:bf5358081130cea4e8844e0ea5848f6d" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta new file mode 100644 index 0000000..93569b5 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d0cbb1d705c032b4bbf7a7e5223c4a56 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.meta new file mode 100644 index 0000000..d006445 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bdbd3e4e4a63663419b61846f15e0687 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs new file mode 100644 index 0000000..5ce6175 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace UnityResourceGenerator +{ + internal static class EnumerableExtensions + { + public static IEnumerable Duplicates(this IEnumerable source, Func selector) + { + var grouped = source.GroupBy(selector); + var moreThan1 = grouped.Where(i => i.IsMultiple()); + return moreThan1.SelectMany(i => i); + } + + private static bool IsMultiple(this IEnumerable source) + { + // ReSharper disable once GenericEnumeratorNotDisposed + var enumerator = source.GetEnumerator(); + return enumerator.MoveNext() && enumerator.MoveNext(); + } + + public static void ForEach(this IEnumerable enumerable, Action action) + { + foreach (var item in enumerable) + { + action(item); + } + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta new file mode 100644 index 0000000..a419ddb --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6251f8fa6bbd4dbf92d99b813688c6f4 +timeCreated: 1633957946 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs new file mode 100644 index 0000000..f79bf71 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs @@ -0,0 +1,7 @@ +namespace UnityResourceGenerator +{ + public interface IModuleGenerator + { + string Generate(ResourceContext context); + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta new file mode 100644 index 0000000..e7fa06a --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6b28c75550ee49b182fe8d1f9d67f5a8 +timeCreated: 1633958989 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs new file mode 100644 index 0000000..3ba7d0e --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs @@ -0,0 +1,8 @@ +namespace UnityResourceGenerator +{ + public interface IResourcePostProcessor + { + int PostProcessPriority { get; } + string PostProcess(ResourceContext context, string resourceFileContent); + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta new file mode 100644 index 0000000..9300e41 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2ada8c96fd5e48d8b7ae86e82b3c3d1d +timeCreated: 1633960037 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs new file mode 100644 index 0000000..b97502f --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs @@ -0,0 +1,12 @@ +using System.Text.RegularExpressions; + +namespace UnityResourceGenerator +{ + public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor + { + public string PostProcess(ResourceContext context, string resourceFileContent) => + Regex.Replace(resourceFileContent, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline); + + public int PostProcessPriority { get; } = 0; + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta new file mode 100644 index 0000000..f647eca --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a39c854a601db264189be95f8e6dd2f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs new file mode 100644 index 0000000..17f7b9b --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs @@ -0,0 +1,31 @@ +using System; + +namespace UnityResourceGenerator +{ + public sealed class ResourceContext + { + public ResourceContext + ( + string assetsFolder, + string folderPath, + string baseNamespace, + string className, + Action info, + Action error) + { + AssetsFolder = assetsFolder; + FolderPath = folderPath; + BaseNamespace = baseNamespace; + ClassName = className; + Info = info; + Error = error; + } + + public string AssetsFolder { get; } + public string FolderPath { get; } + public string BaseNamespace { get; } + public string ClassName { get; } + public Action Info { get; } + public Action Error { get; } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta new file mode 100644 index 0000000..afd9712 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0a314844180a4d26bcc48eaf22184d84 +timeCreated: 1633958009 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs new file mode 100644 index 0000000..ddec751 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; + +namespace UnityResourceGenerator +{ + public static class ResourceFileGenerator + { + public static void CreateResourceFile(ResourceContext context) + { + // ReSharper disable once MissingIndent + const string fileBegin = +@"namespace {0} +{ + // ReSharper disable PartialTypeWithSinglePart + public static partial class {1} + {"; + + // ReSharper disable once MissingIndent + const string fileEnd = +@" } +}"; + + var filePath = Path.GetFullPath(Path.Combine(context.AssetsFolder, context.FolderPath, $"{context.ClassName}.cs")); + + var builder = new StringBuilder(); + + var allConcreteTypes = AppDomain + .CurrentDomain + .GetAssemblies() + .SelectMany(a => a.GetTypes()) + .Where(t => !t.IsAbstract && !t.IsGenericType && !t.IsInterface) + .ToArray(); + + builder.AppendLine( + fileBegin + .Replace("{0}", context.BaseNamespace) + .Replace("{1}", context.ClassName)); + + allConcreteTypes + .Where(t => t.GetInterfaces().Any(i => typeof(IModuleGenerator).IsAssignableFrom(i))) + .Select(t => (IModuleGenerator)Activator.CreateInstance(t)) + .Select(m => m.Generate(context)) + .ForEach(m => builder.AppendLine(m)); + + builder.AppendLine(fileEnd); + + var fileContent = builder.ToString(); + + fileContent = allConcreteTypes + .Where(t => t.GetInterfaces().Any(i => typeof(IResourcePostProcessor).IsAssignableFrom(i))) + .Select(t => (IResourcePostProcessor)Activator.CreateInstance(t)) + .OrderByDescending(p => p.PostProcessPriority) + .Aggregate(fileContent, (current, processor) => processor.PostProcess(context, current)); + + if (File.Exists(filePath)) + { + var old = File.ReadAllText(filePath); + if (old == fileContent) + { + context.Info("Resource file did not change"); + return; + } + } + + File.WriteAllText(filePath, fileContent); + context.Info($"Created resource file at: {filePath}"); + } + + public static string CreateResourcePath(string filePath, ResourceContext context) => + filePath + .Replace(context.AssetsFolder, string.Empty) + .Replace('\\', '/') + .Remove(0, 1); + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta new file mode 100644 index 0000000..48fb064 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 86973d55f3184196af10eb8eba5c2e13 +timeCreated: 1633954404 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs new file mode 100644 index 0000000..2e6f6a4 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs @@ -0,0 +1,30 @@ +using UnityEditor; +using UnityEngine; + +namespace UnityResourceGenerator +{ + public static class ResourceFileMenu + { + [MenuItem("Tools / Generate Resources")] + public static void GenerateResources() + { + const string baseNamespace = "UnityResourceGenerator.Sample"; + const string className = "ResourcePaths"; + const string folderPath = "UnityResourceGenerator.Sample"; + var assetsFolder = Application.dataPath; + + ResourceFileGenerator.CreateResourceFile + ( + new ResourceContext + ( + assetsFolder, + folderPath, + baseNamespace, + className, + Debug.Log, + Debug.LogError + ) + ); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta new file mode 100644 index 0000000..de6c63c --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 38a38bb4f6d6484d9aa9a38f5194b405 +timeCreated: 1633950334 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs new file mode 100644 index 0000000..4301b39 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; + +namespace UnityResourceGenerator +{ + public sealed class ScenesModule : IModuleGenerator + { + public string Generate(ResourceContext context) + { + // ReSharper disable once MissingIndent + const string classBegin = +@" + public static partial class Scenes + { +"; + // ReSharper disable once MissingIndent + const string classEnd = " }"; + + var values = Directory + .EnumerateFiles(context.AssetsFolder, "*.unity", SearchOption.AllDirectories) + .Select(p => + ( + name: Path.GetFileNameWithoutExtension(p) + "Scene", + path: ResourceFileGenerator.CreateResourcePath(p, context) + )) + .ToArray(); + + var duplicates = values.Duplicates(v => v.name).ToArray(); + + if (duplicates.Length > 0) + { + context.Error(duplicates.Aggregate(new StringBuilder(), (sb, v) => sb.Append(v.name).Append(' ').AppendLine(v.path)).ToString()); + throw new InvalidOperationException("Found duplicate file names"); + } + + return values + .Aggregate( + new StringBuilder().Append(classBegin), + (sb, s) => sb + .Append(" public const string ") + .Append(s.name) + .Append(" = \"") + .Append(s.path) + .AppendLine("\";")) + .AppendLine(classEnd) + .ToString(); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta new file mode 100644 index 0000000..a400996 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbf7b8f9623bf204a9f17d1e5642b9ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef b/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef new file mode 100644 index 0000000..7dd4a91 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef @@ -0,0 +1,15 @@ +{ + "name": "UnityResourceGenerator", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta new file mode 100644 index 0000000..19bb16c --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bf5358081130cea4e8844e0ea5848f6d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 46fa4d81865c4b1b98270ee187420e5d092d68d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 11:26:19 +0200 Subject: [PATCH 04/30] add package.json --- .../Assets/UnityResourceGenerator/package.json | 10 ++++++++++ .../Assets/UnityResourceGenerator/package.json.meta | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/package.json create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json new file mode 100644 index 0000000..34ee40f --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json @@ -0,0 +1,10 @@ +{ + "name": "com.autsoft.unityresourcegenerator", + "displayName": "Unity Resource Generator", + "description": "Generate path strings for Resources.Load", + "version": "0.1.0", + "author": { + "name": "AutSoft Zrt.", + "url": "https://github.com/AutSoft/UnityResourceGenerator" + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta new file mode 100644 index 0000000..5edae1f --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 55625d3a7a89e3c4ab3e33e9be524f3b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 88b6cf70514f13775e76f0b95e30e0bdc04d9681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 11:30:11 +0200 Subject: [PATCH 05/30] move unity-independent code to different folder --- .../Assets/UnityResourceGenerator/Generation.meta | 3 +++ .../{ => Generation}/EnumerableExtensions.cs | 2 +- .../{ => Generation}/EnumerableExtensions.cs.meta | 0 .../{ => Generation}/IModuleGenerator.cs | 2 +- .../{ => Generation}/IModuleGenerator.cs.meta | 0 .../{ => Generation}/IResourcePostProcessor.cs | 2 +- .../{ => Generation}/IResourcePostProcessor.cs.meta | 0 .../{ => Generation}/RemoveUnnecessaryNewLines.cs | 2 +- .../{ => Generation}/RemoveUnnecessaryNewLines.cs.meta | 0 .../UnityResourceGenerator/{ => Generation}/ResourceContext.cs | 2 +- .../{ => Generation}/ResourceContext.cs.meta | 0 .../{ => Generation}/ResourceFileGenerator.cs | 2 +- .../{ => Generation}/ResourceFileGenerator.cs.meta | 0 .../UnityResourceGenerator/{ => Generation}/ScenesModule.cs | 2 +- .../{ => Generation}/ScenesModule.cs.meta | 0 .../Assets/UnityResourceGenerator/ResourceFileMenu.cs | 1 + 16 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/EnumerableExtensions.cs (95%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/EnumerableExtensions.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/IModuleGenerator.cs (68%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/IModuleGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/IResourcePostProcessor.cs (79%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/IResourcePostProcessor.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/RemoveUnnecessaryNewLines.cs (89%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/RemoveUnnecessaryNewLines.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ResourceContext.cs (94%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ResourceContext.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ResourceFileGenerator.cs (98%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ResourceFileGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ScenesModule.cs (97%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Generation}/ScenesModule.cs.meta (100%) diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta new file mode 100644 index 0000000..10da4ff --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d91809d80ef148a8a0b1f39de6c21ca9 +timeCreated: 1634030816 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs similarity index 95% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs index 5ce6175..23ffcc3 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { internal static class EnumerableExtensions { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/EnumerableExtensions.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs similarity index 68% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs index f79bf71..a28d3a2 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public interface IModuleGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/IModuleGenerator.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs similarity index 79% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs index 3ba7d0e..9dc8860 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public interface IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/IResourcePostProcessor.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs similarity index 89% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs index b97502f..54e5955 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/RemoveUnnecessaryNewLines.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs similarity index 94% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs index 17f7b9b..3677e1b 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs @@ -1,6 +1,6 @@ using System; -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public sealed class ResourceContext { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceContext.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs similarity index 98% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs index ddec751..83d61d5 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public static class ResourceFileGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileGenerator.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs similarity index 97% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs index 4301b39..1e10bb2 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator +namespace UnityResourceGenerator.Generation { public sealed class ScenesModule : IModuleGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ScenesModule.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs index 2e6f6a4..d83b843 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs @@ -1,5 +1,6 @@ using UnityEditor; using UnityEngine; +using UnityResourceGenerator.Generation; namespace UnityResourceGenerator { From 80211dd784568027f30434ea8e18b98eecc32558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 12:23:37 +0200 Subject: [PATCH 06/30] move to uniyt recommended folder structure --- .../UnityResourceGenerator.Sample.asmdef | 4 +- .../Assets/UnityResourceGenerator/Editor.meta | 8 ++++ .../{ => Editor}/Generation.meta | 0 .../Generation/EnumerableExtensions.cs | 2 +- .../Generation/EnumerableExtensions.cs.meta | 0 .../Generation/IModuleGenerator.cs | 2 +- .../Generation/IModuleGenerator.cs.meta | 0 .../Generation/IResourcePostProcessor.cs | 2 +- .../Generation/IResourcePostProcessor.cs.meta | 0 .../Generation/RemoveUnnecessaryNewLines.cs | 2 +- .../RemoveUnnecessaryNewLines.cs.meta | 0 .../Generation/ResourceContext.cs | 2 +- .../Generation/ResourceContext.cs.meta | 0 .../Generation/ResourceFileGenerator.cs | 20 ++------ .../Generation/ResourceFileGenerator.cs.meta | 0 .../{ => Editor}/Generation/ScenesModule.cs | 2 +- .../Generation/ScenesModule.cs.meta | 0 .../Editor/ResourceFileMenu.cs | 46 +++++++++++++++++++ .../{ => Editor}/ResourceFileMenu.cs.meta | 0 .../UnityResourceGenerator.Editor.asmdef} | 0 ...UnityResourceGenerator.Editor.asmdef.meta} | 0 .../ResourceFileMenu.cs | 31 ------------- 22 files changed, 64 insertions(+), 57 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/EnumerableExtensions.cs (94%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/EnumerableExtensions.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/IModuleGenerator.cs (65%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/IModuleGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/IResourcePostProcessor.cs (77%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/IResourcePostProcessor.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/RemoveUnnecessaryNewLines.cs (88%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/RemoveUnnecessaryNewLines.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ResourceContext.cs (94%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ResourceContext.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ResourceFileGenerator.cs (74%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ResourceFileGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ScenesModule.cs (97%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/Generation/ScenesModule.cs.meta (100%) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs rename UnityResourceGenerator/Assets/UnityResourceGenerator/{ => Editor}/ResourceFileMenu.cs.meta (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{UnityResourceGenerator.asmdef => Editor/UnityResourceGenerator.Editor.asmdef} (100%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/{UnityResourceGenerator.asmdef.meta => Editor/UnityResourceGenerator.Editor.asmdef.meta} (100%) delete mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef index 94639c6..0c566cf 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef @@ -1,8 +1,6 @@ { "name": "UnityResourceGenerator.Sample", - "references": [ - "GUID:bf5358081130cea4e8844e0ea5848f6d" - ], + "references": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta new file mode 100644 index 0000000..3d56da9 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e36e8d47fad4084abc3e64c1d28c13a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs similarity index 94% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs index 23ffcc3..e30556f 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { internal static class EnumerableExtensions { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/EnumerableExtensions.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs similarity index 65% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs index a28d3a2..1e8d552 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public interface IModuleGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IModuleGenerator.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs similarity index 77% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs index 9dc8860..36814bc 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public interface IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/IResourcePostProcessor.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs similarity index 88% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs index 54e5955..4e55005 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/RemoveUnnecessaryNewLines.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs similarity index 94% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs index 3677e1b..f3a0d01 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs @@ -1,6 +1,6 @@ using System; -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public sealed class ResourceContext { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceContext.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs similarity index 74% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs index 83d61d5..be50723 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs @@ -1,13 +1,12 @@ using System; -using System.IO; using System.Linq; using System.Text; -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public static class ResourceFileGenerator { - public static void CreateResourceFile(ResourceContext context) + public static string CreateResourceFile(ResourceContext context) { // ReSharper disable once MissingIndent const string fileBegin = @@ -22,8 +21,6 @@ public static partial class {1} @" } }"; - var filePath = Path.GetFullPath(Path.Combine(context.AssetsFolder, context.FolderPath, $"{context.ClassName}.cs")); - var builder = new StringBuilder(); var allConcreteTypes = AppDomain @@ -54,18 +51,7 @@ public static partial class {1} .OrderByDescending(p => p.PostProcessPriority) .Aggregate(fileContent, (current, processor) => processor.PostProcess(context, current)); - if (File.Exists(filePath)) - { - var old = File.ReadAllText(filePath); - if (old == fileContent) - { - context.Info("Resource file did not change"); - return; - } - } - - File.WriteAllText(filePath, fileContent); - context.Info($"Created resource file at: {filePath}"); + return fileContent; } public static string CreateResourcePath(string filePath, ResourceContext context) => diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ResourceFileGenerator.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs similarity index 97% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs index 1e10bb2..121aca1 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator.Generation +namespace UnityResourceGenerator.Editor.Generation { public sealed class ScenesModule : IModuleGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Generation/ScenesModule.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs new file mode 100644 index 0000000..f10f340 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -0,0 +1,46 @@ +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityResourceGenerator.Editor.Generation; + +namespace UnityResourceGenerator.Editor +{ + public static class ResourceFileMenu + { + [MenuItem("Tools / Generate Resources")] + public static void GenerateResources() + { + const string baseNamespace = "UnityResourceGenerator.Sample"; + const string className = "ResourcePaths"; + const string folderPath = "UnityResourceGenerator.Sample"; + var assetsFolder = Application.dataPath; + + var context = new ResourceContext + ( + assetsFolder, + folderPath, + baseNamespace, + className, + Debug.Log, + Debug.LogError + ); + + var fileContent = ResourceFileGenerator.CreateResourceFile(context); + + var filePath = Path.GetFullPath(Path.Combine(context.AssetsFolder, context.FolderPath, $"{context.ClassName}.cs")); + + if (File.Exists(filePath)) + { + var old = File.ReadAllText(filePath); + if (old == fileContent) + { + context.Info("Resource file did not change"); + return; + } + } + + File.WriteAllText(filePath, fileContent); + context.Info($"Created resource file at: {filePath}"); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/UnityResourceGenerator.asmdef.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs deleted file mode 100644 index d83b843..0000000 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/ResourceFileMenu.cs +++ /dev/null @@ -1,31 +0,0 @@ -using UnityEditor; -using UnityEngine; -using UnityResourceGenerator.Generation; - -namespace UnityResourceGenerator -{ - public static class ResourceFileMenu - { - [MenuItem("Tools / Generate Resources")] - public static void GenerateResources() - { - const string baseNamespace = "UnityResourceGenerator.Sample"; - const string className = "ResourcePaths"; - const string folderPath = "UnityResourceGenerator.Sample"; - var assetsFolder = Application.dataPath; - - ResourceFileGenerator.CreateResourceFile - ( - new ResourceContext - ( - assetsFolder, - folderPath, - baseNamespace, - className, - Debug.Log, - Debug.LogError - ) - ); - } - } -} From 0c584d138ca4cd89c84e1ff32bba5fa5838f4a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 12:29:49 +0200 Subject: [PATCH 07/30] add file extension to license --- LICENSE => LICENSE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.md (100%) diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md From 96d06ed0a66d059d63f6e399702996fd8ed6b367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 12:45:42 +0200 Subject: [PATCH 08/30] add settings --- .../Assets/ResourceGenerator.asset | 19 ++++++ .../Assets/ResourceGenerator.asset.meta | 8 +++ .../Editor/ResourceFileMenu.cs | 22 +++--- .../Editor/ResourceGeneratorSettings.cs | 68 +++++++++++++++++++ .../Editor/ResourceGeneratorSettings.cs.meta | 3 + 5 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 UnityResourceGenerator/Assets/ResourceGenerator.asset create mode 100644 UnityResourceGenerator/Assets/ResourceGenerator.asset.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset new file mode 100644 index 0000000..93b3466 --- /dev/null +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3cdd186d920f45adb2925f11fda1bdd8, type: 3} + m_Name: ResourceGenerator + m_EditorClassIdentifier: + _baseNamespace: UnityResourceGenerator.Sample + _className: ResourcePaths + _folderPath: UnityResourceGenerator.Sample + _logInfo: 0 + _logError: 1 diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset.meta b/UnityResourceGenerator/Assets/ResourceGenerator.asset.meta new file mode 100644 index 0000000..b226356 --- /dev/null +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ee671898537bdc4d8a523f07576b005 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs index f10f340..1c1a7a8 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using UnityEditor; using UnityEngine; using UnityResourceGenerator.Editor.Generation; @@ -7,22 +8,21 @@ namespace UnityResourceGenerator.Editor { public static class ResourceFileMenu { - [MenuItem("Tools / Generate Resources")] + [MenuItem("Tools / Generate Resources Paths")] public static void GenerateResources() { - const string baseNamespace = "UnityResourceGenerator.Sample"; - const string className = "ResourcePaths"; - const string folderPath = "UnityResourceGenerator.Sample"; + var settings = ResourceGeneratorSettings.GetOrCreateSettings(); + var assetsFolder = Application.dataPath; var context = new ResourceContext ( assetsFolder, - folderPath, - baseNamespace, - className, - Debug.Log, - Debug.LogError + settings.FolderPath, + settings.BaseNamespace, + settings.ClassName, + settings.LogInfo ? Debug.Log : LogEmpty, + settings.LogError ? Debug.LogError : LogEmpty ); var fileContent = ResourceFileGenerator.CreateResourceFile(context); @@ -42,5 +42,7 @@ public static void GenerateResources() File.WriteAllText(filePath, fileContent); context.Info($"Created resource file at: {filePath}"); } + + private static Action LogEmpty => _ => { }; } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs new file mode 100644 index 0000000..0d4ba91 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace UnityResourceGenerator.Editor +{ + public sealed class ResourceGeneratorSettings : ScriptableObject + { + private const string SettingsPath = "Assets/ResourceGenerator.asset"; + + [SerializeField] private string _baseNamespace; + [SerializeField] private string _className; + + [SerializeField] + [Tooltip("Relative path from the Assets folder")] + private string _folderPath; + + [SerializeField] private bool _logInfo; + [SerializeField] private bool _logError; + + public string FolderPath => _folderPath; + public string BaseNamespace => _baseNamespace; + public string ClassName => _className; + public bool LogInfo => _logInfo; + public bool LogError => _logError; + + public static ResourceGeneratorSettings GetOrCreateSettings() + { + var settings = AssetDatabase.LoadAssetAtPath(SettingsPath); + if (settings != null) return settings; + + settings = CreateInstance(); + + settings._folderPath = string.Empty; + settings._baseNamespace = "Resources"; + settings._className = "ResourcePaths"; + settings._logInfo = false; + settings._logError = true; + + AssetDatabase.CreateAsset(settings, SettingsPath); + AssetDatabase.SaveAssets(); + + return settings; + } + + [SettingsProvider] + public static SettingsProvider CreateSettingsProvider() => + new SettingsProvider("Project/ResourceGenerator", SettingsScope.Project) + { + label = "ResourceGenerator", + guiHandler = searchContext => + { + var settings = GetSerializedSettings(); + + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_folderPath)), new GUIContent("Folder from Assets")); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_baseNamespace)), new GUIContent("Namespace")); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_className)), new GUIContent("Class name")); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logInfo)), new GUIContent("Log Infos")); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logError)), new GUIContent("Log Errors")); + + settings.ApplyModifiedProperties(); + }, + keywords = new HashSet(new[] { "Resource", "Path" }), + }; + + public static SerializedObject GetSerializedSettings() => new SerializedObject(GetOrCreateSettings()); + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta new file mode 100644 index 0000000..2a74e94 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3cdd186d920f45adb2925f11fda1bdd8 +timeCreated: 1634035251 \ No newline at end of file From 2ea576eb97f875eef9e05666af7088f7a8bfb5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 13:14:29 +0200 Subject: [PATCH 09/30] add more logging --- .../Editor/Generation/RemoveUnnecessaryNewLines.cs | 12 ++++++++++-- .../Editor/Generation/ScenesModule.cs | 8 +++++++- .../Editor/ResourceFileMenu.cs | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs index 4e55005..a0093d5 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs @@ -4,8 +4,16 @@ namespace UnityResourceGenerator.Editor.Generation { public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor { - public string PostProcess(ResourceContext context, string resourceFileContent) => - Regex.Replace(resourceFileContent, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline); + public string PostProcess(ResourceContext context, string resourceFileContent) + { + context.Info("Started removing unnecessary new lines"); + + var output = Regex.Replace(resourceFileContent, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline); + + context.Info("Finished removing unnecessary new lines"); + + return output; + } public int PostProcessPriority { get; } = 0; } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs index 121aca1..2e6f903 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs @@ -9,6 +9,8 @@ public sealed class ScenesModule : IModuleGenerator { public string Generate(ResourceContext context) { + context.Info("Started generating scenes"); + // ReSharper disable once MissingIndent const string classBegin = @" @@ -35,7 +37,7 @@ public static partial class Scenes throw new InvalidOperationException("Found duplicate file names"); } - return values + var output = values .Aggregate( new StringBuilder().Append(classBegin), (sb, s) => sb @@ -46,6 +48,10 @@ public static partial class Scenes .AppendLine("\";")) .AppendLine(classEnd) .ToString(); + + context.Info("Finished generating scenes"); + + return output; } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs index 1c1a7a8..5f6cff5 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -25,6 +25,7 @@ public static void GenerateResources() settings.LogError ? Debug.LogError : LogEmpty ); + context.Info("Resource Path generation started"); var fileContent = ResourceFileGenerator.CreateResourceFile(context); var filePath = Path.GetFullPath(Path.Combine(context.AssetsFolder, context.FolderPath, $"{context.ClassName}.cs")); From d02ab0534dcb97ba47c923dd5e332a73bf759640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 13:45:56 +0200 Subject: [PATCH 10/30] add changelog, email, license info to package --- CHANGELOG.md | 2 ++ .../Assets/UnityResourceGenerator/package.json | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..12b8b91 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +## 0.1.0 +- Add initial project \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json index 34ee40f..f461231 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json @@ -2,9 +2,16 @@ "name": "com.autsoft.unityresourcegenerator", "displayName": "Unity Resource Generator", "description": "Generate path strings for Resources.Load", + "license": "MIT", + "changelogUrl": "https://github.com/AutSoft/UnityResourceGenerator/blob/main/CHANGELOG.md", "version": "0.1.0", + "keywords": [ + "Editor", + "Resources" + ], "author": { "name": "AutSoft Zrt.", + "email": "info@autsoft.hu", "url": "https://github.com/AutSoft/UnityResourceGenerator" } } \ No newline at end of file From 848daf35aef00151ed1c7659977877b3a22646fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 14:02:06 +0200 Subject: [PATCH 11/30] fix scene generation, add scene samples --- .../Assets/ResourceGenerator.asset | 2 +- .../LoadSceneInitial.cs | 19 + .../LoadSceneInitial.cs.meta | 11 + .../LoadSceneNext.cs | 19 + .../LoadSceneNext.cs.meta | 11 + .../ResourcePaths.cs | 3 +- .../Scenes/LoadSceneInitial.unity | 674 ++++++++++++++++++ ...unity.meta => LoadSceneInitial.unity.meta} | 0 .../Scenes/LoadSceneNext.unity | 674 ++++++++++++++++++ .../Scenes/LoadSceneNext.unity.meta | 7 + .../Scenes/SampleScene.unity | 259 ------- .../Generation/ResourceFileGenerator.cs | 6 - .../Editor/Generation/ScenesModule.cs | 24 +- .../ProjectSettings/EditorBuildSettings.asset | 8 +- 14 files changed, 1444 insertions(+), 273 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity rename UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/{SampleScene.unity.meta => LoadSceneInitial.unity.meta} (100%) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta delete mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 93b3466..935f50f 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -15,5 +15,5 @@ MonoBehaviour: _baseNamespace: UnityResourceGenerator.Sample _className: ResourcePaths _folderPath: UnityResourceGenerator.Sample - _logInfo: 0 + _logInfo: 1 _logError: 1 diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs new file mode 100644 index 0000000..eb53c57 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs @@ -0,0 +1,19 @@ +using System; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +namespace UnityResourceGenerator.Sample +{ + public sealed class LoadSceneInitial : MonoBehaviour + { + [SerializeField] private Button _loadButton = default; + + private void Start() + { + if (_loadButton == null) throw new InvalidOperationException($"Button is not set on {gameObject.name}"); + + _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneInitialScene)); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta new file mode 100644 index 0000000..28f20d5 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dcd623a06cb67f24ea410a3b0868e1a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs new file mode 100644 index 0000000..c378cdf --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs @@ -0,0 +1,19 @@ +using System; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +namespace UnityResourceGenerator.Sample +{ + public sealed class LoadSceneNext : MonoBehaviour + { + [SerializeField] private Button _loadButton = default; + + private void Start() + { + if (_loadButton == null) throw new InvalidOperationException($"Button is not set on {gameObject.name}"); + + _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneNextScene)); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta new file mode 100644 index 0000000..19c0361 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1329cdc71931c8c43a49d5b83232795e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs index 65e8c32..5fe1cf7 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs @@ -5,7 +5,8 @@ public static partial class ResourcePaths { public static partial class Scenes { - public const string SampleSceneScene = "UnityResourceGenerator.Sample/Scenes/SampleScene.unity"; + public const string LoadSceneInitialScene = "UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; + public const string LoadSceneNextScene = "UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity new file mode 100644 index 0000000..8380249 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity @@ -0,0 +1,674 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &983968778 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 983968779} + - component: {fileID: 983968781} + - component: {fileID: 983968780} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &983968779 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983968778} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1620608594} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &983968780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983968778} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Load next scene +--- !u!222 &983968781 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983968778} + m_CullTransparentMesh: 0 +--- !u!1 &1620608593 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1620608594} + - component: {fileID: 1620608597} + - component: {fileID: 1620608596} + - component: {fileID: 1620608595} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1620608594 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620608593} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 983968779} + m_Father: {fileID: 1706593873} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1620608595 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620608593} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1620608596} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1620608596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620608593} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1620608597 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620608593} + m_CullTransparentMesh: 0 +--- !u!1 &1706593869 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1706593873} + - component: {fileID: 1706593872} + - component: {fileID: 1706593871} + - component: {fileID: 1706593870} + - component: {fileID: 1706593874} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1706593870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706593869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1706593871 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706593869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1706593872 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706593869} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1706593873 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706593869} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1620608594} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1706593874 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706593869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1329cdc71931c8c43a49d5b83232795e, type: 3} + m_Name: + m_EditorClassIdentifier: + _loadButton: {fileID: 1620608595} +--- !u!1 &2137202061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2137202064} + - component: {fileID: 2137202063} + - component: {fileID: 2137202062} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2137202062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2137202061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &2137202063 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2137202061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &2137202064 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2137202061} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity new file mode 100644 index 0000000..13ebba9 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity @@ -0,0 +1,674 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &377092166 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 377092170} + - component: {fileID: 377092169} + - component: {fileID: 377092168} + - component: {fileID: 377092167} + - component: {fileID: 377092171} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &377092167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377092166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &377092168 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377092166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &377092169 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377092166} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &377092170 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377092166} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 689572329} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &377092171 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377092166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dcd623a06cb67f24ea410a3b0868e1a3, type: 3} + m_Name: + m_EditorClassIdentifier: + _loadButton: {fileID: 689572330} +--- !u!1 &559351407 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 559351410} + - component: {fileID: 559351409} + - component: {fileID: 559351408} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &559351408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559351407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &559351409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559351407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &559351410 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559351407} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &689572328 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 689572329} + - component: {fileID: 689572332} + - component: {fileID: 689572331} + - component: {fileID: 689572330} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &689572329 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689572328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1787321220} + m_Father: {fileID: 377092170} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &689572330 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689572328} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 689572331} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &689572331 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689572328} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &689572332 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689572328} + m_CullTransparentMesh: 0 +--- !u!1 &838270876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 838270878} + - component: {fileID: 838270877} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &838270877 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 838270876} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &838270878 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 838270876} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1216852447 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1216852450} + - component: {fileID: 1216852449} + - component: {fileID: 1216852448} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1216852448 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1216852447} + m_Enabled: 1 +--- !u!20 &1216852449 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1216852447} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1216852450 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1216852447} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1787321219 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1787321220} + - component: {fileID: 1787321222} + - component: {fileID: 1787321221} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1787321220 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787321219} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 689572329} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1787321221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787321219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Load initial scene +--- !u!222 &1787321222 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787321219} + m_CullTransparentMesh: 0 diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta new file mode 100644 index 0000000..9f5baba --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30c67a1856c767e4ba1c273f5c55bfbb +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity deleted file mode 100644 index d7548dd..0000000 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/SampleScene.unity +++ /dev/null @@ -1,259 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 705507994} - m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &705507993 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 705507995} - - component: {fileID: 705507994} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &705507994 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 705507993} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 1 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &705507995 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 705507993} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &963194225 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 963194228} - - component: {fileID: 963194227} - - component: {fileID: 963194226} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &963194226 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 963194225} - m_Enabled: 1 ---- !u!20 &963194227 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 963194225} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_GateFitMode: 2 - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &963194228 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 963194225} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs index be50723..e4ee01d 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs @@ -53,11 +53,5 @@ public static partial class {1} return fileContent; } - - public static string CreateResourcePath(string filePath, ResourceContext context) => - filePath - .Replace(context.AssetsFolder, string.Empty) - .Replace('\\', '/') - .Remove(0, 1); } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs index 2e6f903..14b9685 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs @@ -22,11 +22,25 @@ public static partial class Scenes var values = Directory .EnumerateFiles(context.AssetsFolder, "*.unity", SearchOption.AllDirectories) - .Select(p => - ( - name: Path.GetFileNameWithoutExtension(p) + "Scene", - path: ResourceFileGenerator.CreateResourcePath(p, context) - )) + .Select(filePath => + { + var resourcePath = filePath + .Replace(context.AssetsFolder, string.Empty) + .Replace('\\', '/') + .Remove(0, 1); + + var scenePath = Path.Combine + ( + Path.GetDirectoryName(resourcePath) ?? string.Empty, + Path.GetFileNameWithoutExtension(resourcePath) + ) + .Replace('\\', '/'); + return + ( + name: Path.GetFileNameWithoutExtension(filePath) + "Scene", + path: scenePath + ); + }) .ToArray(); var duplicates = values.Duplicates(v => v.name).ToArray(); diff --git a/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset index 0147887..a87b8b2 100644 --- a/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset +++ b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset @@ -4,5 +4,11 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 - m_Scenes: [] + m_Scenes: + - enabled: 1 + path: Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity + guid: 9fc0d4010bbf28b4594072e72b8655ab + - enabled: 1 + path: Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity + guid: 30c67a1856c767e4ba1c273f5c55bfbb m_configObjects: {} From 10fb15b352dfee7d4d61bad55d6777589b221767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 14:11:01 +0200 Subject: [PATCH 12/30] move processors to new namespaces --- .../UnityResourceGenerator/Editor/Generation/Modules.meta | 3 +++ .../Editor/Generation/{ScenesModule.cs => Modules/Scenes.cs} | 4 ++-- .../{ScenesModule.cs.meta => Modules/Scenes.cs.meta} | 0 .../Editor/Generation/PostProcessors.meta | 3 +++ .../{ => PostProcessors}/RemoveUnnecessaryNewLines.cs | 2 +- .../{ => PostProcessors}/RemoveUnnecessaryNewLines.cs.meta | 0 6 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta rename UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/{ScenesModule.cs => Modules/Scenes.cs} (95%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/{ScenesModule.cs.meta => Modules/Scenes.cs.meta} (100%) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta rename UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/{ => PostProcessors}/RemoveUnnecessaryNewLines.cs (89%) rename UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/{ => PostProcessors}/RemoveUnnecessaryNewLines.cs.meta (100%) diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta new file mode 100644 index 0000000..f2dc035 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5cfc0a6e22ac4ddcbe66d05ca408d37d +timeCreated: 1634040487 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs similarity index 95% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs index 14b9685..9532793 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs @@ -3,9 +3,9 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator.Editor.Generation +namespace UnityResourceGenerator.Editor.Generation.Modules { - public sealed class ScenesModule : IModuleGenerator + public sealed class Scenes : IModuleGenerator { public string Generate(ResourceContext context) { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ScenesModule.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta new file mode 100644 index 0000000..2355e51 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a7ea556cd92345cebf582fc729ebb526 +timeCreated: 1634040501 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs similarity index 89% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs index a0093d5..139f1cb 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace UnityResourceGenerator.Editor.Generation +namespace UnityResourceGenerator.Editor.Generation.PostProcessors { public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/RemoveUnnecessaryNewLines.cs.meta rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta From a2af94d927609255eff0ee5449b7f24ff7f82395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 16:12:27 +0200 Subject: [PATCH 13/30] add prefabs with tests --- .../CubeDestroyer.cs | 26 ++ .../CubeDestroyer.cs.meta | 3 + .../LoadSceneInitial.cs | 2 +- .../LoadSceneNext.cs | 2 +- .../ResourcePaths.cs | 9 +- .../Resources.meta | 8 + .../Resources/Cube.prefab | 125 +++++++ .../Resources/Cube.prefab.meta | 7 + .../Scenes/CreatePrefab.unity | 342 ++++++++++++++++++ .../Scenes/CreatePrefab.unity.meta | 7 + .../SpawnCubes.cs | 23 ++ .../SpawnCubes.cs.meta | 11 + .../Assets/UnityResourceGenerator.Tests.meta | 8 + .../ResourcePathTests.cs | 24 ++ .../ResourcePathTests.cs.meta | 11 + .../UnityResourceGenerator.Tests.asmdef | 21 ++ .../UnityResourceGenerator.Tests.asmdef.meta | 7 + .../Editor/Generation/Modules/Prefabs.cs | 94 +++++ .../Editor/Generation/Modules/Prefabs.cs.meta | 3 + .../Editor/Generation/Modules/Scenes.cs | 6 +- .../Editor/ResourceFileMenu.cs | 2 +- 21 files changed, 733 insertions(+), 8 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs new file mode 100644 index 0000000..8a1a527 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs @@ -0,0 +1,26 @@ +using System.Collections; +using UnityEngine; + +namespace UnityResourceGenerator.Sample +{ + [RequireComponent(typeof(Rigidbody))] + public sealed class CubeDestroyer : MonoBehaviour + { + private Rigidbody _rigidbody; + + private void Start() + { + _rigidbody = GetComponent(); + StartCoroutine(DestroyAfterTime()); + } + + private void FixedUpdate() => _rigidbody.AddForce(Physics.gravity); + + private IEnumerator DestroyAfterTime() + { + yield return new WaitForSeconds(5.0f); + + Destroy(gameObject); + } + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta new file mode 100644 index 0000000..e5328de --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6c1d4779c86b4659b9322829b3bc0db6 +timeCreated: 1634042343 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs index eb53c57..d365aa2 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs @@ -13,7 +13,7 @@ private void Start() { if (_loadButton == null) throw new InvalidOperationException($"Button is not set on {gameObject.name}"); - _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneInitialScene)); + _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneInitial)); } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs index c378cdf..a6dc8a1 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs @@ -13,7 +13,7 @@ private void Start() { if (_loadButton == null) throw new InvalidOperationException($"Button is not set on {gameObject.name}"); - _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneNextScene)); + _loadButton.onClick.AddListener(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneNext)); } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs index 5fe1cf7..edc005e 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs @@ -3,10 +3,15 @@ namespace UnityResourceGenerator.Sample // ReSharper disable PartialTypeWithSinglePart public static partial class ResourcePaths { + public static partial class Prefabs + { + public const string Cube = "Cube"; + } public static partial class Scenes { - public const string LoadSceneInitialScene = "UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; - public const string LoadSceneNextScene = "UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; + public const string CreatePrefab = "UnityResourceGenerator.Sample/Scenes/CreatePrefab"; + public const string LoadSceneInitial = "UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; + public const string LoadSceneNext = "UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta new file mode 100644 index 0000000..211075b --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9cee918473f212c47b24b2c408d9b47a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab new file mode 100644 index 0000000..1b67c23 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab @@ -0,0 +1,125 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8692236094422390801 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8692236094422390813} + - component: {fileID: 8692236094422390802} + - component: {fileID: 8692236094422390803} + - component: {fileID: 8692236094422390800} + - component: {fileID: 4172014839632829368} + - component: {fileID: 3153557901911788427} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8692236094422390813 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8692236094422390802 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8692236094422390803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &8692236094422390800 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &4172014839632829368 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &3153557901911788427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8692236094422390801} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c1d4779c86b4659b9322829b3bc0db6, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta new file mode 100644 index 0000000..9410b49 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 25e3cf472d03efa4ab25e5e2d8cb2200 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity new file mode 100644 index 0000000..d336481 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity @@ -0,0 +1,342 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &966150258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 966150260} + - component: {fileID: 966150259} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &966150259 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966150258} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &966150260 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966150258} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1297864555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1297864558} + - component: {fileID: 1297864557} + - component: {fileID: 1297864556} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1297864556 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297864555} + m_Enabled: 1 +--- !u!20 &1297864557 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297864555} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1297864558 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297864555} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1334817254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1334817256} + - component: {fileID: 1334817255} + m_Layer: 0 + m_Name: SpawnTarget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1334817255 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1334817254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 715c9edc133d91745ac7010b2c4b1012, type: 3} + m_Name: + m_EditorClassIdentifier: + _target: {fileID: 1334817256} +--- !u!4 &1334817256 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1334817254} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3.76, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta new file mode 100644 index 0000000..e7f162b --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b8a0a59b303b36644bdbb1b80a2b7273 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs new file mode 100644 index 0000000..924b469 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs @@ -0,0 +1,23 @@ +using System.Collections; +using UnityEngine; + +namespace UnityResourceGenerator.Sample +{ + public sealed class SpawnCubes : MonoBehaviour + { + [SerializeField] private Transform _target = default; + + private void Start() => StartCoroutine(SpawnCubesContinuously()); + + private IEnumerator SpawnCubesContinuously() + { + var prefab = Resources.Load(ResourcePaths.Prefabs.Cube); + + while (gameObject) + { + Instantiate(prefab, _target.position, Quaternion.identity); + yield return new WaitForSeconds(1f); + } + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta new file mode 100644 index 0000000..c7a2f31 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 715c9edc133d91745ac7010b2c4b1012 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta new file mode 100644 index 0000000..c3824a6 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61028e2f15ec6e243a800a3e3021d24d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs new file mode 100644 index 0000000..78f1c75 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs @@ -0,0 +1,24 @@ +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityResourceGenerator.Sample; + +namespace UnityResourceGenerator.Tests +{ + public class ResourcePathTests + { + [Test] + public void ScenesWork() + { + Assert.DoesNotThrow(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneInitial)); + Assert.DoesNotThrow(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneNext)); + } + + [Test] + public void PrefabsWork() + { + var prefab = Resources.Load(ResourcePaths.Prefabs.Cube); + Assert.NotNull(prefab); + } + } +} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta new file mode 100644 index 0000000..80f3113 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 072fba391ad340d4b9c7efd3b29abc8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef new file mode 100644 index 0000000..0199843 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef @@ -0,0 +1,21 @@ +{ + "name": "UnityResourceGenerator.Tests", + "references": [ + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "UnityResourceGenerator.Sample" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta new file mode 100644 index 0000000..8576eef --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fb1dff0c2a667a64ea8493bcf66deed3 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs new file mode 100644 index 0000000..dba5fbf --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace UnityResourceGenerator.Editor.Generation.Modules +{ + public sealed class Prefabs : IModuleGenerator + { + public string Generate(ResourceContext context) + { + context.Info("Started generating prefabs"); + + // ReSharper disable once MissingIndent + const string classBegin = +@" + public static partial class Prefabs + { +"; + // ReSharper disable once MissingIndent + const string classEnd = " }"; + + var values = Directory + .EnumerateFiles(context.AssetsFolder, "*.prefab", SearchOption.AllDirectories) + .Select(filePath => + { + var parents = GetAllParentDirectories(filePath); + var resourcesFolder = parents.LastOrDefault(p => p.Name == "Resources"); + if (resourcesFolder is null) return (null, null); + + var baseFolder = resourcesFolder.FullName; + + var resourcePath = filePath + .Replace(baseFolder, string.Empty) + .Replace('\\', '/') + .Remove(0, 1); + + resourcePath = Path.Combine + ( + Path.GetDirectoryName(resourcePath) ?? string.Empty, + Path.GetFileNameWithoutExtension(resourcePath) + ) + .Replace('\\', '/'); + return + ( + name: Path.GetFileNameWithoutExtension(filePath), + path: resourcePath + ); + }) + .Where(p => p.name != null) + .ToArray(); + + var duplicates = values.Duplicates(v => v.name).ToArray(); + + if (duplicates.Length > 0) + { + context.Error(duplicates.Aggregate(new StringBuilder(), (sb, v) => sb.Append(v.name).Append(' ').AppendLine(v.path)).ToString()); + throw new InvalidOperationException("Found duplicate file names"); + } + + var output = values + .Aggregate( + new StringBuilder().Append(classBegin), + (sb, s) => sb + .Append(" public const string ") + .Append(s.name) + .Append(" = \"") + .Append(s.path) + .AppendLine("\";")) + .AppendLine(classEnd) + .ToString(); + + context.Info("Finished generating prefabs"); + + return output; + } + + private static List GetAllParentDirectories(string directoryToScan) + { + var ret = new Stack(); + GetAllParentDirectories(new DirectoryInfo(directoryToScan), ref ret); + return ret.ToList(); + } + + private static void GetAllParentDirectories(DirectoryInfo directoryToScan, ref Stack directories) + { + if (directoryToScan == null || directoryToScan.Name == directoryToScan.Root.Name) return; + + directories.Push(directoryToScan); + GetAllParentDirectories(directoryToScan.Parent, ref directories); + } + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta new file mode 100644 index 0000000..e61444c --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f26961360ea24b30b3bfcd984f421c1a +timeCreated: 1634041356 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs index 9532793..8c64c5e 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs @@ -29,7 +29,7 @@ public static partial class Scenes .Replace('\\', '/') .Remove(0, 1); - var scenePath = Path.Combine + resourcePath = Path.Combine ( Path.GetDirectoryName(resourcePath) ?? string.Empty, Path.GetFileNameWithoutExtension(resourcePath) @@ -37,8 +37,8 @@ public static partial class Scenes .Replace('\\', '/'); return ( - name: Path.GetFileNameWithoutExtension(filePath) + "Scene", - path: scenePath + name: Path.GetFileNameWithoutExtension(filePath), + path: resourcePath ); }) .ToArray(); diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs index 5f6cff5..9ad90fc 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -13,7 +13,7 @@ public static void GenerateResources() { var settings = ResourceGeneratorSettings.GetOrCreateSettings(); - var assetsFolder = Application.dataPath; + var assetsFolder = Path.GetFullPath(Application.dataPath); var context = new ResourceContext ( From b49cfc299e989a4f5230df380af66f7af97474b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 16:45:54 +0200 Subject: [PATCH 14/30] add unity version --- .../Assets/UnityResourceGenerator/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json index f461231..479024e 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json @@ -1,10 +1,11 @@ { "name": "com.autsoft.unityresourcegenerator", + "version": "0.1.0", "displayName": "Unity Resource Generator", "description": "Generate path strings for Resources.Load", "license": "MIT", "changelogUrl": "https://github.com/AutSoft/UnityResourceGenerator/blob/main/CHANGELOG.md", - "version": "0.1.0", + "unity": "2019.4", "keywords": [ "Editor", "Resources" From fe888de446a82f941570ba5aa9e984d79b4a90ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Tue, 12 Oct 2021 16:53:23 +0200 Subject: [PATCH 15/30] Add generic class, test materials --- .../ResourcePaths.cs | 13 +++- .../Resources/Cube.mat | 77 +++++++++++++++++++ .../Resources/Cube.mat.meta | 8 ++ .../Resources/CubeAlt.mat | 77 +++++++++++++++++++ .../Resources/CubeAlt.mat.meta | 8 ++ .../ResourcePathTests.cs | 10 +++ .../Modules/{Prefabs.cs => AllResources.cs} | 46 +++++++---- .../Generation/Modules/AllResources.cs.meta | 3 + .../Editor/Generation/Modules/Prefabs.cs.meta | 3 - .../Editor/Generation/Modules/Scenes.cs | 71 ----------------- .../Editor/Generation/Modules/Scenes.cs.meta | 11 --- 11 files changed, 223 insertions(+), 104 deletions(-) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta rename UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/{Prefabs.cs => AllResources.cs} (62%) create mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta delete mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta delete mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs delete mode 100644 UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs index edc005e..ffc457b 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs @@ -3,15 +3,20 @@ namespace UnityResourceGenerator.Sample // ReSharper disable PartialTypeWithSinglePart public static partial class ResourcePaths { - public static partial class Prefabs - { - public const string Cube = "Cube"; - } public static partial class Scenes { public const string CreatePrefab = "UnityResourceGenerator.Sample/Scenes/CreatePrefab"; public const string LoadSceneInitial = "UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; public const string LoadSceneNext = "UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; } + public static partial class Prefabs + { + public const string Cube = "Cube"; + } + public static partial class Materials + { + public const string Cube = "Cube"; + public const string CubeAlt = "CubeAlt"; + } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat new file mode 100644 index 0000000..e179615 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Cube + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta new file mode 100644 index 0000000..ca4b154 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e80a731c45076949ba88b2e010b81e8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat new file mode 100644 index 0000000..dfa3582 --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: CubeAlt + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta new file mode 100644 index 0000000..77f1ccd --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62d1f1777d999424bb0bf82ecd8d02c7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs index 78f1c75..5bc608d 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs @@ -20,5 +20,15 @@ public void PrefabsWork() var prefab = Resources.Load(ResourcePaths.Prefabs.Cube); Assert.NotNull(prefab); } + + [Test] + public void MaterialsWork() + { + var cubeMaterial = Resources.Load(ResourcePaths.Materials.Cube); + Assert.NotNull(cubeMaterial); + + var cubeAltMaterial = Resources.Load(ResourcePaths.Materials.CubeAlt); + Assert.NotNull(cubeAltMaterial); + } } } diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs similarity index 62% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs rename to UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index dba5fbf..178c1e0 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -6,30 +6,34 @@ namespace UnityResourceGenerator.Editor.Generation.Modules { - public sealed class Prefabs : IModuleGenerator + public sealed class AllResources : IModuleGenerator { - public string Generate(ResourceContext context) + public string Generate(ResourceContext context) => + new StringBuilder() + .AppendLine(Generate(context, "Scenes", "*.unity", false)) + .AppendLine(Generate(context, "Prefabs", "*.prefab", true)) + .AppendLine(Generate(context, "Materials", "*.mat", true)) + .ToString(); + + private string Generate(ResourceContext context, string className, string fileExtension, bool isResource) { - context.Info("Started generating prefabs"); + context.Info($"Started generating {className}"); // ReSharper disable once MissingIndent - const string classBegin = -@" - public static partial class Prefabs - { + var classBegin = +$@" + public static partial class {className} + {{ "; // ReSharper disable once MissingIndent const string classEnd = " }"; var values = Directory - .EnumerateFiles(context.AssetsFolder, "*.prefab", SearchOption.AllDirectories) + .EnumerateFiles(context.AssetsFolder, fileExtension, SearchOption.AllDirectories) .Select(filePath => { - var parents = GetAllParentDirectories(filePath); - var resourcesFolder = parents.LastOrDefault(p => p.Name == "Resources"); - if (resourcesFolder is null) return (null, null); - - var baseFolder = resourcesFolder.FullName; + var (canLoad, baseFolder) = GetBaseFolder(filePath, isResource, context); + if (!canLoad) return (null, null); var resourcePath = filePath .Replace(baseFolder, string.Empty) @@ -71,12 +75,24 @@ public static partial class Prefabs .AppendLine(classEnd) .ToString(); - context.Info("Finished generating prefabs"); + context.Info($"Finished generating {className}"); return output; } - private static List GetAllParentDirectories(string directoryToScan) + private static (bool canLoad, string baseFolder) GetBaseFolder(string filePath, bool isResource, ResourceContext context) + { + if (!isResource) return (true, context.AssetsFolder); + + var parents = GetAllParentDirectories(filePath); + var resourcesFolder = parents.LastOrDefault(p => p.Name == "Resources"); + + return resourcesFolder is null + ? (false, null) + : (true, resourcesFolder.FullName); + } + + private static IEnumerable GetAllParentDirectories(string directoryToScan) { var ret = new Stack(); GetAllParentDirectories(new DirectoryInfo(directoryToScan), ref ret); diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta new file mode 100644 index 0000000..979d87d --- /dev/null +++ b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a9835aac2f84ebe89f3c8707d3c22e1 +timeCreated: 1634049876 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta deleted file mode 100644 index e61444c..0000000 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Prefabs.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f26961360ea24b30b3bfcd984f421c1a -timeCreated: 1634041356 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs deleted file mode 100644 index 8c64c5e..0000000 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; - -namespace UnityResourceGenerator.Editor.Generation.Modules -{ - public sealed class Scenes : IModuleGenerator - { - public string Generate(ResourceContext context) - { - context.Info("Started generating scenes"); - - // ReSharper disable once MissingIndent - const string classBegin = -@" - public static partial class Scenes - { -"; - // ReSharper disable once MissingIndent - const string classEnd = " }"; - - var values = Directory - .EnumerateFiles(context.AssetsFolder, "*.unity", SearchOption.AllDirectories) - .Select(filePath => - { - var resourcePath = filePath - .Replace(context.AssetsFolder, string.Empty) - .Replace('\\', '/') - .Remove(0, 1); - - resourcePath = Path.Combine - ( - Path.GetDirectoryName(resourcePath) ?? string.Empty, - Path.GetFileNameWithoutExtension(resourcePath) - ) - .Replace('\\', '/'); - return - ( - name: Path.GetFileNameWithoutExtension(filePath), - path: resourcePath - ); - }) - .ToArray(); - - var duplicates = values.Duplicates(v => v.name).ToArray(); - - if (duplicates.Length > 0) - { - context.Error(duplicates.Aggregate(new StringBuilder(), (sb, v) => sb.Append(v.name).Append(' ').AppendLine(v.path)).ToString()); - throw new InvalidOperationException("Found duplicate file names"); - } - - var output = values - .Aggregate( - new StringBuilder().Append(classBegin), - (sb, s) => sb - .Append(" public const string ") - .Append(s.name) - .Append(" = \"") - .Append(s.path) - .AppendLine("\";")) - .AppendLine(classEnd) - .ToString(); - - context.Info("Finished generating scenes"); - - return output; - } - } -} diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta b/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta deleted file mode 100644 index a400996..0000000 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/Scenes.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bbf7b8f9623bf204a9f17d1e5642b9ff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 350e8a81dbb70f10842be4b934105ae024156f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 09:26:55 +0200 Subject: [PATCH 16/30] move everything under AutSoft namespace --- ...le.meta => AutSoft.UnityResourceGenerator.Sample.meta} | 0 .../AutSoft.UnityResourceGenerator.Sample.asmdef} | 2 +- .../AutSoft.UnityResourceGenerator.Sample.asmdef.meta} | 0 .../CubeDestroyer.cs | 2 +- .../CubeDestroyer.cs.meta | 0 .../LoadSceneInitial.cs | 2 +- .../LoadSceneInitial.cs.meta | 0 .../LoadSceneNext.cs | 2 +- .../LoadSceneNext.cs.meta | 0 .../ResourcePaths.cs | 8 ++++---- .../ResourcePaths.cs.meta | 0 .../Resources.meta | 0 .../Resources/Cube.mat | 0 .../Resources/Cube.mat.meta | 0 .../Resources/Cube.prefab | 0 .../Resources/Cube.prefab.meta | 0 .../Resources/CubeAlt.mat | 0 .../Resources/CubeAlt.mat.meta | 0 .../Scenes.meta | 0 .../Scenes/CreatePrefab.unity | 0 .../Scenes/CreatePrefab.unity.meta | 0 .../Scenes/LoadSceneInitial.unity | 0 .../Scenes/LoadSceneInitial.unity.meta | 0 .../Scenes/LoadSceneNext.unity | 0 .../Scenes/LoadSceneNext.unity.meta | 0 .../SpawnCubes.cs | 2 +- .../SpawnCubes.cs.meta | 0 ...sts.meta => AutSoft.UnityResourceGenerator.Tests.meta} | 0 .../AutSoft.UnityResourceGenerator.Tests.asmdef} | 4 ++-- .../AutSoft.UnityResourceGenerator.Tests.asmdef.meta} | 0 .../ResourcePathTests.cs | 6 +++--- .../ResourcePathTests.cs.meta | 0 ...Generator.meta => AutSoft.UnityResourceGenerator.meta} | 0 .../Editor.meta | 0 .../Editor/AutSoft.UnityResourceGenerator.Editor.asmdef} | 2 +- .../AutSoft.UnityResourceGenerator.Editor.asmdef.meta} | 0 .../Editor/Generation.meta | 0 .../Editor/Generation/EnumerableExtensions.cs | 2 +- .../Editor/Generation/EnumerableExtensions.cs.meta | 0 .../Editor/Generation/IModuleGenerator.cs | 2 +- .../Editor/Generation/IModuleGenerator.cs.meta | 0 .../Editor/Generation/IResourcePostProcessor.cs | 2 +- .../Editor/Generation/IResourcePostProcessor.cs.meta | 0 .../Editor/Generation/Modules.meta | 0 .../Editor/Generation/Modules/AllResources.cs | 4 ++-- .../Editor/Generation/Modules/AllResources.cs.meta | 0 .../Editor/Generation/PostProcessors.meta | 0 .../PostProcessors/RemoveUnnecessaryNewLines.cs | 2 +- .../PostProcessors/RemoveUnnecessaryNewLines.cs.meta | 0 .../Editor/Generation/ResourceContext.cs | 2 +- .../Editor/Generation/ResourceContext.cs.meta | 0 .../Editor/Generation/ResourceFileGenerator.cs | 2 +- .../Editor/Generation/ResourceFileGenerator.cs.meta | 0 .../Editor/ResourceFileMenu.cs | 6 +++--- .../Editor/ResourceFileMenu.cs.meta | 0 .../Editor/ResourceGeneratorSettings.cs | 2 +- .../Editor/ResourceGeneratorSettings.cs.meta | 0 .../package.json | 0 .../package.json.meta | 0 UnityResourceGenerator/Assets/ResourceGenerator.asset | 4 ++-- .../ProjectSettings/EditorBuildSettings.asset | 4 ++-- 61 files changed, 31 insertions(+), 31 deletions(-) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample.meta => AutSoft.UnityResourceGenerator.Sample.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef => AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef} (84%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta => AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/CubeDestroyer.cs (92%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/CubeDestroyer.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/LoadSceneInitial.cs (91%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/LoadSceneInitial.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/LoadSceneNext.cs (91%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/LoadSceneNext.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/ResourcePaths.cs (54%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/ResourcePaths.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/Cube.mat (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/Cube.mat.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/Cube.prefab (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/Cube.prefab.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/CubeAlt.mat (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Resources/CubeAlt.mat.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/CreatePrefab.unity (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/CreatePrefab.unity.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/LoadSceneInitial.unity (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/LoadSceneInitial.unity.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/LoadSceneNext.unity (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/Scenes/LoadSceneNext.unity.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/SpawnCubes.cs (92%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Sample => AutSoft.UnityResourceGenerator.Sample}/SpawnCubes.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Tests.meta => AutSoft.UnityResourceGenerator.Tests.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef => AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef} (81%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta => AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Tests => AutSoft.UnityResourceGenerator.Tests}/ResourcePathTests.cs (88%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.Tests => AutSoft.UnityResourceGenerator.Tests}/ResourcePathTests.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator.meta => AutSoft.UnityResourceGenerator.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef => AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef} (87%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef.meta => AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef.meta} (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/EnumerableExtensions.cs (94%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/EnumerableExtensions.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/IModuleGenerator.cs (62%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/IModuleGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/IResourcePostProcessor.cs (74%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/IResourcePostProcessor.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/Modules.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/Modules/AllResources.cs (95%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/Modules/AllResources.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/PostProcessors.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs (88%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/ResourceContext.cs (93%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/ResourceContext.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/ResourceFileGenerator.cs (96%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/Generation/ResourceFileGenerator.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/ResourceFileMenu.cs (92%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/ResourceFileMenu.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/ResourceGeneratorSettings.cs (98%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/Editor/ResourceGeneratorSettings.cs.meta (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/package.json (100%) rename UnityResourceGenerator/Assets/{UnityResourceGenerator => AutSoft.UnityResourceGenerator}/package.json.meta (100%) diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef similarity index 84% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef index 0c566cf..081fbec 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef @@ -1,5 +1,5 @@ { - "name": "UnityResourceGenerator.Sample", + "name": "AutSoft.UnityResourceGenerator.Sample", "references": [], "includePlatforms": [], "excludePlatforms": [], diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/UnityResourceGenerator.Sample.asmdef.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CubeDestroyer.cs similarity index 92% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CubeDestroyer.cs index 8a1a527..ccf21b5 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CubeDestroyer.cs @@ -1,7 +1,7 @@ using System.Collections; using UnityEngine; -namespace UnityResourceGenerator.Sample +namespace AutSoft.UnityResourceGenerator.Sample { [RequireComponent(typeof(Rigidbody))] public sealed class CubeDestroyer : MonoBehaviour diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CubeDestroyer.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/CubeDestroyer.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CubeDestroyer.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneInitial.cs similarity index 91% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneInitial.cs index d365aa2..7a470b9 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneInitial.cs @@ -3,7 +3,7 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; -namespace UnityResourceGenerator.Sample +namespace AutSoft.UnityResourceGenerator.Sample { public sealed class LoadSceneInitial : MonoBehaviour { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneInitial.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneNext.cs similarity index 91% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneNext.cs index a6dc8a1..d5c1075 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneNext.cs @@ -3,7 +3,7 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; -namespace UnityResourceGenerator.Sample +namespace AutSoft.UnityResourceGenerator.Sample { public sealed class LoadSceneNext : MonoBehaviour { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneNext.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/LoadSceneNext.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/LoadSceneNext.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs similarity index 54% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs index ffc457b..c73e5b0 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs @@ -1,13 +1,13 @@ -namespace UnityResourceGenerator.Sample +namespace AutSoft.UnityResourceGenerator.Sample { // ReSharper disable PartialTypeWithSinglePart public static partial class ResourcePaths { public static partial class Scenes { - public const string CreatePrefab = "UnityResourceGenerator.Sample/Scenes/CreatePrefab"; - public const string LoadSceneInitial = "UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; - public const string LoadSceneNext = "UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; + public const string CreatePrefab = "AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab"; + public const string LoadSceneInitial = "AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; + public const string LoadSceneNext = "AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; } public static partial class Prefabs { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/ResourcePaths.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.mat similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.mat diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.mat.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.mat.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.mat.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.prefab similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.prefab diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.prefab.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/Cube.prefab.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Cube.prefab.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CubeAlt.mat similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CubeAlt.mat diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CubeAlt.mat.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab.unity.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/SpawnCubes.cs similarity index 92% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/SpawnCubes.cs index 924b469..997fc42 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/SpawnCubes.cs @@ -1,7 +1,7 @@ using System.Collections; using UnityEngine; -namespace UnityResourceGenerator.Sample +namespace AutSoft.UnityResourceGenerator.Sample { public sealed class SpawnCubes : MonoBehaviour { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/SpawnCubes.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Sample/SpawnCubes.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/SpawnCubes.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Tests.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef similarity index 81% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef index 0199843..d9b8f25 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef @@ -1,9 +1,9 @@ { - "name": "UnityResourceGenerator.Tests", + "name": "AutSoft.UnityResourceGenerator.Tests", "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "UnityResourceGenerator.Sample" + "AutSoft.UnityResourceGenerator.Sample" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/UnityResourceGenerator.Tests.asmdef.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/AutSoft.UnityResourceGenerator.Tests.asmdef.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs similarity index 88% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs index 5bc608d..f9509ae 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs @@ -1,9 +1,9 @@ -using NUnit.Framework; +using AutSoft.UnityResourceGenerator.Sample; +using NUnit.Framework; using UnityEngine; using UnityEngine.SceneManagement; -using UnityResourceGenerator.Sample; -namespace UnityResourceGenerator.Tests +namespace AutSoft.UnityResourceGenerator.Tests { public class ResourcePathTests { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.Tests/ResourcePathTests.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef similarity index 87% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef index 7dd4a91..1457728 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef @@ -1,5 +1,5 @@ { - "name": "UnityResourceGenerator", + "name": "AutSoft.UnityResourceGenerator", "references": [], "includePlatforms": [ "Editor" diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/UnityResourceGenerator.Editor.asmdef.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/AutSoft.UnityResourceGenerator.Editor.asmdef.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs similarity index 94% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs index e30556f..5585759 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; -namespace UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation { internal static class EnumerableExtensions { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs similarity index 62% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs index 1e8d552..d48aa9c 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation { public interface IModuleGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IModuleGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs similarity index 74% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs index 36814bc..b09e7f7 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs @@ -1,4 +1,4 @@ -namespace UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation { public interface IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourcePostProcessor.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs similarity index 95% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index 178c1e0..6b1ee4c 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator.Editor.Generation.Modules +namespace AutSoft.UnityResourceGenerator.Editor.Generation.Modules { public sealed class AllResources : IModuleGenerator { @@ -15,7 +15,7 @@ public string Generate(ResourceContext context) => .AppendLine(Generate(context, "Materials", "*.mat", true)) .ToString(); - private string Generate(ResourceContext context, string className, string fileExtension, bool isResource) + private static string Generate(ResourceContext context, string className, string fileExtension, bool isResource) { context.Info($"Started generating {className}"); diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs similarity index 88% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs index 139f1cb..c33a99d 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace UnityResourceGenerator.Editor.Generation.PostProcessors +namespace AutSoft.UnityResourceGenerator.Editor.Generation.PostProcessors { public sealed class RemoveUnnecessaryNewLines : IResourcePostProcessor { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/PostProcessors/RemoveUnnecessaryNewLines.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs similarity index 93% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs index f3a0d01..67ffaa8 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs @@ -1,6 +1,6 @@ using System; -namespace UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation { public sealed class ResourceContext { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs similarity index 96% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs index e4ee01d..ee5f414 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Text; -namespace UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation { public static class ResourceFileGenerator { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs similarity index 92% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs index 9ad90fc..3bd7b8e 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -1,10 +1,10 @@ -using System; +using AutSoft.UnityResourceGenerator.Editor.Generation; +using System; using System.IO; using UnityEditor; using UnityEngine; -using UnityResourceGenerator.Editor.Generation; -namespace UnityResourceGenerator.Editor +namespace AutSoft.UnityResourceGenerator.Editor { public static class ResourceFileMenu { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs similarity index 98% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 0d4ba91..1ec27fc 100644 --- a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -2,7 +2,7 @@ using UnityEditor; using UnityEngine; -namespace UnityResourceGenerator.Editor +namespace AutSoft.UnityResourceGenerator.Editor { public sealed class ResourceGeneratorSettings : ScriptableObject { diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs.meta diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/package.json similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/package.json rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/package.json diff --git a/UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/package.json.meta similarity index 100% rename from UnityResourceGenerator/Assets/UnityResourceGenerator/package.json.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/package.json.meta diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 935f50f..8e287bf 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3cdd186d920f45adb2925f11fda1bdd8, type: 3} m_Name: ResourceGenerator m_EditorClassIdentifier: - _baseNamespace: UnityResourceGenerator.Sample + _baseNamespace: AutSoft.UnityResourceGenerator.Sample _className: ResourcePaths - _folderPath: UnityResourceGenerator.Sample + _folderPath: AutSoft.UnityResourceGenerator.Sample _logInfo: 1 _logError: 1 diff --git a/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset index a87b8b2..3afe373 100644 --- a/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset +++ b/UnityResourceGenerator/ProjectSettings/EditorBuildSettings.asset @@ -6,9 +6,9 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity + path: Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial.unity guid: 9fc0d4010bbf28b4594072e72b8655ab - enabled: 1 - path: Assets/UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity + path: Assets/AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext.unity guid: 30c67a1856c767e4ba1c273f5c55bfbb m_configObjects: {} From f129c2ab0d5f527c4b8e3501e5ff14383a96a793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 10:04:02 +0200 Subject: [PATCH 17/30] configure class generation by data --- .../Editor/Generation/Extensions.meta | 3 ++ .../{ => Extensions}/EnumerableExtensions.cs | 2 +- .../EnumerableExtensions.cs.meta | 0 .../Extensions/StringBuilderExtensions.cs | 18 +++++++++ .../StringBuilderExtensions.cs.meta | 3 ++ .../Editor/Generation/IResourceData.cs | 9 +++++ .../Editor/Generation/IResourceData.cs.meta | 3 ++ .../Editor/Generation/Modules/AllResources.cs | 19 +++++----- .../Editor/Generation/ResourceContext.cs | 7 +++- .../Generation/ResourceFileGenerator.cs | 3 +- .../Editor/ResourceFileMenu.cs | 3 +- .../Editor/ResourceGeneratorSettings.cs | 37 ++++++++++++++++++- .../Assets/ResourceGenerator.asset | 12 +++++- 13 files changed, 103 insertions(+), 16 deletions(-) create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions.meta rename UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/{ => Extensions}/EnumerableExtensions.cs (93%) rename UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/{ => Extensions}/EnumerableExtensions.cs.meta (100%) create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs.meta create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs.meta diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions.meta new file mode 100644 index 0000000..7cf9623 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fef2a0bb333b46dc858cfa43d394688b +timeCreated: 1634110305 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/EnumerableExtensions.cs similarity index 93% rename from UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/EnumerableExtensions.cs index 5585759..4c61e0a 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/EnumerableExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; -namespace AutSoft.UnityResourceGenerator.Editor.Generation +namespace AutSoft.UnityResourceGenerator.Editor.Generation.Extensions { internal static class EnumerableExtensions { diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/EnumerableExtensions.cs.meta similarity index 100% rename from UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/EnumerableExtensions.cs.meta rename to UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/EnumerableExtensions.cs.meta diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs new file mode 100644 index 0000000..a2a3b95 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Text; + +namespace AutSoft.UnityResourceGenerator.Editor.Generation.Extensions +{ + internal static class StringBuilderExtensions + { + public static StringBuilder AppendMultipleLines(this StringBuilder builder, IEnumerable lines) + { + foreach (var line in lines) + { + builder.AppendLine(line); + } + + return builder; + } + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs.meta new file mode 100644 index 0000000..e894c79 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Extensions/StringBuilderExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e94d043b4864c5c87ed60fcc52f4321 +timeCreated: 1634110294 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs new file mode 100644 index 0000000..80d60ce --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs @@ -0,0 +1,9 @@ +namespace AutSoft.UnityResourceGenerator.Editor.Generation +{ + public interface IResourceData + { + string ClassName { get; } + string FileExtension { get; } + bool IsResource { get; } + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs.meta new file mode 100644 index 0000000..4fe906e --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0385fb0fb4874a91ab92fcab1fc59505 +timeCreated: 1634110725 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index 6b1ee4c..5da87e0 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -1,4 +1,5 @@ -using System; +using AutSoft.UnityResourceGenerator.Editor.Generation.Extensions; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -10,29 +11,27 @@ public sealed class AllResources : IModuleGenerator { public string Generate(ResourceContext context) => new StringBuilder() - .AppendLine(Generate(context, "Scenes", "*.unity", false)) - .AppendLine(Generate(context, "Prefabs", "*.prefab", true)) - .AppendLine(Generate(context, "Materials", "*.mat", true)) + .AppendMultipleLines(context.Data.Select(d => Generate(context, d))) .ToString(); - private static string Generate(ResourceContext context, string className, string fileExtension, bool isResource) + private static string Generate(ResourceContext context, IResourceData data) { - context.Info($"Started generating {className}"); + context.Info($"Started generating {data.ClassName}"); // ReSharper disable once MissingIndent var classBegin = $@" - public static partial class {className} + public static partial class {data.ClassName} {{ "; // ReSharper disable once MissingIndent const string classEnd = " }"; var values = Directory - .EnumerateFiles(context.AssetsFolder, fileExtension, SearchOption.AllDirectories) + .EnumerateFiles(context.AssetsFolder, data.FileExtension, SearchOption.AllDirectories) .Select(filePath => { - var (canLoad, baseFolder) = GetBaseFolder(filePath, isResource, context); + var (canLoad, baseFolder) = GetBaseFolder(filePath, data.IsResource, context); if (!canLoad) return (null, null); var resourcePath = filePath @@ -75,7 +74,7 @@ public static partial class {className} .AppendLine(classEnd) .ToString(); - context.Info($"Finished generating {className}"); + context.Info($"Finished generating {data.ClassName}"); return output; } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs index 67ffaa8..dc9073a 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceContext.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace AutSoft.UnityResourceGenerator.Editor.Generation { @@ -11,7 +12,8 @@ public ResourceContext string baseNamespace, string className, Action info, - Action error) + Action error, + IReadOnlyList data) { AssetsFolder = assetsFolder; FolderPath = folderPath; @@ -19,6 +21,7 @@ public ResourceContext ClassName = className; Info = info; Error = error; + Data = data; } public string AssetsFolder { get; } @@ -27,5 +30,7 @@ public ResourceContext public string ClassName { get; } public Action Info { get; } public Action Error { get; } + + public IReadOnlyList Data { get; } } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs index ee5f414..f85e814 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs @@ -1,4 +1,5 @@ -using System; +using AutSoft.UnityResourceGenerator.Editor.Generation.Extensions; +using System; using System.Linq; using System.Text; diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs index 3bd7b8e..76ae27a 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceFileMenu.cs @@ -22,7 +22,8 @@ public static void GenerateResources() settings.BaseNamespace, settings.ClassName, settings.LogInfo ? Debug.Log : LogEmpty, - settings.LogError ? Debug.LogError : LogEmpty + settings.LogError ? Debug.LogError : LogEmpty, + settings.Data ); context.Info("Resource Path generation started"); diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 1ec27fc..9d8a546 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using AutSoft.UnityResourceGenerator.Editor.Generation; +using System; +using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -6,6 +8,29 @@ namespace AutSoft.UnityResourceGenerator.Editor { public sealed class ResourceGeneratorSettings : ScriptableObject { + [Serializable] + public sealed class ResourceData : IResourceData + { + [SerializeField] private string _className = default; + [SerializeField] private string _fileExtension = default; + [SerializeField] private bool _isResource = default; + + public ResourceData() + { + } + + public ResourceData(string className, string fileExtension, bool isResource) + { + _className = className; + _fileExtension = fileExtension; + _isResource = isResource; + } + + public string ClassName => _className; + public string FileExtension => _fileExtension; + public bool IsResource => _isResource; + } + private const string SettingsPath = "Assets/ResourceGenerator.asset"; [SerializeField] private string _baseNamespace; @@ -17,12 +42,14 @@ public sealed class ResourceGeneratorSettings : ScriptableObject [SerializeField] private bool _logInfo; [SerializeField] private bool _logError; + [SerializeField] private ResourceData[] _data; public string FolderPath => _folderPath; public string BaseNamespace => _baseNamespace; public string ClassName => _className; public bool LogInfo => _logInfo; public bool LogError => _logError; + public ResourceData[] Data => _data; public static ResourceGeneratorSettings GetOrCreateSettings() { @@ -37,6 +64,13 @@ public static ResourceGeneratorSettings GetOrCreateSettings() settings._logInfo = false; settings._logError = true; + settings._data = new[] + { + new ResourceData("Scenes", "*.unity", false), + new ResourceData("Prefabs", "*.prefab", true), + new ResourceData("Materials", "*.mat", true), + }; + AssetDatabase.CreateAsset(settings, SettingsPath); AssetDatabase.SaveAssets(); @@ -57,6 +91,7 @@ public static SettingsProvider CreateSettingsProvider() => EditorGUILayout.PropertyField(settings.FindProperty(nameof(_className)), new GUIContent("Class name")); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logInfo)), new GUIContent("Log Infos")); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logError)), new GUIContent("Log Errors")); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_data)), new GUIContent("Data")); settings.ApplyModifiedProperties(); }, diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 8e287bf..142bf52 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -15,5 +15,15 @@ MonoBehaviour: _baseNamespace: AutSoft.UnityResourceGenerator.Sample _className: ResourcePaths _folderPath: AutSoft.UnityResourceGenerator.Sample - _logInfo: 1 + _logInfo: 0 _logError: 1 + _data: + - _className: Scenes + _fileExtension: '*.unity' + _isResource: 0 + - _className: Prefabs + _fileExtension: '*.prefab' + _isResource: 1 + - _className: Materials + _fileExtension: '*.mat' + _isResource: 1 From 4fcdda4105c32a4eff540fb3a11ab594f0336e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 10:22:20 +0200 Subject: [PATCH 18/30] add custom tool for development --- ...tSoft.UnityResourceGenerator.Sample.asmdef | 4 +++- .../CustomTool.cs | 17 +++++++++++++++++ .../CustomTool.cs.meta | 11 +++++++++++ .../Editor/ResourceGeneratorSettings.cs | 19 +++++++++++++------ .../Assets/ResourceGenerator.asset | 2 +- 5 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef index 081fbec..07ea9e8 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/AutSoft.UnityResourceGenerator.Sample.asmdef @@ -1,6 +1,8 @@ { "name": "AutSoft.UnityResourceGenerator.Sample", - "references": [], + "references": [ + "AutSoft.UnityResourceGenerator" + ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs new file mode 100644 index 0000000..6dc2184 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs @@ -0,0 +1,17 @@ +using AutSoft.UnityResourceGenerator.Editor; +using UnityEditor; + +namespace AutSoft.UnityResourceGenerator.Sample +{ + public static class CustomTool + { + [MenuItem("Custom Tools / Recreate Custom Defaults")] + public static void RecreateCustomDefaults() => + ResourceGeneratorSettings.GetOrCreateSettings + ( + folderPath: "AutSoft.UnityResourceGenerator.Sample", + baseNamespace: "AutSoft.UnityResourceGenerator.Sample", + logInfo: true + ); + } +} diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta new file mode 100644 index 0000000..8088112 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e5e5630ad386b241be1c7fb0eaa5fb2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 9d8a546..73ace3b 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -51,18 +51,25 @@ public ResourceData(string className, string fileExtension, bool isResource) public bool LogError => _logError; public ResourceData[] Data => _data; - public static ResourceGeneratorSettings GetOrCreateSettings() + public static ResourceGeneratorSettings GetOrCreateSettings + ( + string folderPath = null, + string baseNamespace = null, + string className = null, + bool? logInfo = null, + bool? logError = null + ) { var settings = AssetDatabase.LoadAssetAtPath(SettingsPath); if (settings != null) return settings; settings = CreateInstance(); - settings._folderPath = string.Empty; - settings._baseNamespace = "Resources"; - settings._className = "ResourcePaths"; - settings._logInfo = false; - settings._logError = true; + settings._folderPath = folderPath ?? string.Empty; + settings._baseNamespace = baseNamespace ?? "Resources"; + settings._className = className ?? "ResourcePaths"; + settings._logInfo = logInfo ?? false; + settings._logError = logError ?? true; settings._data = new[] { diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 142bf52..42056e2 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -15,7 +15,7 @@ MonoBehaviour: _baseNamespace: AutSoft.UnityResourceGenerator.Sample _className: ResourcePaths _folderPath: AutSoft.UnityResourceGenerator.Sample - _logInfo: 0 + _logInfo: 1 _logError: 1 _data: - _className: Scenes From c73699b3157a083b1e8d74f8428a44d933f58697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 10:34:58 +0200 Subject: [PATCH 19/30] Allow multiple file extensions --- .../Editor/Generation/IResourceData.cs | 6 ++++-- .../Editor/Generation/Modules/AllResources.cs | 5 +++-- .../Editor/ResourceGeneratorSettings.cs | 20 +++++++++---------- .../Assets/ResourceGenerator.asset | 9 ++++++--- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs index 80d60ce..f9156e2 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs @@ -1,9 +1,11 @@ -namespace AutSoft.UnityResourceGenerator.Editor.Generation +using System.Collections.Generic; + +namespace AutSoft.UnityResourceGenerator.Editor.Generation { public interface IResourceData { string ClassName { get; } - string FileExtension { get; } + IReadOnlyList FileExtensions { get; } bool IsResource { get; } } } \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index 5da87e0..85f4741 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -27,8 +27,9 @@ public static partial class {data.ClassName} // ReSharper disable once MissingIndent const string classEnd = " }"; - var values = Directory - .EnumerateFiles(context.AssetsFolder, data.FileExtension, SearchOption.AllDirectories) + var values = data + .FileExtensions + .SelectMany(ext => Directory.EnumerateFiles(context.AssetsFolder, ext, SearchOption.AllDirectories)) .Select(filePath => { var (canLoad, baseFolder) = GetBaseFolder(filePath, data.IsResource, context); diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 73ace3b..01af003 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -12,22 +12,22 @@ public sealed class ResourceGeneratorSettings : ScriptableObject public sealed class ResourceData : IResourceData { [SerializeField] private string _className = default; - [SerializeField] private string _fileExtension = default; + [SerializeField] private string[] _fileExtensions = default; [SerializeField] private bool _isResource = default; public ResourceData() { } - public ResourceData(string className, string fileExtension, bool isResource) + public ResourceData(string className, string[] fileExtensions, bool isResource) { _className = className; - _fileExtension = fileExtension; + _fileExtensions = fileExtensions; _isResource = isResource; } public string ClassName => _className; - public string FileExtension => _fileExtension; + public IReadOnlyList FileExtensions => _fileExtensions; public bool IsResource => _isResource; } @@ -42,14 +42,14 @@ public ResourceData(string className, string fileExtension, bool isResource) [SerializeField] private bool _logInfo; [SerializeField] private bool _logError; - [SerializeField] private ResourceData[] _data; + [SerializeField] private List _data; public string FolderPath => _folderPath; public string BaseNamespace => _baseNamespace; public string ClassName => _className; public bool LogInfo => _logInfo; public bool LogError => _logError; - public ResourceData[] Data => _data; + public IReadOnlyList Data => _data; public static ResourceGeneratorSettings GetOrCreateSettings ( @@ -71,11 +71,11 @@ public static ResourceGeneratorSettings GetOrCreateSettings settings._logInfo = logInfo ?? false; settings._logError = logError ?? true; - settings._data = new[] + settings._data = new List { - new ResourceData("Scenes", "*.unity", false), - new ResourceData("Prefabs", "*.prefab", true), - new ResourceData("Materials", "*.mat", true), + new ResourceData("Scenes", new[]{"*.unity"}, false), + new ResourceData("Prefabs", new[]{"*.prefab"}, true), + new ResourceData("Materials", new[]{"*.mat"}, true), }; AssetDatabase.CreateAsset(settings, SettingsPath); diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 42056e2..b264e3c 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -19,11 +19,14 @@ MonoBehaviour: _logError: 1 _data: - _className: Scenes - _fileExtension: '*.unity' + _fileExtensions: + - '*.unity' _isResource: 0 - _className: Prefabs - _fileExtension: '*.prefab' + _fileExtensions: + - '*.prefab' _isResource: 1 - _className: Materials - _fileExtension: '*.mat' + _fileExtensions: + - '*.mat' _isResource: 1 From 4e0989b81b813f02087468c6378b9ebcf00d5d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 10:49:17 +0200 Subject: [PATCH 20/30] clean up settings --- .../Editor/ResourceGeneratorSettings.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 01af003..1f8153d 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -91,7 +91,7 @@ public static SettingsProvider CreateSettingsProvider() => label = "ResourceGenerator", guiHandler = searchContext => { - var settings = GetSerializedSettings(); + var settings = new SerializedObject(GetOrCreateSettings()); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_folderPath)), new GUIContent("Folder from Assets")); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_baseNamespace)), new GUIContent("Namespace")); @@ -104,7 +104,5 @@ public static SettingsProvider CreateSettingsProvider() => }, keywords = new HashSet(new[] { "Resource", "Path" }), }; - - public static SerializedObject GetSerializedSettings() => new SerializedObject(GetOrCreateSettings()); } } \ No newline at end of file From e6f8e9d78f4f8e046559693ed9b8c8e0e0a5c9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:13:12 +0200 Subject: [PATCH 21/30] add audio sources --- .../ResourcePaths.cs | 5 ++++ .../Resources/Coin.wav | Bin 0 -> 39824 bytes .../Resources/Coin.wav.meta | 22 ++++++++++++++++++ .../Resources/CoinSpin.mp3 | Bin 0 -> 102167 bytes .../Resources/CoinSpin.mp3.meta | 22 ++++++++++++++++++ .../ResourcePathTests.cs | 10 ++++++++ .../Editor/ResourceGeneratorSettings.cs | 1 + .../Assets/ResourceGenerator.asset | 5 ++++ 8 files changed, 65 insertions(+) create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav.meta create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3 create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3.meta diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs index c73e5b0..5fd0cef 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs @@ -18,5 +18,10 @@ public static partial class Materials public const string Cube = "Cube"; public const string CubeAlt = "CubeAlt"; } + public static partial class AudioClips + { + public const string Coin = "Coin"; + public const string CoinSpin = "CoinSpin"; + } } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav new file mode 100644 index 0000000000000000000000000000000000000000..c0dc31c28aad5f1852563d83902838345fab2cd9 GIT binary patch literal 39824 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� zODw`dd?6M@+b7y5I*5*mj)_j_j4tSkZs?942|t`0og-#PXGdpYCT3tdreP|kpuW>5 z(HH&D9|JHDgT&y(;KUFNO{5PdM8{(s#$pUci&4>0(UBN|;rPfKnNUVyG{#^o#$h}r zU?M7cL!yH*2m>(y{m~D7(MR--_Ks!@rX{8®+XVisnLIf*%mxtNFEPPb^cXjgO* zoui$jozM{-&>rp3mM?N)VqsztzQkgDg(X;uWmt|CXc=u8ZGq-!hNfsD8b=#P8=)Z@ zM6c=JBvxY$)?%GlpID#RfQ{IM%@}UiiPpxasD+xSflp8!AB$?y73TKD4(!A(?8YAK z#XjuE0kOiY7_AtsfbybTv|O|-K0+CkMk#c&k0g#Hj^Y@OixY_xiIX^m(>Q~(iHmyC zXwhg96hx_*372sNS8)yB;kvkyxRJQY7nviPU1W=9i++f# z$b!tsgp49Xbd_^2aW8Qn55&X7!^9&z#uGfnGn5F@L>Y(_Wz0pC7;~uTS%L*sY?KNG zQEl8&n)IUmyjO`=2?ih~7;2FqiabHkY=RiU1hG#b)PuM=h8r9sH?^73v}iaj0!Vtt1?{@DhieAQD7;;YGZN3kON4Eg)5>%O^L~k~$2S zuwX;}RBbNF6sXHBS~67go@xk>5FQdCW(outMu@tN5Q-jQxJKlM$X;DFiO^1{TF*hK zi3-0;5|fxDPB%$Rdy*j@$YZ~Zyufoj!&5xLWAP~RDDn^wB0bG?$#lu|$bgK$eYZY%!m9afPyF_3MY5y z=OgDM=WrHha9W&-oQj;p2^`0P$RQlW0qn;< z>=k<=dm_8BEAlU=O0ue`maLZi7}fC!YM`d5m8_MlA8d!Sf0qLFBvY@BR@rf7!d$xYtZkyTiU6sUZ5QCCa zB2yxhF$ojJgvf-*c#OkXj1f!q&yvH$@Z|912#mxij22^(W0GSrF8RP39vOzuFcd>D zSPY5`iVVa6^pBJ_KNh1^b|cJJtE!F4P8Z-NS8=w zbc$TC<|mZ}_yP;D2w#fD$;HX9umlVBwvo1xHfW7jqGhCIqy?IznP?hm8d;fKnOudh z@r_uWT%BBlwOEJsA_yBq8bs=&9_pfws2!;t`4qKK6Ez~0+^tDv8@6Kyc8XoeUCG_p zgT2XKLA6L#R1uXUl_Ql<5fw!FNcl)Pl#M*_4kZsI593>LBzYux6vuEJC&bC*Q?FE{ zBubz-iix6;qLCsfj6$Mdq)%`zc`kV#7jO}m#O37WV-o_nqH+eUC5BKo^55=S8qvYdchDe4;dZZI+BWWXP!0@~XBay(+iwGg* zk#YL-CC@QI?fDpw@qLLDa5HldkDMA4xkv_m@(zU|u{TsZb{%TM~r03kF-b97-i zhGW74e}<8|DtYrX%I2{xRBHw;d^YXgHW4BqZptQ@(0yHU$HOa5-y4h z_67Sq&f%;$W1q24+tY#~PEiy?ag-1xosv!|lon;2GR|iAn5`Ve5qv8S+lTE#IEVvc zzwL$>*bD6W_#E>@UaPCq4c*a0^mKYUz0ezdL|><`)6Z$I&#-6M z)5SD$JbPnM#z7&^|_6t|pP&TZTgcb&V=J={liJ&T>i&MY$7ne2?nAky3E?Q}>h z(%4U&r{bCO%z2I%;-&M_`5v!?8mJnCD#-lrAXX46IEqjZ`%R(R^i&JR8z|%v9q14Y z1r_H(tF|MJc&dRyJ&sjRpKv&c+7V&1EMeNFZ9o^At=XX!S|fai<-&t60w-`nXs)8e zaL4+NI#8&~C!~V1x5X1F@SIk)XMkot>u3;Fr4dz1$7@i}d8PTorB%?S{Ty$)wY*DE%KBb-Aw!|?9^MxpxF5J_kXEE~)4A!9!F^&qu^x*@)+6ho zcwjxS?&F@gYu&Z(SVi@$ZdUh0k` zb<3f=sNhy`D~d{PCATuFh^lT?H^08m+Gp(*d#pXyZn4YSW$nZcvEABkZL?~+N-caU zYP+@FI;bn^x%J%oA_zBH8?6mkFV

thHi|wZ>YFZ^YNuSg)zuOf+|!yDiXCv~pXy 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 HNLc?5T?xoE literal 0 HcmV?d00001 diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav.meta new file mode 100644 index 0000000..b31dafb --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/Coin.wav.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: c2e13e658068f414ba36b4cbdab0bb7d +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3 b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a667c03ee254532568268b4b914e3324abc1bb68 GIT binary patch literal 102167 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%0DOVd4SCg)FSf)P(vC_D-ZA(<AQsGT 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%0A?H}%f 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 M{vSU2|H{YyKMNN>mjD0& literal 0 HcmV?d00001 diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3.meta new file mode 100644 index 0000000..00b6f04 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/Resources/CoinSpin.mp3.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 70ff3e73095c1fa4ba5fc464d4a5581b +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs index f9509ae..036e70c 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs @@ -30,5 +30,15 @@ public void MaterialsWork() var cubeAltMaterial = Resources.Load(ResourcePaths.Materials.CubeAlt); Assert.NotNull(cubeAltMaterial); } + + [Test] + public void AudioClipsWork() + { + var coin = Resources.Load(ResourcePaths.AudioClips.Coin); + Assert.NotNull(coin); + + var coinSpin = Resources.Load(ResourcePaths.AudioClips.CoinSpin); + Assert.NotNull(coinSpin); + } } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 1f8153d..10c72b6 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -76,6 +76,7 @@ public static ResourceGeneratorSettings GetOrCreateSettings new ResourceData("Scenes", new[]{"*.unity"}, false), new ResourceData("Prefabs", new[]{"*.prefab"}, true), new ResourceData("Materials", new[]{"*.mat"}, true), + new ResourceData("AudioClips", new[]{"*.aif", "*.wav", "*.mp3", "*.ogg"}, true) }; AssetDatabase.CreateAsset(settings, SettingsPath); diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index b264e3c..e32976a 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -30,3 +30,8 @@ MonoBehaviour: _fileExtensions: - '*.mat' _isResource: 1 + - _className: AudioClips + _fileExtensions: + - '*.wav' + - '*.mp3' + _isResource: 1 From 8da45300c0ad097aeebe5fe56201458a608cdb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:23:47 +0200 Subject: [PATCH 22/30] add vscode launch.json for debugging --- .vscode/launch.json | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..27d8c11 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,54 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Unity Editor", + "type": "unity", + "path": "UnityResourceGenerator/Library/EditorInstance.json", + "request": "launch" + }, + { + "name": "Windows Player", + "type": "unity", + "request": "launch" + }, + { + "name": "OSX Player", + "type": "unity", + "request": "launch" + }, + { + "name": "Linux Player", + "type": "unity", + "request": "launch" + }, + { + "name": "iOS Player", + "type": "unity", + "request": "launch" + }, + { + "name": "Android Player", + "type": "unity", + "request": "launch" + }, + { + "name": "Xbox One Player", + "type": "unity", + "request": "launch" + }, + { + "name": "PS4 Player", + "type": "unity", + "request": "launch" + }, + { + "name": "SwitchPlayer", + "type": "unity", + "request": "launch" + } + ] +} \ No newline at end of file From a7236e2f1fd4335e3063179c31389b0ac0e7a4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:29:08 +0200 Subject: [PATCH 23/30] add vscode unity analyzer dll --- .gitignore | 4 +++- .../Microsoft.Unity.Analyzers.dll | Bin 0 -> 187256 bytes .vscode/omnisharp.json | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .vscode/VsCodeAnalyzers/Microsoft.Unity.Analyzers.dll create mode 100644 .vscode/omnisharp.json diff --git a/.gitignore b/.gitignore index 4a4851a..923e09f 100644 --- a/.gitignore +++ b/.gitignore @@ -395,4 +395,6 @@ FodyWeavers.xsd ### VisualStudio Patch ### # Additional files built by Visual Studio -# End of https://www.toptal.com/developers/gitignore/api/visualstudio \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/visualstudio + +!.vscode/**/* diff --git a/.vscode/VsCodeAnalyzers/Microsoft.Unity.Analyzers.dll b/.vscode/VsCodeAnalyzers/Microsoft.Unity.Analyzers.dll new file mode 100644 index 0000000000000000000000000000000000000000..f6a78f7254621cccc4f87a3eaa2b8f16aa97c854 GIT binary patch literal 187256 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 _$kSGrKYZWJiR<*cT^Xs4?eFZ8W^yHdXVD|2 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

MTVi@wA8Ql%(`DHCH^pRC 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 VJ@xhMm&Kps>j%W@Z-*e_e*iZ{NP_?X literal 0 HcmV?d00001 diff --git a/.vscode/omnisharp.json b/.vscode/omnisharp.json new file mode 100644 index 0000000..d382432 --- /dev/null +++ b/.vscode/omnisharp.json @@ -0,0 +1,6 @@ +{ + "RoslynExtensionsOptions": { + "EnableAnalyzersSupport": true, + "LocationPaths": ["./.vscode/VsCodeAnalyzers"] + } + } \ No newline at end of file From 5fbd288a5d2a5a8b67e91b2b306ceb0b5dcc5ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:39:50 +0200 Subject: [PATCH 24/30] dd more audio, sprites --- .../Editor/ResourceGeneratorSettings.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 10c72b6..35713d9 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -76,7 +76,10 @@ public static ResourceGeneratorSettings GetOrCreateSettings new ResourceData("Scenes", new[]{"*.unity"}, false), new ResourceData("Prefabs", new[]{"*.prefab"}, true), new ResourceData("Materials", new[]{"*.mat"}, true), - new ResourceData("AudioClips", new[]{"*.aif", "*.wav", "*.mp3", "*.ogg"}, true) + // https://docs.unity3d.com/Manual/AudioFiles.html + new ResourceData("AudioClips", new[]{"*.mp3", "*.ogg", "*.wav", "*.aiff", "*.aif", "*.mod", "*.it", "*.s3m", "*.xm"}, true), + // https://docs.unity3d.com/Manual/ImportingTextures.html + new ResourceData("Sprites", new[]{"*.bmp", "*.exr", "*.gif", "*.hdr", "*.iff", "*.jpg", "*.pict", "*.png", "*.psd", "*.tga", "*.tiff"}, true) }; AssetDatabase.CreateAsset(settings, SettingsPath); From 1b3b6d6bd0af2b9550e0ce9bc1f94ca0fe75d5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:43:01 +0200 Subject: [PATCH 25/30] Add text assets --- .../Editor/ResourceGeneratorSettings.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 35713d9..3045164 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -79,7 +79,9 @@ public static ResourceGeneratorSettings GetOrCreateSettings // https://docs.unity3d.com/Manual/AudioFiles.html new ResourceData("AudioClips", new[]{"*.mp3", "*.ogg", "*.wav", "*.aiff", "*.aif", "*.mod", "*.it", "*.s3m", "*.xm"}, true), // https://docs.unity3d.com/Manual/ImportingTextures.html - new ResourceData("Sprites", new[]{"*.bmp", "*.exr", "*.gif", "*.hdr", "*.iff", "*.jpg", "*.pict", "*.png", "*.psd", "*.tga", "*.tiff"}, true) + new ResourceData("Sprites", new[]{"*.bmp", "*.exr", "*.gif", "*.hdr", "*.iff", "*.jpg", "*.pict", "*.png", "*.psd", "*.tga", "*.tiff"}, true), + // https://docs.unity3d.com/Manual/class-TextAsset.html + new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true) }; AssetDatabase.CreateAsset(settings, SettingsPath); From 61193b1a2c364dd8b482fe0e422b09be41cfcbec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 11:54:48 +0200 Subject: [PATCH 26/30] add more image formats --- .../Editor/ResourceGeneratorSettings.cs | 11 ++--- .../Assets/ResourceGenerator.asset | 46 ++++++++++++++++++- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 3045164..d08345f 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -71,17 +71,16 @@ public static ResourceGeneratorSettings GetOrCreateSettings settings._logInfo = logInfo ?? false; settings._logError = logError ?? true; + // https://docs.unity3d.com/Manual/BuiltInImporters.html settings._data = new List { new ResourceData("Scenes", new[]{"*.unity"}, false), new ResourceData("Prefabs", new[]{"*.prefab"}, true), new ResourceData("Materials", new[]{"*.mat"}, true), - // https://docs.unity3d.com/Manual/AudioFiles.html - new ResourceData("AudioClips", new[]{"*.mp3", "*.ogg", "*.wav", "*.aiff", "*.aif", "*.mod", "*.it", "*.s3m", "*.xm"}, true), - // https://docs.unity3d.com/Manual/ImportingTextures.html - new ResourceData("Sprites", new[]{"*.bmp", "*.exr", "*.gif", "*.hdr", "*.iff", "*.jpg", "*.pict", "*.png", "*.psd", "*.tga", "*.tiff"}, true), - // https://docs.unity3d.com/Manual/class-TextAsset.html - new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true) + new ResourceData("AudioClips", new[]{"*.ogg", "*.aif", "*.aiff", "*.flac", "*.mp3", "*.mod", "*.it", "*.s3m", "*.xm"}, true), + new ResourceData("Sprites", new[]{"*.jpg", "*.jpeg", "*.tif", "*.tiff", "*.tga", "*.gif", "*.png", "*.psd", "*.bmp", "*.iff", "*.pict", "*.pic", "*.pct", "*.exr", "*.hdr"}, true), + new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true), + new ResourceData("Fonts", new[]{"*.ttf", "*.dfont", "*.otf", "*.ttc"}, true) }; AssetDatabase.CreateAsset(settings, SettingsPath); diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index e32976a..a3b97ed 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -32,6 +32,50 @@ MonoBehaviour: _isResource: 1 - _className: AudioClips _fileExtensions: - - '*.wav' + - '*.ogg' + - '*.aif' + - '*.aiff' + - '*.flac' - '*.mp3' + - '*.mod' + - '*.it' + - '*.s3m' + - '*.xm' + _isResource: 1 + - _className: Sprites + _fileExtensions: + - '*.jpg' + - '*.jpeg' + - '*.tif' + - '*.tiff' + - '*.tga' + - '*.gif' + - '*.png' + - '*.psd' + - '*.bmp' + - '*.iff' + - '*.pict' + - '*.pic' + - '*.pct' + - '*.exr' + - '*.hdr' + _isResource: 1 + - _className: TextAssets + _fileExtensions: + - '*.txt' + - '*.html' + - '*.htm' + - '*.xml' + - '*.bytes' + - '*.json' + - '*.csv' + - '*.yaml' + - '*.fnt' + _isResource: 1 + - _className: Fonts + _fileExtensions: + - '*.ttf' + - '*.dfont' + - '*.otf' + - '*.ttc' _isResource: 1 From 15165937734ecdd859b200b15d05217308c56618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 12:59:04 +0200 Subject: [PATCH 27/30] add button for resetting default file mappings --- .../CustomTool.cs | 17 --- .../CustomTool.cs.meta | 11 -- .../ResourcePaths.cs | 11 +- .../Editor/Extensions.meta | 3 + .../SerializedPropertyExtensions.cs | 140 ++++++++++++++++++ .../SerializedPropertyExtensions.cs.meta | 3 + .../Editor/ResourceGeneratorSettings.cs | 44 +++--- .../Assets/ResourceGenerator.asset | 1 + 8 files changed, 179 insertions(+), 51 deletions(-) delete mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs delete mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions.meta create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs create mode 100644 UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs.meta diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs deleted file mode 100644 index 6dc2184..0000000 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AutSoft.UnityResourceGenerator.Editor; -using UnityEditor; - -namespace AutSoft.UnityResourceGenerator.Sample -{ - public static class CustomTool - { - [MenuItem("Custom Tools / Recreate Custom Defaults")] - public static void RecreateCustomDefaults() => - ResourceGeneratorSettings.GetOrCreateSettings - ( - folderPath: "AutSoft.UnityResourceGenerator.Sample", - baseNamespace: "AutSoft.UnityResourceGenerator.Sample", - logInfo: true - ); - } -} diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta deleted file mode 100644 index 8088112..0000000 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/CustomTool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1e5e5630ad386b241be1c7fb0eaa5fb2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs index 5fd0cef..507613d 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs @@ -20,8 +20,17 @@ public static partial class Materials } public static partial class AudioClips { - public const string Coin = "Coin"; public const string CoinSpin = "CoinSpin"; + public const string Coin = "Coin"; + } + public static partial class Sprites + { + } + public static partial class TextAssets + { + } + public static partial class Fonts + { } } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions.meta new file mode 100644 index 0000000..6811668 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7fbda971f85d4d61b01ca5eca27283cc +timeCreated: 1634122059 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs new file mode 100644 index 0000000..8905d09 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs @@ -0,0 +1,140 @@ +using System.Collections; +using System.Reflection; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEngine; + +// Made from https://gist.github.com/aholkner/214628a05b15f0bb169660945ac7923b + +namespace AutSoft.UnityResourceGenerator.Editor.Extensions +{ + internal static class SerializedPropertyExtensions + { + /// (Extension) Set the value of the serialized property. + public static void SetValue(this SerializedProperty property, object value) + { + Undo.RecordObject(property.serializedObject.targetObject, $"Set {property.name}"); + + SetValueNoRecord(property, value); + + EditorUtility.SetDirty(property.serializedObject.targetObject); + property.serializedObject.ApplyModifiedProperties(); + } + + /// (Extension) Set the value of the serialized property, but do not record the change. + /// The change will not be persisted unless you call SetDirty and ApplyModifiedProperties. + private static void SetValueNoRecord(this SerializedProperty property, object value) + { + var propertyPath = property.propertyPath; + object container = property.serializedObject.targetObject; + + var i = 0; + NextPathComponent(propertyPath, ref i, out var deferredToken); + while (NextPathComponent(propertyPath, ref i, out var token)) + { + container = GetPathComponentValue(container, deferredToken); + deferredToken = token; + } + + Debug.Assert(!container.GetType().IsValueType, $"Cannot use SerializedObject.SetValue on a struct object, as the result will be set on a temporary. Either change {container.GetType().Name} to a class, or use SetValue with a parent member."); + SetPathComponentValue(container, deferredToken, value); + } + + // Union type representing either a property name or array element index. The element + // index is valid only if propertyName is null. + private struct PropertyPathComponent + { + public string PropertyName; + public int ElementIndex; + } + + private static readonly Regex ArrayElementRegex = new Regex(@"\GArray\.data\[(\d+)\]", RegexOptions.Compiled); + + private static bool NextPathComponent(string propertyPath, ref int index, out PropertyPathComponent component) + { + component = new PropertyPathComponent(); + + if (index >= propertyPath.Length) + return false; + + var arrayElementMatch = ArrayElementRegex.Match(propertyPath, index); + if (arrayElementMatch.Success) + { + index += arrayElementMatch.Length + 1; // Skip past next '.' + component.ElementIndex = int.Parse(arrayElementMatch.Groups[1].Value); + return true; + } + + var dot = propertyPath.IndexOf('.', index); + if (dot == -1) + { + component.PropertyName = propertyPath.Substring(index); + index = propertyPath.Length; + } + else + { + component.PropertyName = propertyPath.Substring(index, dot - index); + index = dot + 1; // Skip past next '.' + } + + return true; + } + + private static object GetPathComponentValue(object container, PropertyPathComponent component) => + component.PropertyName == null + ? ((IList)container)[component.ElementIndex] + : GetMemberValue(container, component.PropertyName); + + private static void SetPathComponentValue(object container, PropertyPathComponent component, object value) + { + if (component.PropertyName == null) + { + ((IList)container)[component.ElementIndex] = value; + } + else + { + SetMemberValue(container, component.PropertyName, value); + } + } + + private static object GetMemberValue(object container, string name) + { + if (container == null) + return null; + var type = container.GetType(); + var members = type.GetMember(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + foreach (var member in members) + { + switch (member) + { + case FieldInfo field: + return field.GetValue(container); + case PropertyInfo property: + return property.GetValue(container); + } + } + + return null; + } + + private static void SetMemberValue(object container, string name, object value) + { + var type = container.GetType(); + var members = type.GetMember(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + foreach (var member in members) + { + switch (member) + { + case FieldInfo field: + field.SetValue(container, value); + return; + case PropertyInfo property: + property.SetValue(container, value); + return; + } + } + + Debug.Assert(false, $"Failed to set member {container}.{name} via reflection"); + } + } +} \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs.meta b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs.meta new file mode 100644 index 0000000..2786542 --- /dev/null +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Extensions/SerializedPropertyExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 37f74c6bc5a2443fa02b0ae36b0c6906 +timeCreated: 1634122079 \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index d08345f..4e5f8ed 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -1,4 +1,5 @@ -using AutSoft.UnityResourceGenerator.Editor.Generation; +using AutSoft.UnityResourceGenerator.Editor.Extensions; +using AutSoft.UnityResourceGenerator.Editor.Generation; using System; using System.Collections.Generic; using UnityEditor; @@ -51,44 +52,40 @@ public ResourceData(string className, string[] fileExtensions, bool isResource) public bool LogError => _logError; public IReadOnlyList Data => _data; - public static ResourceGeneratorSettings GetOrCreateSettings - ( - string folderPath = null, - string baseNamespace = null, - string className = null, - bool? logInfo = null, - bool? logError = null - ) + public static ResourceGeneratorSettings GetOrCreateSettings() { var settings = AssetDatabase.LoadAssetAtPath(SettingsPath); if (settings != null) return settings; settings = CreateInstance(); - settings._folderPath = folderPath ?? string.Empty; - settings._baseNamespace = baseNamespace ?? "Resources"; - settings._className = className ?? "ResourcePaths"; - settings._logInfo = logInfo ?? false; - settings._logError = logError ?? true; + settings._folderPath = string.Empty; + settings._baseNamespace = "Resources"; + settings._className = "ResourcePaths"; + settings._logInfo = false; + settings._logError = true; + settings._data = CreateDefaultFileMappings(); + + AssetDatabase.CreateAsset(settings, SettingsPath); + AssetDatabase.SaveAssets(); + + return settings; + } + + private static List CreateDefaultFileMappings() => // https://docs.unity3d.com/Manual/BuiltInImporters.html - settings._data = new List + new List { new ResourceData("Scenes", new[]{"*.unity"}, false), new ResourceData("Prefabs", new[]{"*.prefab"}, true), new ResourceData("Materials", new[]{"*.mat"}, true), - new ResourceData("AudioClips", new[]{"*.ogg", "*.aif", "*.aiff", "*.flac", "*.mp3", "*.mod", "*.it", "*.s3m", "*.xm"}, true), + new ResourceData("AudioClips", new[]{"*.ogg", "*.aif", "*.aiff", "*.flac", "*.mp3", "*.mod", "*.it", "*.s3m", "*.xm", "*.wav"}, true), new ResourceData("Sprites", new[]{"*.jpg", "*.jpeg", "*.tif", "*.tiff", "*.tga", "*.gif", "*.png", "*.psd", "*.bmp", "*.iff", "*.pict", "*.pic", "*.pct", "*.exr", "*.hdr"}, true), new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true), new ResourceData("Fonts", new[]{"*.ttf", "*.dfont", "*.otf", "*.ttc"}, true) }; - AssetDatabase.CreateAsset(settings, SettingsPath); - AssetDatabase.SaveAssets(); - - return settings; - } - [SettingsProvider] public static SettingsProvider CreateSettingsProvider() => new SettingsProvider("Project/ResourceGenerator", SettingsScope.Project) @@ -103,6 +100,9 @@ public static SettingsProvider CreateSettingsProvider() => EditorGUILayout.PropertyField(settings.FindProperty(nameof(_className)), new GUIContent("Class name")); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logInfo)), new GUIContent("Log Infos")); EditorGUILayout.PropertyField(settings.FindProperty(nameof(_logError)), new GUIContent("Log Errors")); + + if (GUILayout.Button("Reset file mappings")) settings.FindProperty(nameof(_data)).SetValue(CreateDefaultFileMappings()); + EditorGUILayout.PropertyField(settings.FindProperty(nameof(_data)), new GUIContent("Data")); settings.ApplyModifiedProperties(); diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index a3b97ed..49cd7ce 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -41,6 +41,7 @@ MonoBehaviour: - '*.it' - '*.s3m' - '*.xm' + - '*.wav' _isResource: 1 - _className: Sprites _fileExtensions: From 59d4c4aa18626c4a9fd2052687431814dcc5dc95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 14:37:30 +0200 Subject: [PATCH 28/30] generate load methods --- .../ResourcePaths.cs | 13 +++++++++++ .../ResourcePathTests.cs | 16 ++++++-------- .../Editor/Generation/IResourceData.cs | 1 + .../Editor/Generation/Modules/AllResources.cs | 22 ++++++++++++++----- .../Generation/ResourceFileGenerator.cs | 6 ++++- .../Editor/ResourceGeneratorSettings.cs | 19 +++++++++------- .../Assets/ResourceGenerator.asset | 7 ++++++ 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs index 507613d..b24d5b0 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs @@ -1,3 +1,5 @@ +using UnityEngine; +using UnityEngine.SceneManagement; namespace AutSoft.UnityResourceGenerator.Sample { // ReSharper disable PartialTypeWithSinglePart @@ -6,22 +8,33 @@ public static partial class ResourcePaths public static partial class Scenes { public const string CreatePrefab = "AutSoft.UnityResourceGenerator.Sample/Scenes/CreatePrefab"; + public static void LoadCreatePrefab(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadScene(CreatePrefab, mode); + public static AsyncOperation LoadAsyncCreatePrefab(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadSceneAsync(CreatePrefab, mode); public const string LoadSceneInitial = "AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneInitial"; + public static void LoadLoadSceneInitial(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadScene(LoadSceneInitial, mode); + public static AsyncOperation LoadAsyncLoadSceneInitial(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadSceneAsync(LoadSceneInitial, mode); public const string LoadSceneNext = "AutSoft.UnityResourceGenerator.Sample/Scenes/LoadSceneNext"; + public static void LoadLoadSceneNext(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadScene(LoadSceneNext, mode); + public static AsyncOperation LoadAsyncLoadSceneNext(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadSceneAsync(LoadSceneNext, mode); } public static partial class Prefabs { public const string Cube = "Cube"; + public static GameObject LoadCube() => Resources.Load(Cube); } public static partial class Materials { public const string Cube = "Cube"; + public static Material LoadCube() => Resources.Load(Cube); public const string CubeAlt = "CubeAlt"; + public static Material LoadCubeAlt() => Resources.Load(CubeAlt); } public static partial class AudioClips { public const string CoinSpin = "CoinSpin"; + public static AudioClip LoadCoinSpin() => Resources.Load(CoinSpin); public const string Coin = "Coin"; + public static AudioClip LoadCoin() => Resources.Load(Coin); } public static partial class Sprites { diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs index 036e70c..cc89776 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Tests/ResourcePathTests.cs @@ -1,7 +1,5 @@ using AutSoft.UnityResourceGenerator.Sample; using NUnit.Framework; -using UnityEngine; -using UnityEngine.SceneManagement; namespace AutSoft.UnityResourceGenerator.Tests { @@ -10,34 +8,34 @@ public class ResourcePathTests [Test] public void ScenesWork() { - Assert.DoesNotThrow(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneInitial)); - Assert.DoesNotThrow(() => SceneManager.LoadScene(ResourcePaths.Scenes.LoadSceneNext)); + Assert.DoesNotThrow(() => ResourcePaths.Scenes.LoadLoadSceneInitial()); + Assert.DoesNotThrow(() => ResourcePaths.Scenes.LoadLoadSceneNext()); } [Test] public void PrefabsWork() { - var prefab = Resources.Load(ResourcePaths.Prefabs.Cube); + var prefab = ResourcePaths.Prefabs.LoadCube(); Assert.NotNull(prefab); } [Test] public void MaterialsWork() { - var cubeMaterial = Resources.Load(ResourcePaths.Materials.Cube); + var cubeMaterial = ResourcePaths.Materials.LoadCube(); Assert.NotNull(cubeMaterial); - var cubeAltMaterial = Resources.Load(ResourcePaths.Materials.CubeAlt); + var cubeAltMaterial = ResourcePaths.Materials.LoadCubeAlt(); Assert.NotNull(cubeAltMaterial); } [Test] public void AudioClipsWork() { - var coin = Resources.Load(ResourcePaths.AudioClips.Coin); + var coin = ResourcePaths.AudioClips.LoadCoin(); Assert.NotNull(coin); - var coinSpin = Resources.Load(ResourcePaths.AudioClips.CoinSpin); + var coinSpin = ResourcePaths.AudioClips.LoadCoinSpin(); Assert.NotNull(coinSpin); } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs index f9156e2..71b944b 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/IResourceData.cs @@ -7,5 +7,6 @@ public interface IResourceData string ClassName { get; } IReadOnlyList FileExtensions { get; } bool IsResource { get; } + string DataType { get; } } } \ No newline at end of file diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index 85f4741..c277606 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -66,12 +66,22 @@ public static partial class {data.ClassName} var output = values .Aggregate( new StringBuilder().Append(classBegin), - (sb, s) => sb - .Append(" public const string ") - .Append(s.name) - .Append(" = \"") - .Append(s.path) - .AppendLine("\";")) + (sb, s) => + { + sb.Append(" public const string ").Append(s.name).Append(" = \"").Append(s.path).AppendLine("\";"); + + if (data.DataType == "Scene") + { + sb.Append(" public static ").Append("void").Append(" Load").Append(s.name).Append("(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadScene(").Append(s.name).AppendLine(", mode);"); + sb.Append(" public static ").Append("AsyncOperation").Append(" LoadAsync").Append(s.name).Append("(LoadSceneMode mode = LoadSceneMode.Single) => SceneManager.LoadSceneAsync(").Append(s.name).AppendLine(", mode);"); + } + else + { + sb.Append(" public static ").Append(data.DataType).Append(" Load").Append(s.name).Append("() => Resources.Load<").Append(data.DataType).Append(">(").Append(s.name).AppendLine(");"); + } + + return sb; + }) .AppendLine(classEnd) .ToString(); diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs index f85e814..000097f 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/ResourceFileGenerator.cs @@ -11,7 +11,11 @@ public static string CreateResourceFile(ResourceContext context) { // ReSharper disable once MissingIndent const string fileBegin = -@"namespace {0} +@" +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace {0} { // ReSharper disable PartialTypeWithSinglePart public static partial class {1} diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs index 4e5f8ed..7ab751c 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/ResourceGeneratorSettings.cs @@ -15,21 +15,24 @@ public sealed class ResourceData : IResourceData [SerializeField] private string _className = default; [SerializeField] private string[] _fileExtensions = default; [SerializeField] private bool _isResource = default; + [SerializeField] private string _dataType = default; public ResourceData() { } - public ResourceData(string className, string[] fileExtensions, bool isResource) + public ResourceData(string className, string[] fileExtensions, bool isResource, string dataType) { _className = className; _fileExtensions = fileExtensions; _isResource = isResource; + _dataType = dataType; } public string ClassName => _className; public IReadOnlyList FileExtensions => _fileExtensions; public bool IsResource => _isResource; + public string DataType => _dataType; } private const string SettingsPath = "Assets/ResourceGenerator.asset"; @@ -77,13 +80,13 @@ private static List CreateDefaultFileMappings() => // https://docs.unity3d.com/Manual/BuiltInImporters.html new List { - new ResourceData("Scenes", new[]{"*.unity"}, false), - new ResourceData("Prefabs", new[]{"*.prefab"}, true), - new ResourceData("Materials", new[]{"*.mat"}, true), - new ResourceData("AudioClips", new[]{"*.ogg", "*.aif", "*.aiff", "*.flac", "*.mp3", "*.mod", "*.it", "*.s3m", "*.xm", "*.wav"}, true), - new ResourceData("Sprites", new[]{"*.jpg", "*.jpeg", "*.tif", "*.tiff", "*.tga", "*.gif", "*.png", "*.psd", "*.bmp", "*.iff", "*.pict", "*.pic", "*.pct", "*.exr", "*.hdr"}, true), - new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true), - new ResourceData("Fonts", new[]{"*.ttf", "*.dfont", "*.otf", "*.ttc"}, true) + new ResourceData("Scenes", new[]{"*.unity"}, false, "Scene"), + new ResourceData("Prefabs", new[]{"*.prefab"}, true, "GameObject"), + new ResourceData("Materials", new[]{"*.mat"}, true, "Material"), + new ResourceData("AudioClips", new[]{"*.ogg", "*.aif", "*.aiff", "*.flac", "*.mp3", "*.mod", "*.it", "*.s3m", "*.xm", "*.wav"}, true, "AudioClip"), + new ResourceData("Sprites", new[]{"*.jpg", "*.jpeg", "*.tif", "*.tiff", "*.tga", "*.gif", "*.png", "*.psd", "*.bmp", "*.iff", "*.pict", "*.pic", "*.pct", "*.exr", "*.hdr"}, true, "Sprite"), + new ResourceData("TextAssets", new[]{"*.txt", "*.html", "*.htm", "*.xml", "*.bytes", "*.json", "*.csv", "*.yaml", "*.fnt"}, true, "TextAsset"), + new ResourceData("Fonts", new[]{"*.ttf", "*.dfont", "*.otf", "*.ttc"}, true, "Font") }; [SettingsProvider] diff --git a/UnityResourceGenerator/Assets/ResourceGenerator.asset b/UnityResourceGenerator/Assets/ResourceGenerator.asset index 49cd7ce..ba01895 100644 --- a/UnityResourceGenerator/Assets/ResourceGenerator.asset +++ b/UnityResourceGenerator/Assets/ResourceGenerator.asset @@ -22,14 +22,17 @@ MonoBehaviour: _fileExtensions: - '*.unity' _isResource: 0 + _dataType: Scene - _className: Prefabs _fileExtensions: - '*.prefab' _isResource: 1 + _dataType: GameObject - _className: Materials _fileExtensions: - '*.mat' _isResource: 1 + _dataType: Material - _className: AudioClips _fileExtensions: - '*.ogg' @@ -43,6 +46,7 @@ MonoBehaviour: - '*.xm' - '*.wav' _isResource: 1 + _dataType: AudioClip - _className: Sprites _fileExtensions: - '*.jpg' @@ -61,6 +65,7 @@ MonoBehaviour: - '*.exr' - '*.hdr' _isResource: 1 + _dataType: Sprite - _className: TextAssets _fileExtensions: - '*.txt' @@ -73,6 +78,7 @@ MonoBehaviour: - '*.yaml' - '*.fnt' _isResource: 1 + _dataType: TextAsset - _className: Fonts _fileExtensions: - '*.ttf' @@ -80,3 +86,4 @@ MonoBehaviour: - '*.otf' - '*.ttc' _isResource: 1 + _dataType: Font From 61ecbd8319ac81f6576a26fd616c40a6bb45b403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 14:42:31 +0200 Subject: [PATCH 29/30] Don't create empty classes --- .../ResourcePaths.cs | 9 --------- .../Editor/Generation/Modules/AllResources.cs | 11 ++++++++++- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs index b24d5b0..ab43e1f 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator.Sample/ResourcePaths.cs @@ -36,14 +36,5 @@ public static partial class AudioClips public const string Coin = "Coin"; public static AudioClip LoadCoin() => Resources.Load(Coin); } - public static partial class Sprites - { - } - public static partial class TextAssets - { - } - public static partial class Fonts - { - } } } diff --git a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs index c277606..10a7c5c 100644 --- a/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs +++ b/UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator/Editor/Generation/Modules/AllResources.cs @@ -63,6 +63,13 @@ public static partial class {data.ClassName} throw new InvalidOperationException("Found duplicate file names"); } + if (values.Length == 0) + { + LogFinished(); + + return string.Empty; + } + var output = values .Aggregate( new StringBuilder().Append(classBegin), @@ -85,9 +92,11 @@ public static partial class {data.ClassName} .AppendLine(classEnd) .ToString(); - context.Info($"Finished generating {data.ClassName}"); + LogFinished(); return output; + + void LogFinished() => context.Info($"Finished generating {data.ClassName}"); } private static (bool canLoad, string baseFolder) GetBaseFolder(string filePath, bool isResource, ResourceContext context) From a3dcff2ebf0b0c351f85e5cd610e707dcab645cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurai?= Date: Wed, 13 Oct 2021 14:52:16 +0200 Subject: [PATCH 30/30] add automatic tagging to releases --- .github/workflows/publish.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..0a92891 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,19 @@ +name: Publish + +on: + push: + branches: + - main + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Publish LinkerGenerator to openupm + uses: butlerlogic/action-autotag@stable + with: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + root: "UnityResourceGenerator/Assets/AutSoft.UnityResourceGenerator"