diff --git a/Assembly-CSharp-Editor.csproj b/Assembly-CSharp-Editor.csproj
new file mode 100644
index 0000000..b659969
--- /dev/null
+++ b/Assembly-CSharp-Editor.csproj
@@ -0,0 +1,1607 @@
+
+
+
+ Temp\obj\$(MSBuildProjectName)
+ $(BaseIntermediateOutputPath)
+ false
+ true
+ Temp\bin\Debug\
+
+
+
+
+
+
+ false
+ false
+ 9.0
+
+ Library
+ Assembly-CSharp-Editor
+ netstandard2.1
+ .
+
+
+ 0169;USG0001
+ UNITY_6000_3_3;UNITY_6000_3;UNITY_6000;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;UNITY_2022_1_OR_NEWER;UNITY_2022_2_OR_NEWER;UNITY_2022_3_OR_NEWER;UNITY_2023_1_OR_NEWER;UNITY_2023_2_OR_NEWER;UNITY_2023_3_OR_NEWER;UNITY_6000_0_OR_NEWER;UNITY_6000_1_OR_NEWER;UNITY_6000_2_OR_NEWER;UNITY_6000_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_AUDIO_SCRIPTABLE_PIPELINE;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_UNITY_CONSENT;ENABLE_UNITY_CLOUD_IDENTIFIERS;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_EDITOR_GAME_SERVICES;ENABLE_UNITY_GAME_SERVICES_ANALYTICS_SUPPORT;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_GENERATE_NATIVE_PLUGINS_FOR_ASSEMBLIES_API;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_MANAGED_UNITYTLS;INCLUDE_DYNAMIC_GI;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_MARSHALLING_TESTS;ENABLE_VIDEO;ENABLE_NAVIGATION_OFFMESHLINK_TO_NAVMESHLINK;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;ENABLE_ACCESSIBILITY_SCREEN_READER;TEXTCORE_1_0_OR_NEWER;EDITOR_ONLY_NAVMESH_BUILDER_DEPRECATED;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_NVIDIA;ENABLE_AMD;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_CLOUD_SERVICES_ENGINE_DIAGNOSTICS;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;PLATFORM_USES_EXPLICIT_MEMORY_MANAGER_INITIALIZER;PLATFORM_SUPPORTS_WAIT_FOR_PRESENTATION;PLATFORM_SUPPORTS_SPLIT_GRAPHICS_JOBS;ENABLE_MONO;NET_4_6;NET_UNITY_4_8;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_INPUT_SYSTEM;TEXTCORE_FONT_ENGINE_1_5_OR_NEWER;TEXTCORE_TEXT_ENGINE_1_5_OR_NEWER;TEXTCORE_FONT_ENGINE_1_6_OR_NEWER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER;UNITY_EDITOR_ONLY_COMPILATION
+ False
+
+
+ true
+ true
+ true
+ true
+ MSB3277
+
+
+ Package
+ 2.0.25
+ SDK
+ Editor:5
+ StandaloneWindows64:19
+ 6000.3.3f1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AMDModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ARModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AccessibilityModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AdaptivePerformanceModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AndroidJNIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AnimationModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AssetBundleModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.AudioModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ClothModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterInputModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterRendererModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ContentLoadModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.CrashReportingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.DSPGraphModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.DirectorModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.GIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.GameCenterModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.GraphicsStateCollectionSerializerModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.GridModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.HierarchyModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.HierarchyCoreModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.HotReloadModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.IMGUIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.IdentifiersModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ImageConversionModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.InputModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.InputForUIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.InputLegacyModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.InsightsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.JSONSerializeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.LocalizationModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.MarshallingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.MultiplayerModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.NVIDIAModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ParticleSystemModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.PerformanceReportingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.PhysicsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.Physics2DModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.PhysicsBackendPhysXModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.PropertiesModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.RenderAs2DModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ScreenCaptureModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ShaderRuntimeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.ShaderVariantAnalyticsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.SharedInternalsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteMaskModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteShapeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.StreamingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.SubstanceModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.SubsystemsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TLSModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainPhysicsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreFontEngineModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreTextEngineModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextRenderingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.TilemapModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UIElementsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UmbraModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsCommonModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityConnectModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityConsentModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityCurlModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAssetBundleModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAudioModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestTextureModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VFXModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VRModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VectorGraphicsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VehiclesModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VideoModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.VirtualTexturingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.WindModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEngine.XRModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.AccessibilityModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.AdaptivePerformanceModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.AssetComplianceModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.BuildProfileModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.ClothModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.CoreBusinessMetricsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.CoreModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.DeviceSimulatorModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.DiagnosticsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.EditorToolbarModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.EmbreeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.GIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.GraphViewModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.GraphicsStateCollectionSerializerModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.GridAndSnapModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.GridModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.HierarchyModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.InAppPurchasingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.LevelPlayModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.MediaModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.MultiplayerModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.Physics2DModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.PhysicsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.PlayModeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.PresetsUIModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.PropertiesModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.QuickSearchModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SafeModeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneTemplateModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneViewModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.ShaderBuildSettingsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.ShaderCompilationModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.ShaderFoundryModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SketchUpModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SpriteMaskModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SpriteShapeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.SubstanceModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TerrainModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreFontEngineModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreTextEngineModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TextRenderingModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TilemapModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.TreeModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIAutomationModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIBuilderModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsSamplesModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIToolkitAuthoringModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UmbraModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.UnityConnectModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.VFXModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.VectorGraphicsModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.VideoModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEngine\UnityEditor.XRModule.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\Managed\UnityEditor.Graphs.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\PlaybackEngines\WebGLSupport\UnityEditor.WebGL.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\PlaybackEngines\WindowsStandaloneSupport\UnityEditor.WindowsStandalone.Extensions.dll
+ False
+
+
+ Library\PackageCache\com.unity.visualscripting@191c0d7e3b69\Editor\VisualScripting.Core\Dependencies\YamlDotNet\Unity.VisualScripting.YamlDotNet.dll
+ False
+
+
+ Library\PackageCache\com.unity.collections@aea9d3bd5e19\Unity.Collections.LowLevel.ILSupport\Unity.Collections.LowLevel.ILSupport.dll
+ False
+
+
+ Library\PackageCache\com.unity.ext.nunit@d8c07649098d\net40\unity-custom\nunit.framework.dll
+ False
+
+
+ Library\PackageCache\com.unity.collab-proxy@3351acaba9c9\Lib\Editor\Unity.Plastic.Antlr3.Runtime.dll
+ False
+
+
+ Library\PackageCache\com.unity.collab-proxy@3351acaba9c9\Lib\Editor\Unity.Plastic.Newtonsoft.Json.dll
+ False
+
+
+ Library\PackageCache\com.unity.collab-proxy@3351acaba9c9\Lib\Editor\log4netPlastic.dll
+ False
+
+
+ Library\PackageCache\com.unity.visualscripting@191c0d7e3b69\Editor\VisualScripting.Core\Dependencies\DotNetZip\Unity.VisualScripting.IonicZip.dll
+ False
+
+
+ Library\PackageCache\com.unity.collab-proxy@3351acaba9c9\Lib\Editor\unityplastic.dll
+ False
+
+
+ Library\PackageCache\com.unity.collections@aea9d3bd5e19\Unity.Collections.Tests\System.IO.Hashing\System.IO.Hashing.dll
+ False
+
+
+ Library\PackageCache\com.unity.visualscripting@191c0d7e3b69\Runtime\VisualScripting.Flow\Dependencies\NCalc\Unity.VisualScripting.Antlr3.Runtime.dll
+ False
+
+
+ Library\PackageCache\com.unity.nuget.newtonsoft-json@4dfd81071c64\Runtime\Newtonsoft.Json.dll
+ False
+
+
+ Library\PackageCache\com.unity.visualscripting@191c0d7e3b69\Editor\VisualScripting.Core\EditorAssetResources\Unity.VisualScripting.TextureAssets.dll
+ False
+
+
+ Library\PackageCache\com.unity.nuget.mono-cecil@ecb9724e46ff\Mono.Cecil.dll
+ False
+
+
+ Library\PackageCache\com.unity.collections@aea9d3bd5e19\Unity.Collections.Tests\System.Runtime.CompilerServices.Unsafe\System.Runtime.CompilerServices.Unsafe.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\mscorlib.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Core.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Runtime.Serialization.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.Linq.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.Vectors.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Net.Http.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Microsoft.CSharp.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.DataSetExtensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Drawing.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.FileSystem.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.ComponentModel.Composition.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Transactions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\Microsoft.Win32.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\netstandard.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.AppContext.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Buffers.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Concurrent.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.NonGeneric.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Specialized.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Annotations.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.EventBasedAsync.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.TypeConverter.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Console.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Data.Common.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Contracts.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Debug.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.FileVersionInfo.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Process.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.StackTrace.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TextWriterTraceListener.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Tools.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TraceSource.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Drawing.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Dynamic.Runtime.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Calendars.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Compression.ZipFile.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.DriveInfo.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Watcher.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.IsolatedStorage.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.MemoryMappedFiles.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Pipes.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.UnmanagedMemoryStream.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Expressions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Parallel.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Queryable.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Memory.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Http.Rtc.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NameResolution.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NetworkInformation.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Ping.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Requests.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Security.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Sockets.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebHeaderCollection.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.Client.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ObjectModel.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.DispatchProxy.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.ILGeneration.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.Lightweight.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Reader.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.ResourceManager.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Writer.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.CompilerServices.VisualC.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Handles.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.RuntimeInformation.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.WindowsRuntime.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Numerics.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Formatters.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Json.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Xml.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Claims.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Algorithms.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Csp.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Encoding.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.X509Certificates.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Principal.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.SecureString.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Duplex.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Http.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.NetTcp.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Primitives.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Security.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.RegularExpressions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Overlapped.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Extensions.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Parallel.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Thread.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.ThreadPool.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Timer.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ValueTuple.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.ReaderWriter.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XDocument.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlDocument.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlSerializer.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.dll
+ False
+
+
+ C:\Program Files\Unity\Hub\Editor\6000.3.3f1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.XDocument.dll
+ False
+
+
+ Library\ScriptAssemblies\UnityEditor.TestRunner.dll
+ False
+
+
+ Library\ScriptAssemblies\UnityEngine.TestRunner.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.MetricEvents.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Core.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Common.Path.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Netcode.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Sprite.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.InternalAPIEngineBridge.001.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStatsReporting.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.TextMeshPro.dll
+ False
+
+
+ Library\ScriptAssemblies\PsdPlugin.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.MetricTestData.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetworkSolutionInterface.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStats.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Rendering.LightTransport.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Netcode.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Core.ShaderLibrary.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.IK.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetworkSimulator.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.SettingsProvider.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.DependencyInjection.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Networking.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.InternalAPIEditorBridge.001.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Splines.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.2D.Editor.Overrides.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetworkProfiler.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Timeline.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Common.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetVis.Configuration.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Tooling.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\PPv2URPConverters.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Animation.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Core.Runtime.Shared.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.MetricTypes.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.2D.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.Shared.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Searcher.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.PlasticSCM.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Animation.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Burst.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.Core.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.Adapters.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Mathematics.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStatsMonitor.Configuration.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Cinemachine.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.UnifiedRayTracing.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Aseprite.Common.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Cinemachine.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetVis.Editor.Visualization.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Rider.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStatsMonitor.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Aseprite.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.DependencyInjection.UIElements.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Psdimporter.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Core.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.Flow.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.TextMeshPro.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Tilemap.Extras.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Netcode.PackageChecker.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Tilemap.Extras.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.Flow.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.IK.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.SpriteShape.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualStudio.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Tilemap.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Common.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Collections.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Profiling.Core.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Networking.Transport.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.InputSystem.ForUI.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Timeline.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.State.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.GPUDriven.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Mathematics.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetworkProfiler.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Shaders.dll
+ False
+
+
+ Library\ScriptAssemblies\UnityEngine.UI.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Center.Common.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Burst.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.Core.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.InternalAPIEngineBridge.004.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Center.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\com.unity.multiplayer.tools.window.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.VisualScripting.State.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Config.Runtime.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.Common.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipeline.Universal.ShaderLibrary.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Collections.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.ShaderGraph.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStatsMonitor.Implementation.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.Sprite.AIIntegration.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.RenderPipelines.Core.Editor.Shared.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.Initialization.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.InputSystem.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetStatsMonitor.Component.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetworkSimulator.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Settings.Editor.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Splines.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.Multiplayer.Tools.NetVis.Editor.UI.dll
+ False
+
+
+ Library\ScriptAssemblies\UnityEditor.UI.dll
+ False
+
+
+ Library\ScriptAssemblies\Unity.2D.SpriteShape.Editor.dll
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/Data.meta b/Assets/Data.meta
new file mode 100644
index 0000000..bd0a189
--- /dev/null
+++ b/Assets/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5f7bdf031c4165f4194ad3c9f0c80356
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/Scripts.meta b/Assets/Data/Scripts.meta
new file mode 100644
index 0000000..0406065
--- /dev/null
+++ b/Assets/Data/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5380ca0483c112049895ebc9c6794d73
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/Scripts/DataClasses.meta b/Assets/Data/Scripts/DataClasses.meta
new file mode 100644
index 0000000..7ceae4b
--- /dev/null
+++ b/Assets/Data/Scripts/DataClasses.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1d366afae3759bc4c83aebc631a3ac4a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Editor.meta b/Assets/Editor.meta
new file mode 100644
index 0000000..7afea97
--- /dev/null
+++ b/Assets/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 208723e08bdfdc347bc1af53f4be5c3c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Editor/DataImporter.meta b/Assets/Editor/DataImporter.meta
new file mode 100644
index 0000000..3a49ee8
--- /dev/null
+++ b/Assets/Editor/DataImporter.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8f4724b7534e0a443a8eabbe6f5483ad
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Editor/DataImporter/CSVDebugger.cs b/Assets/Editor/DataImporter/CSVDebugger.cs
new file mode 100644
index 0000000..4730533
--- /dev/null
+++ b/Assets/Editor/DataImporter/CSVDebugger.cs
@@ -0,0 +1,94 @@
+// Assets/Editor/DataImporter/CSVDebugger.cs
+
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+using System.Text;
+
+namespace Northbound.Editor
+{
+ public static class CSVDebugger
+ {
+ [MenuItem("Northbound/Debug CSV Files")]
+ public static void DebugCSVFiles()
+ {
+ string gameDataPath = Path.Combine(Application.dataPath, "..", "GameData");
+ var csvFiles = Directory.GetFiles(gameDataPath, "*.csv");
+
+ Debug.Log("=== CSV 파일 디버그 ===\n");
+
+ foreach (var csvPath in csvFiles)
+ {
+ string fileName = Path.GetFileName(csvPath);
+
+ if (fileName.StartsWith("."))
+ continue;
+
+ Debug.Log($"📄 파일: {fileName}");
+
+ // 파일 크기
+ FileInfo fileInfo = new FileInfo(csvPath);
+ Debug.Log($" 📊 크기: {fileInfo.Length} bytes");
+
+ // 인코딩 테스트
+ try
+ {
+ // UTF-8로 읽기
+ var lines = File.ReadAllLines(csvPath, Encoding.UTF8);
+ Debug.Log($" ✅ UTF-8 읽기 성공: {lines.Length}줄");
+
+ // ⭐ 모든 줄 출력
+ for (int i = 0; i < lines.Length; i++)
+ {
+ string line = lines[i];
+ Debug.Log($" 📋 [{i}] 길이:{line.Length} | 내용: '{line}'");
+
+ // 특수문자 확인
+ if (string.IsNullOrWhiteSpace(line))
+ {
+ Debug.Log($" ⚠️ 빈 줄 또는 공백만 있음");
+ }
+
+ // 바이트 출력 (첫 20바이트만)
+ byte[] bytes = Encoding.UTF8.GetBytes(line);
+ string byteStr = "";
+ for (int j = 0; j < Mathf.Min(bytes.Length, 20); j++)
+ {
+ byteStr += $"{bytes[j]:X2} ";
+ }
+ if (bytes.Length > 20) byteStr += "...";
+ Debug.Log($" 바이트: {byteStr}");
+ }
+
+ // BOM 체크
+ byte[] fileBytes = File.ReadAllBytes(csvPath);
+ if (fileBytes.Length >= 3 && fileBytes[0] == 0xEF && fileBytes[1] == 0xBB && fileBytes[2] == 0xBF)
+ {
+ Debug.Log($" ℹ️ UTF-8 BOM 있음");
+ }
+ else
+ {
+ Debug.Log($" ℹ️ BOM 없음");
+ }
+
+ // 전체 파일 바이트 (처음 100바이트만)
+ string fileBytesStr = "";
+ for (int i = 0; i < Mathf.Min(fileBytes.Length, 100); i++)
+ {
+ fileBytesStr += $"{fileBytes[i]:X2} ";
+ if ((i + 1) % 20 == 0) fileBytesStr += "\n ";
+ }
+ Debug.Log($" 📦 파일 바이트 (처음 100):\n {fileBytesStr}");
+ }
+ catch (System.Exception e)
+ {
+ Debug.LogError($" ❌ 읽기 실패: {e.Message}");
+ }
+
+ Debug.Log("");
+ }
+
+ Debug.Log("=== 디버그 완료 ===");
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Editor/DataImporter/CSVDebugger.cs.meta b/Assets/Editor/DataImporter/CSVDebugger.cs.meta
new file mode 100644
index 0000000..ec4952f
--- /dev/null
+++ b/Assets/Editor/DataImporter/CSVDebugger.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 95247e4274c204446ac0f9c45c334c56
\ No newline at end of file
diff --git a/Assets/Editor/DataImporter/CSVToSOImporter.cs b/Assets/Editor/DataImporter/CSVToSOImporter.cs
new file mode 100644
index 0000000..db44d94
--- /dev/null
+++ b/Assets/Editor/DataImporter/CSVToSOImporter.cs
@@ -0,0 +1,348 @@
+// Assets/Editor/DataImporter/CSVToSOImporter.cs
+
+using UnityEngine;
+using UnityEditor;
+using System;
+using System.IO;
+using System.Reflection;
+using System.Collections.Generic;
+
+namespace Northbound.Editor
+{
+ public static class CSVToSOImporter
+ {
+ private static readonly string GAMEDATA_PATH = Path.Combine(
+ Application.dataPath,
+ "..", "GameData"
+ );
+
+ private static readonly string SO_BASE_PATH = "Assets/Data/ScriptableObjects";
+
+
+ public static void ImportAll()
+ {
+ Debug.Log("=== 전체 데이터 Import 시작 ===");
+
+ var csvFiles = Directory.GetFiles(GAMEDATA_PATH, "*.csv");
+
+ int totalSuccess = 0;
+ int totalFail = 0;
+
+ foreach (var csvPath in csvFiles)
+ {
+ if (csvPath.Contains("Backups"))
+ continue;
+
+ string schemaName = Path.GetFileNameWithoutExtension(csvPath);
+
+ if (schemaName.StartsWith("."))
+ continue;
+
+ Debug.Log($"\n📋 {schemaName} Import 시작...");
+
+ if (ImportSchema(schemaName))
+ {
+ totalSuccess++;
+ }
+ else
+ {
+ totalFail++;
+ }
+ }
+
+ Debug.Log("\n" + new string('=', 60));
+ Debug.Log($"🎉 전체 Import 완료: 성공 {totalSuccess}개, 실패 {totalFail}개");
+ Debug.Log(new string('=', 60));
+ }
+
+
+ public static bool ImportSchema(string schemaName)
+ {
+ string csvPath = Path.Combine(GAMEDATA_PATH, $"{schemaName}.csv");
+ string outputPath = Path.Combine(SO_BASE_PATH, schemaName);
+
+ if (!File.Exists(csvPath))
+ {
+ Debug.LogError($"❌ CSV 파일을 찾을 수 없습니다: {csvPath}");
+ return false;
+ }
+
+ if (!Directory.Exists(outputPath))
+ {
+ Directory.CreateDirectory(outputPath);
+ }
+
+ string className = schemaName + "Data";
+ Type dataType = FindScriptableObjectType(className);
+
+ if (dataType == null)
+ {
+ Debug.LogError($"❌ ScriptableObject 클래스를 찾을 수 없습니다: {className}");
+ Debug.LogError($"💡 generate_csharp_classes.py를 먼저 실행하세요.");
+ return false;
+ }
+
+ Debug.Log($" ✅ 클래스 발견: {dataType.FullName}");
+
+ int importCount = 0;
+
+ try
+ {
+ var lines = File.ReadAllLines(csvPath, System.Text.Encoding.UTF8);
+
+ if (lines.Length < 2)
+ {
+ Debug.LogError("❌ CSV 파일에 데이터가 없습니다.");
+ return false;
+ }
+
+ var headers = ParseCSVLine(lines[0]);
+
+ Debug.Log($" 📊 {lines.Length - 1}개 행, {headers.Length}개 컬럼");
+
+ for (int lineIndex = 1; lineIndex < lines.Length; lineIndex++)
+ {
+ string line = lines[lineIndex].Trim();
+
+ if (string.IsNullOrEmpty(line))
+ continue;
+
+ try
+ {
+ var values = ParseCSVLine(line);
+
+ if (values.Length != headers.Length)
+ {
+ Debug.LogWarning($" ⚠️ 행 {lineIndex + 1}: 컬럼 개수 불일치");
+ continue;
+ }
+
+ var so = ScriptableObject.CreateInstance(dataType);
+
+ for (int col = 0; col < headers.Length; col++)
+ {
+ string fieldName = headers[col];
+ if (string.IsNullOrEmpty(fieldName))
+ continue;
+
+ string camelFieldName = ToCamelCase(fieldName);
+ Debug.Log(" 🔍 필드 매핑: " + camelFieldName);
+
+ FieldInfo field = dataType.GetField(camelFieldName, BindingFlags.Public | BindingFlags.Instance);
+
+ if (field == null)
+ {
+ if (lineIndex == 1)
+ {
+ Debug.LogWarning($" ⚠️ 필드를 찾을 수 없습니다: {camelFieldName}");
+ }
+ continue;
+ }
+
+ string cellValue = values[col];
+ SetFieldValue(so, field, cellValue);
+ }
+
+ string assetName = GetAssetName(so, lineIndex);
+ string fileName = assetName + ".asset";
+ string assetPath = Path.Combine(outputPath, fileName);
+
+ AssetDatabase.CreateAsset(so, assetPath);
+ importCount++;
+
+ Debug.Log($" ✅ {assetName}");
+ }
+ catch (Exception e)
+ {
+ Debug.LogError($" ❌ 행 {lineIndex + 1} Import 실패: {e.Message}");
+ }
+ }
+
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+
+ Debug.Log($" 🎉 {schemaName} Import 완료: {importCount}개");
+ return true;
+ }
+ catch (Exception e)
+ {
+ Debug.LogError($"❌ {schemaName} Import 실패: {e.Message}");
+ Debug.LogException(e);
+ return false;
+ }
+ }
+
+
+ private static string[] ParseCSVLine(string line)
+ {
+ var result = new List();
+ bool inQuotes = false;
+ string currentValue = "";
+
+ for (int i = 0; i < line.Length; i++)
+ {
+ char c = line[i];
+
+ if (c == '"')
+ {
+ inQuotes = !inQuotes;
+ }
+ else if (c == ',' && !inQuotes)
+ {
+ result.Add(currentValue.Trim());
+ currentValue = "";
+ }
+ else
+ {
+ currentValue += c;
+ }
+ }
+
+ result.Add(currentValue.Trim());
+
+ return result.ToArray();
+ }
+
+
+ private static Type FindScriptableObjectType(string className)
+ {
+ string fullName = $"Northbound.Data.{className}";
+
+ foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
+ {
+ Type type = assembly.GetType(fullName);
+ if (type != null && type.IsSubclassOf(typeof(ScriptableObject)))
+ {
+ return type;
+ }
+ }
+
+ return null;
+ }
+
+
+ private static string ToCamelCase(string snakeCase)
+ {
+ if (string.IsNullOrEmpty(snakeCase))
+ return snakeCase;
+
+ var parts = snakeCase.Split('_');
+ if (parts.Length == 1)
+ return snakeCase;
+
+ string result = parts[0];
+ for (int i = 1; i < parts.Length; i++)
+ {
+ if (parts[i].Length > 0)
+ {
+ result += char.ToUpper(parts[i][0]) + parts[i].Substring(1);
+ }
+ }
+
+ return result;
+ }
+
+
+ private static void SetFieldValue(object obj, FieldInfo field, string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ field.SetValue(obj, null);
+ return;
+ }
+
+ Type fieldType = field.FieldType;
+
+ if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
+ {
+ Type underlyingType = Nullable.GetUnderlyingType(fieldType);
+ object convertedValue = ConvertValue(value, underlyingType);
+ field.SetValue(obj, convertedValue);
+ }
+ else
+ {
+ object convertedValue = ConvertValue(value, fieldType);
+ field.SetValue(obj, convertedValue);
+ }
+ }
+
+
+ private static object ConvertValue(string value, Type targetType)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ return null;
+
+ if (targetType == typeof(int))
+ {
+ if (int.TryParse(value, out int result))
+ return result;
+ return 0;
+ }
+ else if (targetType == typeof(float))
+ {
+ if (float.TryParse(value, out float result))
+ return result;
+ return 0f;
+ }
+ else if (targetType == typeof(double))
+ {
+ if (double.TryParse(value, out double result))
+ return result;
+ return 0.0;
+ }
+ else if (targetType == typeof(bool))
+ {
+ string lower = value.ToLower();
+ return lower == "true" || lower == "1" || lower == "yes";
+ }
+ else if (targetType == typeof(string))
+ {
+ // ⭐ 이스케이프된 줄바꿈 복원
+ return value.Replace("\\n", "\n");
+ }
+
+ return value;
+ }
+
+ private static string GetAssetName(object so, int lineNumber)
+ {
+ Type type = so.GetType();
+
+ // ⭐ 1순위: id 필드 찾기
+ FieldInfo idField = type.GetField("id", BindingFlags.Public | BindingFlags.Instance);
+ if (idField != null)
+ {
+ var idValue = idField.GetValue(so);
+ if (idValue != null)
+ {
+ // 스키마 이름 추출 (TowersData → Towers, TowerData → Tower)
+ string typeName = type.Name;
+ if (typeName.EndsWith("Data"))
+ {
+ typeName = typeName.Substring(0, typeName.Length - 4);
+ }
+
+ // Tower1, Enemy5 형식
+ return $"{typeName}{idValue:D3}";
+ }
+ }
+
+ // ⭐ 2순위: name 필드 찾기
+ FieldInfo nameField = type.GetField("name", BindingFlags.Public | BindingFlags.Instance);
+ if (nameField != null)
+ {
+ var nameValue = nameField.GetValue(so);
+ if (nameValue != null && !string.IsNullOrWhiteSpace(nameValue.ToString()))
+ {
+ string name = nameValue.ToString();
+ name = name.Replace(" ", "");
+ name = System.Text.RegularExpressions.Regex.Replace(name, @"[^a-zA-Z0-9_가-힣]", "");
+ return name;
+ }
+ }
+
+ // 3순위: 행 번호 사용
+ return $"Data_Row{lineNumber}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Editor/DataImporter/CSVToSOImporter.cs.meta b/Assets/Editor/DataImporter/CSVToSOImporter.cs.meta
new file mode 100644
index 0000000..8d6a1a9
--- /dev/null
+++ b/Assets/Editor/DataImporter/CSVToSOImporter.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 79f372743463a5e4cb3a9b915de9bebe
\ No newline at end of file
diff --git a/Assets/Editor/DataImporter/ImporterWindow.cs b/Assets/Editor/DataImporter/ImporterWindow.cs
new file mode 100644
index 0000000..e77a651
--- /dev/null
+++ b/Assets/Editor/DataImporter/ImporterWindow.cs
@@ -0,0 +1,122 @@
+// Assets/Editor/DataImporter/ImporterWindow.cs
+
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+using System.Linq;
+
+namespace Northbound.Editor
+{
+ public class ImporterWindow : EditorWindow
+ {
+ private Vector2 scrollPosition;
+
+ [MenuItem("Northbound/Data Importer")]
+ public static void ShowWindow()
+ {
+ var window = GetWindow("Data Importer");
+ window.minSize = new Vector2(400, 300);
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Label("CSV → ScriptableObject Importer", EditorStyles.boldLabel);
+ GUILayout.Space(10);
+
+ EditorGUILayout.HelpBox(
+ "GameData 폴더의 CSV 파일을 ScriptableObject로 변환합니다.\n" +
+ "자동 생성된 C# 클래스를 사용합니다.",
+ MessageType.Info
+ );
+
+ GUILayout.Space(10);
+
+ scrollPosition = GUILayout.BeginScrollView(scrollPosition);
+
+ string gameDataPath = Path.Combine(Application.dataPath, "..", "GameData");
+
+ if (!Directory.Exists(gameDataPath))
+ {
+ EditorGUILayout.HelpBox(
+ "GameData 폴더를 찾을 수 없습니다.",
+ MessageType.Warning
+ );
+ }
+ else
+ {
+ var csvFiles = Directory.GetFiles(gameDataPath, "*.csv")
+ .Where(f => !f.Contains("Backups") && !Path.GetFileName(f).StartsWith("."))
+ .ToArray();
+
+ if (csvFiles.Length == 0)
+ {
+ EditorGUILayout.HelpBox(
+ "CSV 파일이 없습니다.\n" +
+ "sync-from-notion.ps1을 먼저 실행하세요.",
+ MessageType.Warning
+ );
+ }
+ else
+ {
+ GUILayout.Label("발견된 CSV 파일:", EditorStyles.boldLabel);
+ GUILayout.Space(5);
+
+ foreach (var filePath in csvFiles)
+ {
+ string fileName = Path.GetFileNameWithoutExtension(filePath);
+
+ GUILayout.BeginHorizontal();
+
+ GUILayout.Label($"📊 {fileName}", GUILayout.Width(200));
+
+ if (GUILayout.Button("Import", GUILayout.Width(100)))
+ {
+ ImportSingle(fileName);
+ }
+
+ GUILayout.EndHorizontal();
+ }
+ }
+ }
+
+ GUILayout.EndScrollView();
+
+ GUILayout.Space(20);
+
+ GUI.backgroundColor = Color.green;
+ if (GUILayout.Button("Import All Data", GUILayout.Height(50)))
+ {
+ if (EditorUtility.DisplayDialog(
+ "전체 데이터 Import",
+ "모든 CSV 파일을 읽어서 ScriptableObject를 생성합니다.\n" +
+ "기존 파일은 덮어씌워집니다.",
+ "Import All",
+ "Cancel"))
+ {
+ CSVToSOImporter.ImportAll();
+ }
+ }
+ GUI.backgroundColor = Color.white;
+
+ GUILayout.Space(10);
+
+ EditorGUILayout.HelpBox(
+ "Import 후 Assets/Data/ScriptableObjects 폴더를 확인하세요.",
+ MessageType.None
+ );
+ }
+
+ private void ImportSingle(string schemaName)
+ {
+ if (EditorUtility.DisplayDialog(
+ $"{schemaName} Import",
+ $"{schemaName}.csv를 읽어서 ScriptableObject를 생성합니다.\n" +
+ "기존 파일은 덮어씌워집니다.",
+ "Import",
+ "Cancel"))
+ {
+ CSVToSOImporter.ImportSchema(schemaName);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Editor/DataImporter/ImporterWindow.cs.meta b/Assets/Editor/DataImporter/ImporterWindow.cs.meta
new file mode 100644
index 0000000..5fc7a11
--- /dev/null
+++ b/Assets/Editor/DataImporter/ImporterWindow.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 017c665c9c855fa43b55f1d61c238903
\ No newline at end of file
diff --git a/DataTools/generate_csharp_classes.py b/DataTools/generate_csharp_classes.py
new file mode 100644
index 0000000..23c1a5a
--- /dev/null
+++ b/DataTools/generate_csharp_classes.py
@@ -0,0 +1,258 @@
+# DataTools/generate_csharp_classes.py
+"""노션 스키마 → Unity C# ScriptableObject 클래스 생성"""
+
+import json
+from pathlib import Path
+from collections import defaultdict
+
+GAMEDATA_DIR = Path(__file__).parent.parent / "GameData"
+UNITY_OUTPUT_DIR = Path(__file__).parent.parent / "Assets" / "Data" / "Scripts" / "DataClasses"
+
+
+def get_csharp_type(field_type):
+ """Python 타입 → C# 타입 변환"""
+ type_map = {
+ 'int': 'int',
+ 'float': 'float',
+ 'number': 'float',
+ 'string': 'string',
+ 'bool': 'bool',
+ 'boolean': 'bool'
+ }
+ return type_map.get(field_type.lower(), 'string')
+
+
+def to_camel_case(snake_str):
+ """
+ snake_case → camelCase
+
+ 예시:
+ - tower_type → towerType
+ - damage → damage
+ - attack_speed → attackSpeed
+ """
+ components = snake_str.split('_')
+ return components[0] + ''.join(x.title() for x in components[1:])
+
+
+def to_pascal_case(snake_str):
+ """
+ snake_case → PascalCase
+
+ 예시:
+ - tower_type → TowerType
+ - damage → Damage
+ """
+ return ''.join(x.title() for x in snake_str.split('_'))
+
+
+def group_fields_by_condition(schema):
+ """
+ 필드를 조건별로 그룹화
+
+ 반환:
+ {
+ 'common': [공통 필드들],
+ 'attack': [attack 타입 필드들],
+ 'defense': [defense 타입 필드들],
+ ...
+ }
+ """
+ groups = defaultdict(list)
+
+ for field in schema:
+ if field.get('condition'):
+ condition_value = field['condition']['value']
+ groups[condition_value].append(field)
+ else:
+ groups['common'].append(field)
+
+ return groups
+
+
+def generate_class(schema_name, schema):
+ """
+ 스키마 → C# 클래스 코드 생성
+
+ schema: [
+ {'name': 'id', 'type': 'int', 'condition': None, 'description': '...'},
+ {'name': 'damage', 'type': 'float', 'condition': {...}, 'description': '...'},
+ ...
+ ]
+ """
+ class_name = schema_name + "Data"
+
+ # 필드 그룹화
+ field_groups = group_fields_by_condition(schema)
+
+ # 조건 필드명 찾기 (예: tower_type, enemy_type)
+ condition_field = None
+ for field in schema:
+ if field.get('condition'):
+ condition_field = field['condition']['field']
+ break
+
+ # C# 코드 생성 시작
+ lines = []
+
+ # 파일 헤더
+ lines.append("// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!")
+ lines.append("// 생성 스크립트: DataTools/generate_csharp_classes.py")
+ lines.append("")
+ lines.append("using UnityEngine;")
+ lines.append("")
+ lines.append("namespace DigAndDefend.Data")
+ lines.append("{")
+ lines.append(f' [CreateAssetMenu(fileName = "{class_name}", menuName = "DigAndDefend/{schema_name} Data")]')
+ lines.append(f" public class {class_name} : ScriptableObject")
+ lines.append(" {")
+
+ # 공통 필드
+ if 'common' in field_groups and field_groups['common']:
+ lines.append(" [Header(\"기본 정보\")]")
+ for field in field_groups['common']:
+ add_field(lines, field, nullable=False)
+ lines.append("")
+
+ # 조건부 필드 (그룹별)
+ for condition_value, fields in field_groups.items():
+ if condition_value == 'common':
+ continue
+
+ header_name = condition_value.capitalize()
+ lines.append(f" [Header(\"{header_name} 전용\")]")
+
+ for field in fields:
+ add_field(lines, field, nullable=True)
+
+ lines.append("")
+
+ # 유틸리티 메서드
+ if condition_field:
+ lines.append(" // ===== 유틸리티 메서드 =====")
+ lines.append("")
+
+ # 타입 체크 프로퍼티
+ for condition_value in field_groups.keys():
+ if condition_value == 'common':
+ continue
+
+ property_name = f"Is{to_pascal_case(condition_value)}"
+ field_name = to_camel_case(condition_field)
+
+ lines.append(f' public bool {property_name} => {field_name} == "{condition_value}";')
+
+ lines.append("")
+
+ # Nullable 필드 Getter 메서드
+ for condition_value, fields in field_groups.items():
+ if condition_value == 'common':
+ continue
+
+ for field in fields:
+ field_name = to_camel_case(field['name'])
+ method_name = f"Get{to_pascal_case(field['name'])}"
+ field_type = get_csharp_type(field['type'])
+
+ # 기본값 결정
+ if field_type == 'int':
+ default_value = '0'
+ elif field_type == 'float':
+ default_value = '0f'
+ elif field_type == 'bool':
+ default_value = 'false'
+ else:
+ default_value = '""'
+
+ lines.append(f" public {field_type} {method_name}() => {field_name} ?? {default_value};")
+
+ # 클래스 종료
+ lines.append(" }")
+ lines.append("}")
+
+ return "\n".join(lines)
+
+
+def add_field(lines, field, nullable=False):
+ """필드 정의 추가"""
+ field_name = to_camel_case(field['name'])
+ field_type = get_csharp_type(field['type'])
+
+ # 주석 (설명이 있으면)
+ if field.get('description'):
+ # 줄바꿈을 공백으로 변환 (C# 주석은 한 줄)
+ description = field['description'].replace('\\n', ' ').replace('\n', ' ')
+ lines.append(f" /// {description}")
+
+ # 필드 선언
+ if nullable:
+ lines.append(f" public {field_type}? {field_name};")
+ else:
+ lines.append(f" public {field_type} {field_name};")
+
+
+def generate_all_classes():
+ """모든 스키마에 대해 C# 클래스 생성"""
+
+ # 출력 폴더 생성
+ UNITY_OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
+
+ # 스키마 파일 찾기
+ schema_files = list(GAMEDATA_DIR.glob(".*_schema.json"))
+
+ if not schema_files:
+ print("⚠️ 스키마 파일을 찾을 수 없습니다.")
+ print("💡 먼저 sync_from_notion.py를 실행하세요.")
+ return
+
+ print("=" * 60)
+ print("🔧 C# 클래스 자동 생성")
+ print("=" * 60)
+ print()
+
+ generated_count = 0
+
+ for schema_file in schema_files:
+ # ".Towers_schema.json" → "Towers"
+ schema_name = schema_file.stem.replace("_schema", "").lstrip(".")
+
+ print(f"📋 {schema_name} 처리 중...")
+
+ # 스키마 로드
+ try:
+ with open(schema_file, 'r', encoding='utf-8') as f:
+ schema = json.load(f)
+ except Exception as e:
+ print(f" ❌ 스키마 로드 실패: {e}")
+ continue
+
+ # C# 코드 생성
+ try:
+ csharp_code = generate_class(schema_name, schema)
+ except Exception as e:
+ print(f" ❌ 코드 생성 실패: {e}")
+ import traceback
+ traceback.print_exc()
+ continue
+
+ # 파일 저장
+ output_file = UNITY_OUTPUT_DIR / f"{schema_name}Data.cs"
+ try:
+ with open(output_file, 'w', encoding='utf-8') as f:
+ f.write(csharp_code)
+
+ print(f" ✅ 생성: {schema_name}Data.cs ({len(schema)}개 필드)")
+ generated_count += 1
+
+ except Exception as e:
+ print(f" ❌ 파일 저장 실패: {e}")
+
+ print()
+ print("=" * 60)
+ print(f"🎉 완료: {generated_count}개 클래스 생성")
+ print(f"📂 위치: {UNITY_OUTPUT_DIR}")
+ print("=" * 60)
+
+
+if __name__ == "__main__":
+ generate_all_classes()
\ No newline at end of file
diff --git a/DataTools/sync_from_notion.py b/DataTools/sync_from_notion.py
new file mode 100644
index 0000000..fbe2e2a
--- /dev/null
+++ b/DataTools/sync_from_notion.py
@@ -0,0 +1,475 @@
+# DataTools/sync_from_notion.py
+"""노션 스키마 → CSV 동기화 (자동 발견)"""
+
+import os
+import re
+import pandas as pd
+from notion_client import Client
+from pathlib import Path
+from datetime import datetime
+
+# ===== 설정 =====
+NOTION_API_KEY = "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"
+notion = Client(auth=NOTION_API_KEY) if NOTION_API_KEY else None
+
+# ⭐ 부모 페이지 ID만 설정 (1회)
+SCHEMA_PARENT_PAGE_ID = "2f194d45b1a380948073ca3883f7347e"
+
+SCRIPT_DIR = Path(__file__).parent
+GAMEDATA_DIR = SCRIPT_DIR.parent / "GameData"
+BACKUP_DIR = GAMEDATA_DIR / "Backups"
+BACKUP_DIR.mkdir(exist_ok=True)
+
+
+# ===== 유틸리티 함수 =====
+
+def clean_page_title(title):
+ """
+ 노션 페이지 제목 → 스키마 이름 변환
+
+ 규칙:
+ 1. 이모지, 특수문자 제거
+ 2. "스키마", "Schema" 제거
+ 3. 공백 제거
+
+ 예시:
+ - "🏰 타워 스키마" → "타워"
+ - "Tower Schema" → "Tower"
+ - "Enemies" → "Enemies"
+ """
+ # 1. 이모지 및 특수문자 제거
+ cleaned = re.sub(r'[^\w\s가-힣]', '', title).strip()
+
+ # 2. "스키마", "Schema" 제거
+ cleaned = re.sub(r'\s*(스키마|Schema)\s*', '', cleaned, flags=re.IGNORECASE).strip()
+
+ # 3. 공백 제거
+ cleaned = cleaned.replace(' ', '')
+
+ # 4. 비어있으면 원본 반환
+ if not cleaned:
+ return title.replace(' ', '')
+
+ return cleaned
+
+
+def discover_schema_pages(parent_id=None, depth=0, max_depth=3):
+ """
+ 부모 페이지의 하위 페이지들을 재귀적으로 탐색하여 스키마 발견
+
+ Args:
+ parent_id: 탐색할 부모 페이지 ID (None이면 SCHEMA_PARENT_PAGE_ID 사용)
+ depth: 현재 깊이 (0부터 시작)
+ max_depth: 최대 탐색 깊이 (기본 3단계)
+
+ 반환:
+ {
+ "타워": "page_id_1",
+ "적유닛": "page_id_2",
+ ...
+ }
+ """
+ if not notion:
+ raise ValueError("Notion API 클라이언트가 초기화되지 않았습니다.")
+
+ if parent_id is None:
+ if not SCHEMA_PARENT_PAGE_ID or SCHEMA_PARENT_PAGE_ID == "노션_데이터_스키마_정의_페이지_ID":
+ raise ValueError(
+ "SCHEMA_PARENT_PAGE_ID가 설정되지 않았습니다.\n"
+ "sync_from_notion.py 파일에서 부모 페이지 ID를 설정하세요."
+ )
+ parent_id = SCHEMA_PARENT_PAGE_ID
+
+ # 최대 깊이 체크
+ if depth > max_depth:
+ return {}
+
+ indent = " " * depth
+
+ if depth == 0:
+ print("🔍 스키마 페이지 자동 발견 중...")
+
+ try:
+ # 부모 페이지의 자식 블록 가져오기
+ children = notion.blocks.children.list(block_id=parent_id)
+
+ schemas = {}
+
+ for block in children['results']:
+ if block['type'] == 'child_page':
+ page_id = block['id']
+ page_title = block['child_page']['title']
+
+ # 제목 정리
+ schema_name = clean_page_title(page_title)
+
+ print(f"{indent}📋 발견: '{page_title}'", end="")
+
+ # 이 페이지에 테이블이 있는지 확인
+ has_table = check_page_has_table(page_id)
+
+ if has_table:
+ # 테이블이 있으면 스키마로 등록
+ schemas[schema_name] = page_id
+ print(f" → {schema_name} ✅")
+ else:
+ # 테이블이 없으면 하위 페이지 탐색
+ print(f" (폴더)")
+ child_schemas = discover_schema_pages(page_id, depth + 1, max_depth)
+ schemas.update(child_schemas)
+
+ if depth == 0 and not schemas:
+ print(" ⚠️ 하위 페이지를 찾을 수 없습니다.")
+ print(f" 💡 노션에서 부모 페이지 하위에 스키마 페이지를 추가하세요.")
+
+ return schemas
+
+ except Exception as e:
+ print(f"{indent}❌ 탐색 실패: {e}")
+ import traceback
+ traceback.print_exc()
+ return {}
+
+
+def check_page_has_table(page_id):
+ """
+ 페이지에 테이블 블록이 있는지 확인
+
+ Args:
+ page_id: 확인할 페이지 ID
+
+ 반환:
+ True: 테이블 있음
+ False: 테이블 없음
+ """
+ try:
+ blocks_response = notion.blocks.children.list(block_id=page_id)
+ blocks = blocks_response.get('results', [])
+
+ for block in blocks:
+ if block.get('type') == 'table':
+ return True
+
+ return False
+
+ except Exception as e:
+ # 에러 발생 시 테이블 없음으로 간주
+ return False
+
+def parse_condition(condition_str):
+ """
+ 사용 조건 파싱
+
+ 빈 문자열 → None (항상 사용)
+ "tower_type=attack" → {'field': 'tower_type', 'op': '=', 'value': 'attack'}
+ """
+ if not condition_str or condition_str.strip() == "":
+ return None
+
+ condition_str = condition_str.strip()
+
+ # 단순 조건: "tower_type=attack"
+ match = re.match(r'(\w+)\s*(=|!=|>|<|>=|<=)\s*(.+)', condition_str)
+ if match:
+ return {
+ 'field': match.group(1),
+ 'op': match.group(2),
+ 'value': match.group(3).strip()
+ }
+
+ return None
+
+
+def parse_notion_table(page_id):
+ """노션 테이블 파싱"""
+
+ if not notion:
+ raise ValueError("Notion API 클라이언트가 초기화되지 않았습니다.")
+
+ try:
+ # 1. 블록 가져오기
+ blocks_response = notion.blocks.children.list(block_id=page_id)
+ blocks = blocks_response.get('results', [])
+
+ # 2. 테이블 찾기
+ table_block = None
+ for block in blocks:
+ if block.get('type') == 'table':
+ table_block = block
+ break
+
+ if not table_block:
+ raise ValueError(f"테이블을 찾을 수 없습니다.")
+
+ print(f" 📋 테이블 발견")
+
+ # 3. 행 가져오기
+ table_id = table_block['id']
+ rows_response = notion.blocks.children.list(block_id=table_id)
+ rows = rows_response.get('results', [])
+
+ if len(rows) < 2:
+ raise ValueError("테이블에 데이터가 없습니다.")
+
+ # 4. 파싱
+ schema = []
+
+ def extract_text(cell, preserve_newlines=False):
+ """
+ 셀에서 텍스트 추출
+
+ Args:
+ cell: 노션 셀 데이터
+ preserve_newlines: True면 줄바꿈 보존, False면 공백으로 변환
+ """
+ if not cell or len(cell) == 0:
+ return ""
+
+ text_parts = []
+ for content in cell:
+ if content.get('type') == 'text':
+ text_content = content.get('text', {}).get('content', '')
+ text_parts.append(text_content)
+
+ if preserve_newlines:
+ # 줄바꿈 보존 (\\n으로 이스케이프)
+ result = ''.join(text_parts)
+ # CSV에서 안전하게 저장하기 위해 실제 줄바꿈을 \\n으로 변환
+ result = result.replace('\n', '\\n')
+ return result.strip()
+ else:
+ # 줄바꿈을 공백으로 변환
+ return ''.join(text_parts).strip()
+
+ for row_idx, row in enumerate(rows[1:], start=2):
+ if row.get('type') != 'table_row':
+ continue
+
+ cells = row['table_row']['cells']
+
+ # 4개 컬럼: 필드명, 타입, 사용 조건, 설명
+ field_name = extract_text(cells[0]) if len(cells) > 0 else ""
+ field_type = extract_text(cells[1]) if len(cells) > 1 else "string"
+ condition_str = extract_text(cells[2]) if len(cells) > 2 else ""
+ # ⭐ 설명 컬럼만 줄바꿈 보존
+ description = extract_text(cells[3], preserve_newlines=True) if len(cells) > 3 else ""
+
+ if not field_name:
+ continue
+
+ # 조건 파싱
+ condition = parse_condition(condition_str)
+
+ if condition:
+ print(f" 📌 {field_name}: {condition['field']}={condition['value']}일 때 사용")
+
+ schema.append({
+ 'name': field_name,
+ 'type': field_type.lower(),
+ 'condition': condition,
+ 'description': description
+ })
+
+ if len(schema) == 0:
+ raise ValueError("파싱된 스키마가 비어있습니다.")
+
+ return schema
+
+ except Exception as e:
+ print(f" ❌ 파싱 오류: {e}")
+ raise
+
+
+def get_default_value(field_type, has_condition):
+ """
+ 기본값 결정
+
+ 조건부 필드 → None (빈 칸)
+ 공통 필드 → 타입별 기본값
+ """
+ # 조건부 필드는 빈 칸
+ if has_condition:
+ return None
+
+ # 공통 필드는 타입별 기본값
+ if field_type == "int":
+ return 0
+ elif field_type in ["float", "number"]:
+ return 0.0
+ elif field_type in ["bool", "boolean"]:
+ return False
+ elif field_type == "string":
+ return ""
+ else:
+ return None
+
+
+def merge_schema_and_data(schema, existing_data):
+ """스키마와 데이터 병합"""
+
+ schema_columns = [f['name'] for f in schema]
+
+ if existing_data is None or existing_data.empty:
+ print(" 새 파일 생성")
+ example_row = {}
+ for field in schema:
+ has_condition = field.get('condition') is not None
+ example_row[field['name']] = get_default_value(field['type'], has_condition)
+ return pd.DataFrame([example_row])
+
+ print(f" 기존 데이터: {len(existing_data)}행")
+ new_df = pd.DataFrame()
+
+ for field in schema:
+ col_name = field['name']
+ if col_name in existing_data.columns:
+ print(f" ✓ {col_name}: 유지")
+ new_df[col_name] = existing_data[col_name]
+ else:
+ has_condition = field.get('condition') is not None
+ default_val = get_default_value(field['type'], has_condition)
+
+ if default_val is None:
+ print(f" + {col_name}: 추가 (조건부 필드, 빈 칸)")
+ else:
+ print(f" + {col_name}: 추가 (기본값: {default_val})")
+
+ new_df[col_name] = default_val
+
+ return new_df
+
+
+def sync_single_schema(data_name, page_id):
+ """단일 스키마 동기화 (CSV 버전)"""
+ print(f"\n{'='*60}")
+ print(f"📋 {data_name} 동기화")
+ print(f"{'='*60}")
+
+ try:
+ # 1. 스키마 읽기
+ print("1️⃣ 스키마 읽기...")
+ schema = parse_notion_table(page_id)
+ print(f" ✅ {len(schema)}개 필드")
+
+ # 2. 스키마를 JSON으로 저장 (검증용)
+ import json
+ schema_json_path = GAMEDATA_DIR / f".{data_name}_schema.json"
+ with open(schema_json_path, 'w', encoding='utf-8') as f:
+ json.dump(schema, f, ensure_ascii=False, indent=2)
+ print(f" 💾 스키마 저장: {schema_json_path.name}")
+
+ # 3. 기존 파일 확인
+ csv_path = GAMEDATA_DIR / f"{data_name}.csv"
+ print(f"\n2️⃣ 기존 파일: {csv_path}")
+
+ existing_data = None
+ if csv_path.exists():
+ # 백업
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ backup_path = BACKUP_DIR / f"{data_name}_{timestamp}.csv"
+ import shutil
+ shutil.copy2(csv_path, backup_path)
+ print(f" 💾 백업: {backup_path.name}")
+
+ existing_data = pd.read_csv(csv_path)
+
+ # 4. 병합
+ print(f"\n3️⃣ 병합 중...")
+ merged_df = merge_schema_and_data(schema, existing_data)
+
+ # 5. 저장 (CSV)
+ print(f"\n4️⃣ 저장...")
+ merged_df.to_csv(csv_path, index=False, encoding='utf-8-sig')
+ print(f" ✅ 완료: {csv_path}")
+
+ return True
+
+ except Exception as e:
+ print(f"\n❌ 오류: {e}")
+ import traceback
+ traceback.print_exc()
+ return False
+
+
+def main():
+ print("=" * 60)
+ print("🔄 Notion → CSV 동기화 (자동 발견)")
+ print("=" * 60)
+ print()
+
+ if not NOTION_API_KEY:
+ print("❌ NOTION_API_KEY 환경변수가 없습니다")
+ print("💡 설정 방법:")
+ print(' $env:NOTION_API_KEY = "your_key"')
+ return
+
+ print(f"📂 데이터 폴더: {GAMEDATA_DIR}")
+ print(f"💾 백업 폴더: {BACKUP_DIR}")
+ print()
+
+ # ⭐ 스키마 자동 발견
+ try:
+ SCHEMA_PAGE_IDS = discover_schema_pages()
+ except Exception as e:
+ print(f"\n❌ 스키마 발견 실패: {e}")
+ return
+
+ if not SCHEMA_PAGE_IDS:
+ print("\n❌ 발견된 스키마 페이지가 없습니다.")
+ return
+
+ print()
+ print("=" * 60)
+ print("동기화할 스키마를 선택하세요:")
+
+ schemas = list(SCHEMA_PAGE_IDS.keys())
+ for idx, name in enumerate(schemas, 1):
+ print(f" {idx}. {name}")
+ print(f" {len(schemas) + 1}. 전체")
+ print()
+
+ try:
+ choice = input("선택 (번호 입력): ").strip()
+
+ if choice == str(len(schemas) + 1):
+ selected = schemas
+ else:
+ idx = int(choice) - 1
+ if 0 <= idx < len(schemas):
+ selected = [schemas[idx]]
+ else:
+ print("❌ 잘못된 선택입니다.")
+ return
+
+ except (ValueError, KeyboardInterrupt):
+ print("\n⚠️ 취소되었습니다.")
+ return
+
+ # 동기화 실행
+ print()
+ success_count = 0
+
+ for schema_name in selected:
+ page_id = SCHEMA_PAGE_IDS[schema_name]
+
+ if sync_single_schema(schema_name, page_id):
+ success_count += 1
+
+ # 최종 결과
+ print()
+ print("=" * 60)
+ print(f"✅ 완료: {success_count}/{len(selected)} 성공")
+ print("=" * 60)
+
+ if success_count > 0:
+ print()
+ print("💡 다음 단계:")
+ print(" 1. GameData 폴더에서 CSV 파일 확인")
+ print(" 2. 데이터 수정")
+ print(" 3. Git 커밋:")
+ print(" git add GameData/*.csv")
+ print(' git commit -m "Update data from Notion"')
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/DataTools/validate_data.py b/DataTools/validate_data.py
new file mode 100644
index 0000000..3c603f7
--- /dev/null
+++ b/DataTools/validate_data.py
@@ -0,0 +1,153 @@
+# DataTools/validate_data.py
+"""CSV 데이터 검증 (조건부 필드 지원)"""
+
+import pandas as pd
+import sys
+import json
+from pathlib import Path
+
+GAMEDATA_DIR = Path(__file__).parent.parent / "GameData"
+
+
+def load_schema(data_name):
+ """저장된 스키마 JSON 로드"""
+ schema_path = GAMEDATA_DIR / f".{data_name}_schema.json"
+
+ if not schema_path.exists():
+ return None
+
+ with open(schema_path, 'r', encoding='utf-8') as f:
+ return json.load(f)
+
+
+def check_condition(row, condition):
+ """
+ 조건 확인
+
+ condition: {
+ 'field': 'tower_type',
+ 'op': '=',
+ 'value': 'attack'
+ }
+ """
+ if not condition:
+ return True # 조건 없으면 항상 참
+
+ field = condition['field']
+ op = condition['op']
+ expected = condition['value']
+
+ if field not in row or pd.isna(row[field]):
+ return False
+
+ actual = str(row[field])
+
+ if op == '=':
+ return actual == expected
+ elif op == '!=':
+ return actual != expected
+ elif op == '>':
+ try:
+ return float(row[field]) > float(expected)
+ except:
+ return False
+ elif op == '<':
+ try:
+ return float(row[field]) < float(expected)
+ except:
+ return False
+ elif op == '>=':
+ try:
+ return float(row[field]) >= float(expected)
+ except:
+ return False
+ elif op == '<=':
+ try:
+ return float(row[field]) <= float(expected)
+ except:
+ return False
+
+ return False
+
+
+def validate_file(file_path, schema):
+ """파일 검증 (CSV 버전)"""
+ try:
+ df = pd.read_csv(file_path)
+ errors = []
+
+ if len(df) == 0:
+ errors.append("데이터가 없습니다")
+ return errors
+
+ # 조건부 필드 검증
+ if schema:
+ for field in schema:
+ condition = field.get('condition')
+
+ if not condition:
+ continue # 공통 필드는 스킵
+
+ field_name = field['name']
+
+ # 각 행 검사
+ for idx, row in df.iterrows():
+ should_have_value = check_condition(row, condition)
+ has_value = not pd.isna(row.get(field_name))
+
+ if should_have_value and not has_value:
+ cond_desc = f"{condition['field']}{condition['op']}{condition['value']}"
+ errors.append(
+ f"행 {idx+2}: '{field_name}' 필드가 비어있습니다 "
+ f"(조건: {cond_desc})"
+ )
+
+ return errors
+
+ except Exception as e:
+ return [f"파일 읽기 오류: {e}"]
+
+
+def main():
+ print("🔍 CSV 데이터 검증 중...\n")
+
+ all_valid = True
+ csv_files = list(GAMEDATA_DIR.glob("*.csv"))
+
+ if not csv_files:
+ print("⚠️ 검증할 CSV 파일이 없습니다")
+ return
+
+ for csv_path in csv_files:
+ data_name = csv_path.stem
+
+ # 숨김 파일 스킵
+ if data_name.startswith("."):
+ continue
+
+ print(f"📊 {data_name}.csv 검증...")
+
+ schema = load_schema(data_name)
+ errors = validate_file(csv_path, schema)
+
+ if errors:
+ print(f"❌ 실패:")
+ for err in errors:
+ print(f" - {err}")
+ all_valid = False
+ else:
+ row_count = len(pd.read_csv(csv_path))
+ print(f"✅ 통과 ({row_count}개 행)")
+
+ print()
+
+ if all_valid:
+ print("🎉 모든 데이터 검증 통과!")
+ else:
+ print("❌ 검증 실패한 파일이 있습니다")
+
+ sys.exit(0 if all_valid else 1)
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/Northbound.slnx b/Northbound.slnx
index 20919c7..d629b17 100644
--- a/Northbound.slnx
+++ b/Northbound.slnx
@@ -1,3 +1,4 @@
+
diff --git a/git-hooks/pre-commit b/git-hooks/pre-commit
new file mode 100644
index 0000000..116aa87
--- /dev/null
+++ b/git-hooks/pre-commit
@@ -0,0 +1,6 @@
+#!/bin/sh
+# git-hooks/pre-commit
+# Git이 실행하는 파일 (확장자 없음, sh 헤더 필요)
+
+powershell.exe -ExecutionPolicy Bypass -File "./git-hooks/pre-commit.ps1"
+exit $?
\ No newline at end of file
diff --git a/git-hooks/pre-commit.ps1 b/git-hooks/pre-commit.ps1
new file mode 100644
index 0000000..56dd9be
--- /dev/null
+++ b/git-hooks/pre-commit.ps1
@@ -0,0 +1,49 @@
+# git-hooks/pre-commit.ps1
+
+Write-Host "🔍 Pre-commit: Validating game data..." -ForegroundColor Cyan
+
+# 변경된 CSV 파일 확인
+$changedFiles = git diff --cached --name-only --diff-filter=ACM
+$CSVFiles = $changedFiles | Where-Object { $_ -match "GameData/.*\.csv$" }
+
+if ($CSVFiles.Count -eq 0) {
+ Write-Host "ℹ️ 변경된 CSV 파일이 없습니다." -ForegroundColor Gray
+ exit 0
+}
+
+Write-Host "📊 검증할 파일:" -ForegroundColor Yellow
+$CSVFiles | ForEach-Object { Write-Host " - $_" }
+Write-Host ""
+
+# Python 설치 확인
+$pythonCmd = Get-Command python -ErrorAction SilentlyContinue
+if (-not $pythonCmd) {
+ Write-Host "❌ Python이 설치되어 있지 않습니다." -ForegroundColor Red
+ Write-Host "💡 https://www.python.org/downloads/ 에서 Python을 설치하세요." -ForegroundColor Yellow
+ exit 1
+}
+
+# 검증 스크립트 실행
+Push-Location DataTools
+
+try {
+ python validate_data.py
+ $exitCode = $LASTEXITCODE
+
+ Pop-Location
+
+ if ($exitCode -ne 0) {
+ Write-Host ""
+ Write-Host "❌ 데이터 검증 실패!" -ForegroundColor Red
+ Write-Host "💡 CSV 파일을 수정 후 다시 커밋해주세요." -ForegroundColor Yellow
+ exit 1
+ }
+
+ Write-Host "✅ 데이터 검증 통과!" -ForegroundColor Green
+ exit 0
+}
+catch {
+ Pop-Location
+ Write-Host "❌ 검증 중 오류 발생: $_" -ForegroundColor Red
+ exit 1
+}
\ No newline at end of file
diff --git a/setup-hooks.ps1 b/setup-hooks.ps1
new file mode 100644
index 0000000..d4d906d
--- /dev/null
+++ b/setup-hooks.ps1
@@ -0,0 +1,27 @@
+# setup-hooks.ps1
+
+Write-Host "🔧 Setting up Git hooks..." -ForegroundColor Cyan
+Write-Host ""
+
+# .git/hooks 디렉토리 존재 확인
+if (-not (Test-Path ".git\hooks")) {
+ Write-Host "❌ .git\hooks 디렉토리를 찾을 수 없습니다." -ForegroundColor Red
+ Write-Host "💡 Git 저장소 루트에서 실행하세요." -ForegroundColor Yellow
+ exit 1
+}
+
+# hooks 복사
+Write-Host "📋 Copying hook files..." -ForegroundColor Yellow
+
+try {
+ Copy-Item -Path "git-hooks\pre-commit" -Destination ".git\hooks\pre-commit" -Force
+
+ Write-Host "✅ Git hooks installed!" -ForegroundColor Green
+ Write-Host ""
+ Write-Host "Installed hooks:" -ForegroundColor Cyan
+ Write-Host " - pre-commit: XLSX 데이터 검증" -ForegroundColor White
+}
+catch {
+ Write-Host "❌ Hook 파일 복사 실패: $_" -ForegroundColor Red
+ exit 1
+}
\ No newline at end of file
diff --git a/sync-from-notion.ps1 b/sync-from-notion.ps1
new file mode 100644
index 0000000..8020853
--- /dev/null
+++ b/sync-from-notion.ps1
@@ -0,0 +1,91 @@
+# sync-from-notion.ps1
+
+Write-Host "============================================================" -ForegroundColor Cyan
+Write-Host "🔄 Notion → Excel → C# 클래스 통합 동기화" -ForegroundColor Cyan
+Write-Host "============================================================" -ForegroundColor Cyan
+Write-Host ""
+
+# Python 확인
+if (-not (Get-Command python -ErrorAction SilentlyContinue)) {
+ Write-Host "❌ Python이 설치되어 있지 않습니다." -ForegroundColor Red
+ Write-Host "https://www.python.org 에서 설치해주세요." -ForegroundColor Yellow
+ Write-Host ""
+ pause
+ exit 1
+}
+
+# ===== 1. 노션 → Excel =====
+Write-Host "1️⃣ 노션 스키마 → Excel 동기화..." -ForegroundColor Yellow
+Write-Host ""
+
+Push-Location DataTools
+
+try {
+ python sync_from_notion.py
+ $exitCode1 = $LASTEXITCODE
+}
+catch {
+ Write-Host "❌ 실행 중 오류: $_" -ForegroundColor Red
+ $exitCode1 = 1
+}
+finally {
+ Pop-Location
+}
+
+if ($exitCode1 -ne 0) {
+ Write-Host ""
+ Write-Host "❌ Excel 동기화 실패!" -ForegroundColor Red
+ Write-Host ""
+ pause
+ exit 1
+}
+
+Write-Host ""
+Write-Host "✅ Excel 동기화 완료" -ForegroundColor Green
+Write-Host ""
+
+# ===== 2. C# 클래스 생성 =====
+Write-Host "2️⃣ C# 클래스 자동 생성..." -ForegroundColor Yellow
+Write-Host ""
+
+Push-Location DataTools
+
+try {
+ python generate_csharp_classes.py
+ $exitCode2 = $LASTEXITCODE
+}
+catch {
+ Write-Host "❌ 실행 중 오류: $_" -ForegroundColor Red
+ $exitCode2 = 1
+}
+finally {
+ Pop-Location
+}
+
+if ($exitCode2 -ne 0) {
+ Write-Host ""
+ Write-Host "❌ C# 클래스 생성 실패!" -ForegroundColor Red
+ Write-Host ""
+ pause
+ exit 1
+}
+
+Write-Host ""
+Write-Host "✅ C# 클래스 생성 완료" -ForegroundColor Green
+Write-Host ""
+
+# ===== 완료 =====
+Write-Host "============================================================" -ForegroundColor Green
+Write-Host "🎉 모든 작업 완료!" -ForegroundColor Green
+Write-Host "============================================================" -ForegroundColor Green
+Write-Host ""
+
+Write-Host "📋 다음 단계:" -ForegroundColor Cyan
+Write-Host " 1. GameData 폴더에서 Excel 파일 확인" -ForegroundColor White
+Write-Host " 2. Excel에서 데이터 수정" -ForegroundColor White
+Write-Host " 3. Unity 열기" -ForegroundColor White
+Write-Host " 4. Northbound → Data Importer 실행" -ForegroundColor White
+Write-Host " 5. ScriptableObject 생성 확인" -ForegroundColor White
+Write-Host ""
+
+pause
\ No newline at end of file