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