From ebf95c3b0c8e9011dca54bebecf7e9a4ff91859f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Tue, 11 Mar 2025 21:03:30 +0800 Subject: [PATCH] modify --- Client/Assets/Art/Atlas/bg.spriteatlas | 2 +- Client/Assets/Art/Atlas/icon.spriteatlas | 2 +- .../Assets/Resources/AppBuilderSetting.bytes | 1 + .../AppBuilderSetting.bytes.meta} | 2 +- .../yoo.meta} | 2 +- .../yoo/DefaultPackage.meta} | 2 +- .../yoo/DefaultPackage/BuildinCatalog.asset | 39 + .../DefaultPackage/BuildinCatalog.asset.meta} | 6 +- Client/Assets/Scenes/Main.unity | 4 + Client/Assets/Scripts/Editor.meta | 3 - .../Editor/Alicizax.Editor.Entension.asmdef | 24 - .../Alicizax.Editor.Entension.asmdef.meta | 7 - Client/Assets/Scripts/Editor/Base.meta | 3 - .../Scripts/Editor/Base/EditorToolBase.cs | 16 - .../Editor/Base/EditorToolBase.cs.meta | 3 - .../Base/EditorToolFunctionAttribute.cs | 92 --- .../Base/EditorToolFunctionAttribute.cs.meta | 3 - Client/Assets/Scripts/Editor/Build.meta | 3 - .../Build/{BuildWindow.meta => BuildCLI.meta} | 0 .../Build/BuildWindow/AdvancedBuildWindow.cs | 63 -- .../BuildWindow/AdvancedBuildWindow.cs.meta | 3 - .../Editor/Build/BuildWindow/AppBuildTab.cs | 98 --- .../Build/BuildWindow/AppBuildTab.cs.meta | 3 - .../Build/BuildWindow/AssetBundleBuildTab.cs | 241 ------ .../BuildWindow/AssetBundleBuildTab.cs.meta | 3 - .../Build/BuildWindow/EditorWindowTabBase.cs | 34 - .../BuildWindow/EditorWindowTabBase.cs.meta | 3 - Client/Assets/Scripts/Editor/EditorIcons.cs | 746 ------------------ .../Assets/Scripts/Editor/EditorIcons.cs.meta | 11 - .../Scripts/Editor/Postprocessor/Atlas.meta | 3 - .../Postprocessor/Atlas/AtlasConfiguration.cs | 24 - .../Atlas/AtlasConfiguration.cs.meta | 3 - .../Postprocessor/Atlas/AtlasEditorWindow.cs | 76 -- .../Atlas/AtlasEditorWindow.cs.meta | 3 - .../Postprocessor/Atlas/AtlasPostprocessor.cs | 37 - .../Atlas/AtlasPostprocessor.cs.meta | 3 - .../Postprocessor/Atlas/AtlasProcessor.cs | 210 ----- .../Atlas/AtlasProcessor.cs.meta | 3 - .../Postprocessor/SpritePostprocessor.cs | 549 ------------- .../Postprocessor/SpritePostprocessor.cs.meta | 11 - .../Editor/ToolBar/BuildSettingWindow.cs | 25 - .../Editor/ToolBar/BuildSettingWindow.cs.meta | 3 - .../Editor/ToolBar/EditorQuickToolBar.cs | 62 -- .../Editor/ToolBar/EditorQuickToolBar.cs.meta | 3 - .../ToolBar/ResourceModeDropdownField.cs | 65 -- .../ToolBar/ResourceModeDropdownField.cs.meta | 3 - .../Editor/ToolBar/SwitchSceneToolBar.cs | 101 --- .../Editor/ToolBar/SwitchSceneToolBar.cs.meta | 3 - .../ProcedureGetAppVersionInfoState.cs | 3 +- .../Scripts/Startup/Unity.Startup.asmdef | 1 - Client/Assets/Settings/PC_RPAsset.asset | 2 +- Client/Assets/Settings/PC_Renderer.asset | 30 +- Client/Assets/Settings/PC_Renderer.asset.meta | 2 +- ...niversalRenderPipelineGlobalSettings.asset | 51 +- Client/Assets/StreamingAssets.meta | 8 - Client/Assets/Test.meta | 8 - Client/Assets/Test/GameBase.dll.bytes | Bin 4608 -> 0 bytes Client/Assets/Test/GameBase.pdb.bytes | Bin 20136 -> 0 bytes Client/Assets/Test/GameBase.pdb.bytes.meta | 7 - Client/Assets/Test/GameLib.dll.bytes | Bin 4608 -> 0 bytes Client/Assets/Test/GameLib.dll.bytes.meta | 7 - Client/Assets/Test/GameLib.pdb.bytes | Bin 20048 -> 0 bytes Client/Assets/Test/GameLib.pdb.bytes.meta | 7 - Client/Assets/Test/GameLogic.dll.bytes | Bin 11264 -> 0 bytes Client/Assets/Test/GameLogic.dll.bytes.meta | 7 - Client/Assets/Test/GameLogic.pdb.bytes | Bin 23036 -> 0 bytes Client/Assets/Test/GameLogic.pdb.bytes.meta | 7 - Client/Assets/Test/GameProto.dll.bytes | Bin 24064 -> 0 bytes Client/Assets/Test/GameProto.dll.bytes.meta | 7 - Client/Assets/Test/GameProto.pdb.bytes | Bin 29248 -> 0 bytes Client/Assets/Test/GameProto.pdb.bytes.meta | 7 - .../Runtime/Debugger/DebuggerComponent.cs | 3 + .../com.alicizax.unity.editor.extension | 1 + .../Localization/LocalizationComponent.cs | 2 +- .../Runtime/Resource/ResourceComponent.cs | 2 +- .../Runtime/AlicizaX.Timer.Runtime.asmdef | 1 + .../Runtime/Timer/GameTimerManager.cs | 234 ++++++ .../Runtime/Timer/GameTimerManager.cs.meta | 3 + .../Runtime/Timer/ITimerManager.cs | 12 - .../Runtime/Timer/TimerComponent.cs | 26 - .../Runtime/Timer/TimerManager.cs | 468 ----------- .../Runtime/Timer/TimerManagerOld.cs | 468 +++++++++++ ...anager.cs.meta => TimerManagerOld.cs.meta} | 0 .../com.alicizax.unity.timer/package.json | 2 +- .../GenerateTool/UIGenerateEditorTool.cs | 2 +- .../Runtime/UI/Constant/UIMetadataFactory.cs | 6 +- .../Runtime/UI/Manager/IUIManager.cs | 8 +- .../Runtime/UI/Manager/UIManager.Open.cs | 23 +- .../Runtime/UI/Manager/UIManager.cs | 16 +- .../Runtime/UI/UIComponent.cs | 89 ++- .../Editor/HybridCLR/BuildDLLCommand.cs | 11 +- .../Editor/HybridCLR/SynAssemblysContent.cs | 7 +- Client/Packages/commit.bat | 16 +- Client/Packages/manifest.json | 12 +- Client/Packages/packages-lock.json | 18 +- .../ProjectSettings/HybridCLRSettings.asset | 4 +- Client/ProjectSettings/ProjectSettings.asset | 13 +- Client/ProjectSettings/QualitySettings.asset | 2 +- Client/UserSettings/Layouts/default-6000.dwlt | 306 ++++--- 99 files changed, 1158 insertions(+), 3357 deletions(-) create mode 100644 Client/Assets/Resources/AppBuilderSetting.bytes rename Client/Assets/{Test/GameBase.dll.bytes.meta => Resources/AppBuilderSetting.bytes.meta} (75%) rename Client/Assets/{HybridCLRData.meta => Resources/yoo.meta} (77%) rename Client/Assets/{Scripts/Editor/ToolBar.meta => Resources/yoo/DefaultPackage.meta} (77%) create mode 100644 Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset rename Client/Assets/{Scripts/Editor/Postprocessor.meta => Resources/yoo/DefaultPackage/BuildinCatalog.asset.meta} (52%) delete mode 100644 Client/Assets/Scripts/Editor.meta delete mode 100644 Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef delete mode 100644 Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef.meta delete mode 100644 Client/Assets/Scripts/Editor/Base.meta delete mode 100644 Client/Assets/Scripts/Editor/Base/EditorToolBase.cs delete mode 100644 Client/Assets/Scripts/Editor/Base/EditorToolBase.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs delete mode 100644 Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Build.meta rename Client/Assets/Scripts/Editor/Build/{BuildWindow.meta => BuildCLI.meta} (100%) delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs delete mode 100644 Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/EditorIcons.cs delete mode 100644 Client/Assets/Scripts/Editor/EditorIcons.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs delete mode 100644 Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs.meta delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs delete mode 100644 Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs.meta delete mode 100644 Client/Assets/StreamingAssets.meta delete mode 100644 Client/Assets/Test.meta delete mode 100644 Client/Assets/Test/GameBase.dll.bytes delete mode 100644 Client/Assets/Test/GameBase.pdb.bytes delete mode 100644 Client/Assets/Test/GameBase.pdb.bytes.meta delete mode 100644 Client/Assets/Test/GameLib.dll.bytes delete mode 100644 Client/Assets/Test/GameLib.dll.bytes.meta delete mode 100644 Client/Assets/Test/GameLib.pdb.bytes delete mode 100644 Client/Assets/Test/GameLib.pdb.bytes.meta delete mode 100644 Client/Assets/Test/GameLogic.dll.bytes delete mode 100644 Client/Assets/Test/GameLogic.dll.bytes.meta delete mode 100644 Client/Assets/Test/GameLogic.pdb.bytes delete mode 100644 Client/Assets/Test/GameLogic.pdb.bytes.meta delete mode 100644 Client/Assets/Test/GameProto.dll.bytes delete mode 100644 Client/Assets/Test/GameProto.dll.bytes.meta delete mode 100644 Client/Assets/Test/GameProto.pdb.bytes delete mode 100644 Client/Assets/Test/GameProto.pdb.bytes.meta create mode 160000 Client/Packages/com.alicizax.unity.editor.extension create mode 100644 Client/Packages/com.alicizax.unity.timer/Runtime/Timer/GameTimerManager.cs create mode 100644 Client/Packages/com.alicizax.unity.timer/Runtime/Timer/GameTimerManager.cs.meta delete mode 100644 Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs create mode 100644 Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs rename Client/Packages/com.alicizax.unity.timer/Runtime/Timer/{TimerManager.cs.meta => TimerManagerOld.cs.meta} (100%) diff --git a/Client/Assets/Art/Atlas/bg.spriteatlas b/Client/Assets/Art/Atlas/bg.spriteatlas index d5cc1bf..7bf6f2f 100644 --- a/Client/Assets/Art/Atlas/bg.spriteatlas +++ b/Client/Assets/Art/Atlas/bg.spriteatlas @@ -35,7 +35,7 @@ SpriteAtlas: m_AndroidETC2FallbackOverride: 0 m_ForceMaximumCompressionQuality_BC6H_BC7: 0 - serializedVersion: 4 - m_BuildTarget: iPhone + m_BuildTarget: iOS m_MaxTextureSize: 2048 m_ResizeAlgorithm: 0 m_TextureFormat: 49 diff --git a/Client/Assets/Art/Atlas/icon.spriteatlas b/Client/Assets/Art/Atlas/icon.spriteatlas index ce0c641..e9a251a 100644 --- a/Client/Assets/Art/Atlas/icon.spriteatlas +++ b/Client/Assets/Art/Atlas/icon.spriteatlas @@ -35,7 +35,7 @@ SpriteAtlas: m_AndroidETC2FallbackOverride: 0 m_ForceMaximumCompressionQuality_BC6H_BC7: 0 - serializedVersion: 4 - m_BuildTarget: iPhone + m_BuildTarget: iOS m_MaxTextureSize: 2048 m_ResizeAlgorithm: 0 m_TextureFormat: 49 diff --git a/Client/Assets/Resources/AppBuilderSetting.bytes b/Client/Assets/Resources/AppBuilderSetting.bytes new file mode 100644 index 0000000..720b791 --- /dev/null +++ b/Client/Assets/Resources/AppBuilderSetting.bytes @@ -0,0 +1 @@ +{"DebugMode":false,"ResMode":1,"Language":1} \ No newline at end of file diff --git a/Client/Assets/Test/GameBase.dll.bytes.meta b/Client/Assets/Resources/AppBuilderSetting.bytes.meta similarity index 75% rename from Client/Assets/Test/GameBase.dll.bytes.meta rename to Client/Assets/Resources/AppBuilderSetting.bytes.meta index 2c8f566..91b81d1 100644 --- a/Client/Assets/Test/GameBase.dll.bytes.meta +++ b/Client/Assets/Resources/AppBuilderSetting.bytes.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ab2440e36857b5c41a158bdd509cf9d8 +guid: 4e3331916411c1b4a975d38de96dc2af TextScriptImporter: externalObjects: {} userData: diff --git a/Client/Assets/HybridCLRData.meta b/Client/Assets/Resources/yoo.meta similarity index 77% rename from Client/Assets/HybridCLRData.meta rename to Client/Assets/Resources/yoo.meta index 81102c8..a744cdc 100644 --- a/Client/Assets/HybridCLRData.meta +++ b/Client/Assets/Resources/yoo.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 402293b9e7937184a89cd7d9b4ac24fa +guid: a5f57ac0b1d10054b94e07a7d2f65a85 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Client/Assets/Scripts/Editor/ToolBar.meta b/Client/Assets/Resources/yoo/DefaultPackage.meta similarity index 77% rename from Client/Assets/Scripts/Editor/ToolBar.meta rename to Client/Assets/Resources/yoo/DefaultPackage.meta index 2efaed0..a089d2a 100644 --- a/Client/Assets/Scripts/Editor/ToolBar.meta +++ b/Client/Assets/Resources/yoo/DefaultPackage.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b73ba175345359b4f94c0a0077fb54a8 +guid: 4c8342f8b81cb834fa3a9f82d44efd4f folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset b/Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset new file mode 100644 index 0000000..0a5afdf --- /dev/null +++ b/Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b05c83971e3dca94f9fa460d396385e5, type: 3} + m_Name: BuildinCatalog + m_EditorClassIdentifier: + PackageName: DefaultPackage + PackageVersion: 2025-03-10-901 + Wrappers: + - BundleGUID: 92ae5a3aec236b87f83a1603da5fc2a9 + FileName: assets_bundles_audios_audioclip_92ae5a3aec236b87f83a1603da5fc2a9.bundle + - BundleGUID: 8d59bf4d24bcea500724da6bf929a9d8 + FileName: assets_bundles_configs_bytes_8d59bf4d24bcea500724da6bf929a9d8.bundle + - BundleGUID: 03ab2999df78316aa2559198c5749f73 + FileName: assets_bundles_dll_03ab2999df78316aa2559198c5749f73.bundle + - BundleGUID: cf9ac84552c8cc4579531fde229fb9cd + FileName: assets_bundles_scenes_map1000_cf9ac84552c8cc4579531fde229fb9cd.bundle + - BundleGUID: 6690ad300b34c0ebe929c31c3169578f + FileName: assets_bundles_uiraw_atlas_bg_6690ad300b34c0ebe929c31c3169578f.bundle + - BundleGUID: 5e6ab36bb331e560c6356376a19c7b90 + FileName: assets_bundles_uiraw_atlas_icon_5e6ab36bb331e560c6356376a19c7b90.bundle + - BundleGUID: 5cd8ddfcb9a046645641c242d2dd7d89 + FileName: assets_bundles_ui_uiloadupdate_5cd8ddfcb9a046645641c242d2dd7d89.bundle + - BundleGUID: ac3a2a5997e1d38db49f401928208c94 + FileName: assets_bundles_ui_uitestcardwidget_ac3a2a5997e1d38db49f401928208c94.bundle + - BundleGUID: ce093762bdd7022d87109f35f63bb649 + FileName: share_assets_resources_ui_uisprite_ce093762bdd7022d87109f35f63bb649.bundle + - BundleGUID: 424565db06dd56bd521fc4a060afa34e + FileName: share_packages_com_unity_render-pipelines_universal_runtime_materials_424565db06dd56bd521fc4a060afa34e.bundle + - BundleGUID: 2e6ec77722cc35069f3392a7f5167903 + FileName: unityshaders_2e6ec77722cc35069f3392a7f5167903.bundle diff --git a/Client/Assets/Scripts/Editor/Postprocessor.meta b/Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset.meta similarity index 52% rename from Client/Assets/Scripts/Editor/Postprocessor.meta rename to Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset.meta index d87242a..ac4e8aa 100644 --- a/Client/Assets/Scripts/Editor/Postprocessor.meta +++ b/Client/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 303c55325c569f8419d1aa6dc00b02be -folderAsset: yes -DefaultImporter: +guid: 21166d2b90e0f5e4bbc09727c3f4878e +NativeFormatImporter: externalObjects: {} + mainObjectFileID: 11400000 userData: assetBundleName: assetBundleVariant: diff --git a/Client/Assets/Scenes/Main.unity b/Client/Assets/Scenes/Main.unity index e3cfdbf..9751248 100644 --- a/Client/Assets/Scenes/Main.unity +++ b/Client/Assets/Scenes/Main.unity @@ -185,6 +185,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 4927968100452151227, guid: 8e4808bf30e54a8439a661bfa35ee982, type: 3} + propertyPath: componentType + value: AlicizaX.Timer.Runtime.GameTimerManager + objectReference: {fileID: 0} - target: {fileID: 5472542677182214335, guid: 8e4808bf30e54a8439a661bfa35ee982, type: 3} propertyPath: m_Name value: Entry diff --git a/Client/Assets/Scripts/Editor.meta b/Client/Assets/Scripts/Editor.meta deleted file mode 100644 index 0b1a24e..0000000 --- a/Client/Assets/Scripts/Editor.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ae6a79e083584ec98edcf80dc4f11347 -timeCreated: 1737627973 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef b/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef deleted file mode 100644 index e170a3e..0000000 --- a/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "Alicizax.Editor.Entension", - "rootNamespace": "", - "references": [ - "GUID:e34a5702dd353724aa315fb8011f08c3", - "GUID:4d1926c9df5b052469a1c63448b7609a", - "GUID:df8e45d6cf544f2693a36da8779a9fc9", - "GUID:8d62da4aabd2a19419c7378d23ea5849", - "GUID:acfef7cabed3b0a42b25edb1cd4fa259", - "GUID:be2f20a77f3232f44b9711ef43234aac", - "GUID:75b6f2078d190f14dbda4a5b747d709c" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef.meta b/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef.meta deleted file mode 100644 index c97065f..0000000 --- a/Client/Assets/Scripts/Editor/Alicizax.Editor.Entension.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4904ff06264a41a41b73d53651a46fac -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Scripts/Editor/Base.meta b/Client/Assets/Scripts/Editor/Base.meta deleted file mode 100644 index c6785c2..0000000 --- a/Client/Assets/Scripts/Editor/Base.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: bc3f948f15304085b3623e95529402b2 -timeCreated: 1741335009 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs b/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs deleted file mode 100644 index 4d3d0d0..0000000 --- a/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs +++ /dev/null @@ -1,16 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace AlicizaX.Editor.Extension -{ - public abstract class EditorToolBase : EditorWindow - { - public abstract string ToolName { get; } - public abstract Vector2Int WinSize { get; } - private void Awake() - { - this.titleContent = new GUIContent(ToolName); - this.position.Set(this.position.x, this.position.y, this.WinSize.x, this.WinSize.y); - } - } -} diff --git a/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs.meta b/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs.meta deleted file mode 100644 index f251de7..0000000 --- a/Client/Assets/Scripts/Editor/Base/EditorToolBase.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c5059ae8ffe14e83adc79687bb2f6128 -timeCreated: 1741335011 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs b/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs deleted file mode 100644 index 203b10c..0000000 --- a/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; - -namespace AlicizaX.Editor.Extension -{ - [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] - public class EditorToolFunctionAttribute : Attribute - { - public string ToolMenuPath { get; private set; } - public int MenuOrder { get; private set; } - public Type OwnerType { get; private set; } - public MethodInfo MethodInfo { get; private set; } - - public EditorToolFunctionAttribute(string menu, Type owner, int menuOrder = 0) - { - this.ToolMenuPath = menu; - OwnerType = owner; - MenuOrder = menuOrder; - } - - public void SetMethodInfo(MethodInfo methodInfo) - { - MethodInfo = methodInfo; - } - } - - internal static class EditorToolFunctionAttributeCollector - { - public static List Attributes = new List(); - - public static void Register(EditorToolFunctionAttribute attribute) - { - Attributes.Add(attribute); - Attributes.Sort((x, y) => x.MenuOrder.CompareTo(y.MenuOrder)); - } - - /// - /// 扫描所有程序集中的类和方法,自动注册带有 EditorToolFunctionAttribute 的方法。 - /// - [InitializeOnLoadMethod] - public static void ScanAndRegisterAllMethods() - { - // 获取当前应用程序域中的所有程序集 - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - foreach (var assembly in assemblies) - { - try - { - // 获取程序集中的所有类型 - var types = assembly.GetTypes(); - - foreach (var type in types) - { - try - { - // 获取类型中的所有方法 - var methods = - type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); - - foreach (var method in methods) - { - // 检查方法是否带有 EditorToolFunctionAttribute - var attribute = method.GetCustomAttribute(); - if (attribute != null) - { - // 设置方法的 MethodInfo - attribute.SetMethodInfo(method); - Register(attribute); - } - } - } - catch (Exception ex) - { - Debug.LogError($"Failed to process type {type.FullName}: {ex.Message}"); - } - } - } - catch (Exception ex) - { - Debug.LogError($"Failed to process assembly {assembly.FullName}: {ex.Message}"); - } - } - - // Debug.Log($"Registered {Attributes.Count} methods with EditorToolFunctionAttribute."); - } - } -} diff --git a/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs.meta b/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs.meta deleted file mode 100644 index a35c300..0000000 --- a/Client/Assets/Scripts/Editor/Base/EditorToolFunctionAttribute.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: aea4eaf9f6aa4109bb9a01f4537ee060 -timeCreated: 1741335052 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Build.meta b/Client/Assets/Scripts/Editor/Build.meta deleted file mode 100644 index aed4c00..0000000 --- a/Client/Assets/Scripts/Editor/Build.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: aee016cbfab94fd1b7047ad26e7758bc -timeCreated: 1737627977 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow.meta b/Client/Assets/Scripts/Editor/Build/BuildCLI.meta similarity index 100% rename from Client/Assets/Scripts/Editor/Build/BuildWindow.meta rename to Client/Assets/Scripts/Editor/Build/BuildCLI.meta diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs b/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs deleted file mode 100644 index c75f1b6..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEditor.Build.Reporting; -using UnityEngine; -using YooAsset; -using YooAsset.Editor; - -public class AdvancedBuildWindow : EditorWindow -{ - private Dictionary _tabs = new(); - private int _selectedTab = -1; - private string[] _tabLabels; - private Vector2 _scrollPosition; - private EditorWindowTabBase showTab; - - public static void ShowWindow() - { - GetWindow("Build Window", true); - } - - private void CreateGUI() - { - _tabs.Add("AB包构建", new AssetBundleBuildTab()); - _tabs.Add("整包构建", new AppBuildTab()); - _tabLabels = _tabs.Keys.ToArray(); - } - - private void OnDisable() - { - if (showTab != null) - { - showTab.OnDisable(); - } - } - - - private void OnGUI() - { - var selectedTab = GUILayout.Toolbar(_selectedTab, _tabLabels); - - if (selectedTab != _selectedTab) - { - _selectedTab = selectedTab; - if (showTab != null) - { - showTab.OnDisable(); - } - - string tabKey = _tabLabels[_selectedTab]; - _tabs.TryGetValue(tabKey, out showTab); - showTab.OnEnable(); - } - - _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition); - { - if (showTab != null) showTab.OnGUI(); - } - EditorGUILayout.EndScrollView(); - } -} diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs.meta b/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs.meta deleted file mode 100644 index 4b37e97..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AdvancedBuildWindow.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 299b9adaf99d4b81aa2822e5995a1b92 -timeCreated: 1738739276 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs b/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs deleted file mode 100644 index fc87558..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; - -public class AppBuildTab : EditorWindowTabBase -{ - // 整包构建配置 - private BuildTarget _appBuildTarget = BuildTarget.StandaloneWindows64; - private string _appOutputPath = "Builds/App"; - private SceneAsset _entryScene; - private bool _developmentBuild; - - internal override void OnGUI() - { - base.OnGUI(); - DrawAppBuildTab(); - } - - - private void DrawAppBuildTab() - { - EditorGUILayout.Space(); - EditorGUILayout.LabelField("整包构建配置", EditorStyles.boldLabel); - - DrawBuildTarget(ref _appBuildTarget); - DrawPathSelection("输出路径:", ref _appOutputPath); - _developmentBuild = EditorGUILayout.Toggle("开发模式:", _developmentBuild); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("包含场景:", EditorStyles.boldLabel); - DrawSceneList(); - - EditorGUILayout.Space(); - if (GUILayout.Button("构建应用程序", GUILayout.Height(30))) - { - BuildApplication(); - } - } - - private void DrawBuildTarget(ref BuildTarget target) - { - target = (BuildTarget)EditorGUILayout.EnumPopup("目标平台:", target); - } - - private void DrawSceneList() - { - _entryScene = (SceneAsset)EditorGUILayout.ObjectField("启动场景", _entryScene, typeof(SceneAsset), false); - } - - private void BuildApplication() - { - try - { - var options = new BuildPlayerOptions - { - scenes = new[] { AssetDatabase.GetAssetPath(_entryScene) }, - locationPathName = Path.Combine(_appOutputPath, GetExecutableName()), - target = _appBuildTarget, - options = _developmentBuild ? BuildOptions.Development : BuildOptions.None - }; - - var report = BuildPipeline.BuildPlayer(options); - HandleBuildReport(report); - } - catch (Exception e) - { - EditorUtility.DisplayDialog("错误", $"构建过程中发生异常: {e.Message}", "确定"); - } - } - - private void HandleBuildReport(UnityEditor.Build.Reporting.BuildReport report) - { - if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded) - { - EditorUtility.DisplayDialog("构建成功", - $"应用程序构建完成!\n输出大小: {report.summary.totalSize / 1024 / 1024}MB", "确定"); - } - else - { - EditorUtility.DisplayDialog("构建失败", - $"错误信息: {report.summary}", "确定"); - } - } - - private string GetExecutableName() - { - return _appBuildTarget switch - { - BuildTarget.StandaloneWindows64 => "Game.exe", - BuildTarget.StandaloneOSX => "Game.app", - BuildTarget.Android => "Game.apk", - _ => "Game" - }; - } -} diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs.meta b/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs.meta deleted file mode 100644 index 8788d4b..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AppBuildTab.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 8a18b79139694e1bafb85f014a003665 -timeCreated: 1740128549 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs b/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs deleted file mode 100644 index c3e3c66..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs +++ /dev/null @@ -1,241 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; -using YooAsset; -using YooAsset.Editor; - -public class AssetBundleBuildTab : EditorWindowTabBase -{ - private BuildTarget _abBuildTarget = BuildTarget.StandaloneWindows64; - private string _outputPath = "Builds/AB"; - private string _packageVersion; - private bool _copyAfterBuild; - private string _copyDestination; - private ECompressOption _compressOption = ECompressOption.LZ4; - private EFileNameStyle _fileNameStyle = EFileNameStyle.BundleName_HashName; - private EBuildinFileCopyOption _copyOption = EBuildinFileCopyOption.ClearAndCopyByTags; - private string _copyParams = "Launch"; - private bool _enableSharePack = true; - private string _selectedEncryption; - private string _selectedPackage; - private List _encryptionClasses; - private List _buildPackageNames; - - internal override void OnEnable() - { - LoadEncryptionClasses(); - LoadBuildPackageNames(); - GeneratePackageVersion(); - } - - private void GeneratePackageVersion() - { - int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute; - _packageVersion = DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes; - } - - private void LoadEncryptionClasses() - { - _encryptionClasses = AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(a => a.GetTypes()) - .Where(t => typeof(IEncryptionServices).IsAssignableFrom(t) && !t.IsAbstract) - .Select(t => t.FullName) - .ToList(); - } - - - private void LoadBuildPackageNames() - { - _buildPackageNames = new List(); - foreach (var package in AssetBundleCollectorSettingData.Setting.Packages) - { - _buildPackageNames.Add(package.PackageName); - } - } - - internal override void OnGUI() - { - base.OnGUI(); - DrawABBuildTab(); - } - - private void DrawABBuildTab() - { - EditorGUILayout.Space(); - EditorGUILayout.LabelField("AB包构建配置", EditorStyles.boldLabel); - - // 基本配置 - DrawBuildTarget(ref _abBuildTarget); - DrawPathSelection("输出路径:", ref _outputPath); - DrawPackageVersion(); - - // 高级配置 - EditorGUILayout.Space(); - EditorGUILayout.LabelField("高级选项", EditorStyles.boldLabel); - _compressOption = (ECompressOption)EditorGUILayout.EnumPopup("压缩方式:", _compressOption); - _fileNameStyle = (EFileNameStyle)EditorGUILayout.EnumPopup("文件命名风格:", _fileNameStyle); - _copyOption = (EBuildinFileCopyOption)EditorGUILayout.EnumPopup("内置文件拷贝选项:", _copyOption); - _copyParams = EditorGUILayout.TextField("拷贝参数:", _copyParams); - _enableSharePack = EditorGUILayout.Toggle("启用共享打包:", _enableSharePack); - DrawEncryptionSelection(); - DrawPackageSelection(); - - // 拷贝配置 - EditorGUILayout.Space(); - _copyAfterBuild = EditorGUILayout.BeginToggleGroup("构建后拷贝", _copyAfterBuild); - DrawPathSelection("拷贝目标:", ref _copyDestination); - EditorGUILayout.EndToggleGroup(); - - // 操作按钮 - EditorGUILayout.Space(); - if (GUILayout.Button("构建AB包", GUILayout.Height(30))) - { - BuildABPackage(); - } - - if (GUILayout.Button("构建热更程序集", GUILayout.Height(30))) - { - BuildDLLCommand.BuildAndCopyDlls(); - } - } - - private void DrawBuildTarget(ref BuildTarget target) - { - target = (BuildTarget)EditorGUILayout.EnumPopup("目标平台:", target); - } - - private void DrawPackageVersion() - { - EditorGUILayout.BeginHorizontal(); - { - _packageVersion = EditorGUILayout.TextField("版本号:", _packageVersion); - if (GUILayout.Button("生成新版本", GUILayout.Width(100))) - { - GeneratePackageVersion(); - } - } - EditorGUILayout.EndHorizontal(); - } - - private void DrawEncryptionSelection() - { - if (_encryptionClasses == null || _encryptionClasses.Count == 0) - { - EditorGUILayout.HelpBox("未找到加密类实现", MessageType.Info); - return; - } - - int selectedIndex = Mathf.Max(0, _encryptionClasses.IndexOf(_selectedEncryption)); - selectedIndex = EditorGUILayout.Popup("加密方式:", selectedIndex, _encryptionClasses.ToArray()); - _selectedEncryption = _encryptionClasses[selectedIndex]; - } - - private void DrawPackageSelection() - { - if (_buildPackageNames == null || _buildPackageNames.Count == 0) - { - EditorGUILayout.HelpBox("未找到包", MessageType.Info); - return; - } - - int selectedIndex = Mathf.Max(0, _buildPackageNames.IndexOf(_selectedPackage)); - selectedIndex = EditorGUILayout.Popup("Package:", selectedIndex, _buildPackageNames.ToArray()); - _selectedPackage = _buildPackageNames[selectedIndex]; - } - - private void BuildABPackage() - { - try - { - var parameters = new ScriptableBuildParameters - { - BuildOutputRoot = _outputPath, - BuildTarget = _abBuildTarget, - PackageName = _selectedPackage, - BuildBundleType = (int)EBuildBundleType.AssetBundle, - BuildPipeline = EBuildPipeline.ScriptableBuildPipeline.ToString(), - BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(), - PackageVersion = _packageVersion, - CompressOption = _compressOption, - FileNameStyle = _fileNameStyle, - VerifyBuildingResult = true, - ClearBuildCacheFiles = false, - BuildinFileCopyOption = _copyOption, - BuildinFileCopyParams = _copyParams, - EnableSharePackRule = _enableSharePack, - EncryptionServices = CreateEncryptionInstance() - }; - - ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); - var report = pipeline.Run(parameters, true); - - if (report.Success) - { - BuildUpdateData(_packageVersion, _copyDestination); - if (_copyAfterBuild && !string.IsNullOrEmpty(_copyDestination)) - { - CopyFiles(report.OutputPackageDirectory, _copyDestination); - } - - EditorUtility.DisplayDialog("构建成功", $"AB包构建完成!\n输出目录: {report.OutputPackageDirectory}", "确定"); - } - else - { - EditorUtility.DisplayDialog("构建失败", $"错误信息: {report.ErrorInfo}", "确定"); - } - } - catch (Exception e) - { - Debug.LogException(e); - } - } - - private void BuildUpdateData(string version, string outPath) - { - ResourcePatchData updateData = new ResourcePatchData() - { - Version = Application.version, - BundleUrl = $"http://127.0.0.1:8081/res/{version}/", - Notice = "Test Notice", - }; - File.WriteAllText(Path.Combine(outPath, "UpdateData.json"), Newtonsoft.Json.JsonConvert.SerializeObject(updateData)); - } - - private void CopyFiles(string source, string destination) - { - try - { - if (!Directory.Exists(destination)) - { - Directory.CreateDirectory(destination); - } - - foreach (string file in Directory.GetFiles(source)) - { - File.Copy(file, Path.Combine(destination, Path.GetFileName(file)), true); - } - - Debug.Log($"文件拷贝完成: {source} -> {destination}"); - } - catch (Exception e) - { - Debug.LogError($"文件拷贝失败: {e.Message}"); - } - } - - private IEncryptionServices CreateEncryptionInstance() - { - if (string.IsNullOrEmpty(_selectedEncryption)) return null; - - var type = Type.GetType(_selectedEncryption); - if (type != null) - { - return (IEncryptionServices)Activator.CreateInstance(type); - } - - return null; - } -} diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs.meta b/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs.meta deleted file mode 100644 index f5899be..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/AssetBundleBuildTab.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 25d31eb885a64d3a868c2b56d4a6efad -timeCreated: 1740128311 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs b/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs deleted file mode 100644 index ec2f354..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs +++ /dev/null @@ -1,34 +0,0 @@ -using UnityEditor; -using UnityEngine; - -public abstract class EditorWindowTabBase -{ - internal virtual void OnEnable() - { - } - - internal virtual void OnDisable() - { - } - - internal virtual void OnGUI() - { - } - - protected void DrawPathSelection(string label, ref string path) - { - EditorGUILayout.BeginHorizontal(); - { - path = EditorGUILayout.TextField(label, path); - if (GUILayout.Button("浏览...", GUILayout.Width(60))) - { - string newPath = EditorUtility.SaveFolderPanel("选择输出目录", path, ""); - if (!string.IsNullOrEmpty(newPath)) - { - path = newPath; - } - } - } - EditorGUILayout.EndHorizontal(); - } -} diff --git a/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs.meta b/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs.meta deleted file mode 100644 index 312a037..0000000 --- a/Client/Assets/Scripts/Editor/Build/BuildWindow/EditorWindowTabBase.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0acdf416d4534dca8b923bd9d1f87c8a -timeCreated: 1740128254 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/EditorIcons.cs b/Client/Assets/Scripts/Editor/EditorIcons.cs deleted file mode 100644 index ca544a6..0000000 --- a/Client/Assets/Scripts/Editor/EditorIcons.cs +++ /dev/null @@ -1,746 +0,0 @@ -#if UNITY_EDITOR - -using System; -using UnityEngine; -using UnityEditor; -using System.Collections.Generic; -using System.Linq; -using System.IO; - -public class EditorIcons : EditorWindow -{ - [MenuItem("Tools/Editor Icons %e", priority = -1001)] - public static void EditorIconsOpen() - { -#if UNITY_2018 - var w = GetWindow("Editor Icons"); -#else - var w = CreateWindow("Editor Icons"); -#endif - w.ShowUtility(); - w.minSize = new Vector2(320, 450); - } - - static bool viewBigIcons = true; - - static bool darkPreview = true; - - Vector2 scroll; - - int buttonSize = 70; - - string search = ""; - - void SearchGUI() - { - using (new GUILayout.HorizontalScope()) - { - if (isWide) GUILayout.Space(10); - -#if UNITY_2018 - search = EditorGUILayout.TextField(search, EditorStyles.toolbarTextField); -#else - search = EditorGUILayout.TextField(search, EditorStyles.toolbarSearchField); -#endif - if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_mac_close_h"), //SVN_DeletedLocal - EditorStyles.toolbarButton, - GUILayout.Width(22)) - ) search = ""; - } - } - - bool isWide => Screen.width > 550; - - bool doSearch => !string.IsNullOrWhiteSpace(search) && search != ""; - - GUIContent GetIcon(string icon_name) - { - GUIContent valid = null; - Debug.unityLogger.logEnabled = false; - if (!string.IsNullOrEmpty(icon_name)) valid = EditorGUIUtility.IconContent(icon_name); - Debug.unityLogger.logEnabled = true; - return valid?.image == null ? null : valid; - } - - void SaveIcon(string icon_name) - { - Texture2D tex = EditorGUIUtility.IconContent(icon_name).image as Texture2D; - - if (tex != null) - { - string path = EditorUtility.SaveFilePanel( - "Save icon", "", icon_name, "png"); - - if (path != null) - { - try - { -#if UNITY_2018 - Texture2D outTex = new Texture2D( - tex.width, tex.height, - tex.format, true); -#else - Texture2D outTex = new Texture2D( - tex.width, tex.height, - tex.format, tex.mipmapCount, true); -#endif - - Graphics.CopyTexture(tex, outTex); - - File.WriteAllBytes(path, outTex.EncodeToPNG()); - } - catch (System.Exception e) - { - Debug.LogError("Cannot save the icon : " + e.Message); - } - } - } - else - { - Debug.LogError("Cannot save the icon : null texture error!"); - } - } - - void SaveAllIcons() - { - var folderpath = EditorUtility.SaveFolderPanel("", "", ""); - try - { - foreach (string icon in ico_list) - { - var split = icon.Split('/').Last(); - Texture2D tex = EditorGUIUtility.IconContent(icon).image as Texture2D; - - if (tex == null) continue; - if (string.IsNullOrWhiteSpace(folderpath)) - { - Debug.LogError("Folder path invalid..."); - break; - } - - var path = folderpath + "//" + $"{split}.png"; - - if (File.Exists(path)) - { - Debug.Log($"file already written with name aborting write: {path}"); - } - else - { -#if UNITY_2018 - Texture2D outTex = new Texture2D( - tex.width, tex.height, - tex.format, true); -#else - Texture2D outTex = new Texture2D( - tex.width, tex.height, - tex.format, tex.mipmapCount, true); -#endif - - Graphics.CopyTexture(tex, outTex); - - - File.WriteAllBytes(path, outTex.EncodeToPNG()); - } - } - } - catch (Exception e) - { - Debug.LogError("Cannot save the icons: " + e.Message); - } - } - - private void OnEnable() - { - //InitIcons(); - //var all_icons = iconContentListAll.Select(x => x.tooltip).ToArray(); - var all_icons = ico_list.Where(x => GetIcon(x) != null); - //List found = new List(); - List unique = new List(); - //var skip_flag = HideFlags.HideInInspector | HideFlags.HideAndDontSave; - //int unique_to_resources = 0, skipped_empty_str = 0, skipped_flags = 0, - // skipped_not_persistent = 0, skipped_nulls = 0, unique_to_list = 0; - - foreach (Texture2D x in Resources.FindObjectsOfTypeAll()) - { - //if (string.IsNullOrEmpty(x.name)) skipped_empty_str++; // skipped 10 empty - //if (!EditorUtility.IsPersistent(x)) skipped_not_persistent++; // skipped 39 none persistent - //if (x.hideFlags != HideFlags.HideAndDontSave && x.hideFlags != skip_flag) skipped_flags++; // skipped 27 icons - - GUIContent icoContent = GetIcon(x.name); - if (icoContent == null) continue; // skipped 14 icons - //{ - // skipped_nulls++; - // continue; - //} - - if (!all_icons.Contains(x.name)) - { - //unique_to_resources++; - unique.Add(x.name); - } - - //found.Add( x.name ); - } - - //foreach (var ico in all_icons) if (!found.Contains(ico)) unique_to_list++; - - //Debug.Log( $"Resources skipped nulls={skipped_nulls} empty={skipped_empty_str} flags={skipped_flags}" ); - //Debug.Log("Resources skipped_not_persistent=" + skipped_not_persistent); - //Debug.Log($"totals , list: {all_icons.Length} resource: {found.Count}"); - //Debug.Log($"Unique list={ unique_to_list } resources={unique_to_resources}") ; - - ico_list = ico_list.ToList().Concat(unique).ToArray(); - - // Static list icons count : 1315 ( unique = 749 ) - // Found icons in resources : 1416 ( unique = 855 ) - - Resources.UnloadUnusedAssets(); - System.GC.Collect(); - } - - private void OnGUI() - { - var ppp = EditorGUIUtility.pixelsPerPoint; - - InitIcons(); - - if (!isWide) SearchGUI(); - - using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) - { - if (GUILayout.Button("Save all icons to folder...", EditorStyles.miniButton)) SaveAllIcons(); - GUILayout.Label("Select what icons to show", GUILayout.Width(160)); - viewBigIcons = GUILayout.SelectionGrid( - viewBigIcons ? 1 : 0, new string[] { "Small", "Big" }, - 2, EditorStyles.toolbarButton) == 1; - - if (isWide) SearchGUI(); - } - - if (isWide) GUILayout.Space(3); - - using (var scope = new GUILayout.ScrollViewScope(scroll)) - { - GUILayout.Space(10); - - scroll = scope.scrollPosition; - - buttonSize = viewBigIcons ? 70 : 40; - - // scrollbar_width = ~ 12.5 - var render_width = (Screen.width / ppp - 13f); - var gridW = Mathf.FloorToInt(render_width / buttonSize); - var margin_left = (render_width - buttonSize * gridW) / 2; - - int row = 0, index = 0; - - List iconList; - - if (doSearch) iconList = iconContentListAll.Where(x => x.tooltip.ToLower() - .Contains(search.ToLower())).ToList(); - else iconList = viewBigIcons ? iconContentListBig : iconContentListSmall; - - while (index < iconList.Count) - { - using (new GUILayout.HorizontalScope()) - { - GUILayout.Space(margin_left); - - for (var i = 0; i < gridW; ++i) - { - int k = i + row * gridW; - - var icon = iconList[k]; - - if (GUILayout.Button(icon, - iconButtonStyle, - GUILayout.Width(buttonSize), - GUILayout.Height(buttonSize))) - { - EditorGUI.FocusTextInControl(""); - iconSelected = icon; - } - - index++; - - if (index == iconList.Count) break; - } - } - - row++; - } - - GUILayout.Space(10); - } - - - if (iconSelected == null) return; - - GUILayout.FlexibleSpace(); - - using (new GUILayout.HorizontalScope(EditorStyles.helpBox, GUILayout.MaxHeight(viewBigIcons ? 140 : 120))) - { - using (new GUILayout.VerticalScope(GUILayout.Width(130))) - { - GUILayout.Space(2); - - GUILayout.Button(iconSelected, - darkPreview ? iconPreviewBlack : iconPreviewWhite, - GUILayout.Width(128), GUILayout.Height(viewBigIcons ? 128 : 40)); - - GUILayout.Space(5); - - darkPreview = GUILayout.SelectionGrid( - darkPreview ? 1 : 0, new string[] { "Light", "Dark" }, - 2, EditorStyles.miniButton) == 1; - - GUILayout.FlexibleSpace(); - } - - GUILayout.Space(10); - - using (new GUILayout.VerticalScope()) - { - var s = $"Size: {iconSelected.image.width}x{iconSelected.image.height}"; - s += "\nIs Pro Skin Icon: " + (iconSelected.tooltip.IndexOf("d_") == 0 ? "Yes" : "No"); - s += $"\nTotal {iconContentListAll.Count} icons"; - GUILayout.Space(5); - EditorGUILayout.HelpBox(s, MessageType.None); - GUILayout.Space(5); - EditorGUILayout.TextField("EditorGUIUtility.IconContent(\"" + iconSelected.tooltip + "\")"); - GUILayout.Space(5); - if (GUILayout.Button("Copy to clipboard", EditorStyles.miniButton)) - EditorGUIUtility.systemCopyBuffer = iconSelected.tooltip; - if (GUILayout.Button("Save icon to file ...", EditorStyles.miniButton)) - SaveIcon(iconSelected.tooltip); - } - - GUILayout.Space(10); - - if (GUILayout.Button("X", GUILayout.ExpandHeight(true))) - { - iconSelected = null; - } - - } - } - - static GUIContent iconSelected; - static List iconContentListAll; - static List iconContentListSmall; - static List iconContentListBig; - static List iconMissingNames; - static GUIStyle iconButtonStyle = null; - static GUIStyle iconPreviewBlack = null; - static GUIStyle iconPreviewWhite = null; - - void AllTheTEXTURES(ref GUIStyle s, Texture2D t) - { - s.hover.background = s.onHover.background = s.focused.background = s.onFocused.background = s.active.background = s.onActive.background = s.normal.background = s.onNormal.background = t; - s.hover.scaledBackgrounds = s.onHover.scaledBackgrounds = s.focused.scaledBackgrounds = s.onFocused.scaledBackgrounds = s.active.scaledBackgrounds = s.onActive.scaledBackgrounds = s.normal.scaledBackgrounds = s.onNormal.scaledBackgrounds = new Texture2D[] { t }; - } - - Texture2D Texture2DPixel(Color c) - { - Texture2D t = new Texture2D(1, 1); - t.SetPixel(0, 0, c); - t.Apply(); - return t; - } - - void InitIcons() - { - if (iconContentListSmall != null) return; - - iconButtonStyle = new GUIStyle(EditorStyles.miniButton); - iconButtonStyle.margin = new RectOffset(0, 0, 0, 0); - iconButtonStyle.fixedHeight = 0; - - iconPreviewBlack = new GUIStyle(iconButtonStyle); - AllTheTEXTURES(ref iconPreviewBlack, Texture2DPixel(new Color(0.15f, 0.15f, 0.15f))); - - iconPreviewWhite = new GUIStyle(iconButtonStyle); - AllTheTEXTURES(ref iconPreviewWhite, Texture2DPixel(new Color(0.85f, 0.85f, 0.85f))); - - iconMissingNames = new List(); - iconContentListSmall = new List(); - iconContentListBig = new List(); - iconContentListAll = new List(); - - for (var i = 0; i < ico_list.Length; ++i) - { - GUIContent ico = GetIcon(ico_list[i]); - - if (ico == null) - { - iconMissingNames.Add(ico_list[i]); - continue; - } - - ico.tooltip = ico_list[i]; - - iconContentListAll.Add(ico); - - if (!(ico.image.width <= 36 || ico.image.height <= 36)) - iconContentListBig.Add(ico); - else iconContentListSmall.Add(ico); - } - } - - // https://gist.github.com/MattRix/c1f7840ae2419d8eb2ec0695448d4321 - // https://unitylist.com/p/5c3/Unity-editor-icons - - #region ICONS - - public static string[] ico_list = - { - "_Help","_Popup","aboutwindow.mainheader","ageialogo","AlphabeticalSorting","Animation.AddEvent", - "Animation.AddKeyframe","Animation.EventMarker","Animation.FirstKey","Animation.LastKey", - "Animation.NextKey","Animation.Play","Animation.PrevKey","Animation.Record","Animation.SequencerLink", - "animationanimated","animationdopesheetkeyframe","animationkeyframe","animationnocurve", - "animationvisibilitytoggleoff","animationvisibilitytoggleon","AnimationWrapModeMenu","AssemblyLock", - "Asset Store","Audio Mixer","AvatarCompass","AvatarController.Layer","AvatarController.LayerHover", - "AvatarController.LayerSelected","BodyPartPicker","BodySilhouette","DotFill","DotFrame","DotFrameDotted", - "DotSelection","Head","HeadIk","HeadZoom","HeadZoomSilhouette","LeftArm","LeftFeetIk","LeftFingers", - "LeftFingersIk","LeftHandZoom","LeftHandZoomSilhouette","LeftLeg","MaskEditor_Root","RightArm","RightFeetIk", - "RightFingers","RightFingersIk","RightHandZoom","RightHandZoomSilhouette","RightLeg","Torso","AvatarPivot", - "back","back@2x","beginButton-On","beginButton","blendKey","blendKeyOverlay","blendKeySelected", - "blendSampler","blueGroove","BuildSettings.Android","BuildSettings.Android.Small","BuildSettings.Broadcom", - "BuildSettings.Editor","BuildSettings.Editor.Small","BuildSettings.Facebook", - "BuildSettings.Facebook.Small","BuildSettings.FlashPlayer","BuildSettings.FlashPlayer.Small", - "BuildSettings.iPhone","BuildSettings.iPhone.Small","BuildSettings.Lumin","BuildSettings.Lumin.small", - "BuildSettings.Metro","BuildSettings.Metro.Small","BuildSettings.N3DS","BuildSettings.N3DS.Small", - "BuildSettings.PS4","BuildSettings.PS4.Small","BuildSettings.PSM","BuildSettings.PSM.Small", - "BuildSettings.PSP2","BuildSettings.PSP2.Small","BuildSettings.SelectedIcon","BuildSettings.Standalone", - "BuildSettings.Standalone.Small","BuildSettings.StandaloneBroadcom.Small", - "BuildSettings.StandaloneGLES20Emu.Small","BuildSettings.StandaloneGLESEmu", - "BuildSettings.StandaloneGLESEmu.Small","BuildSettings.Switch","BuildSettings.Switch.Small", - "BuildSettings.tvOS","BuildSettings.tvOS.Small","BuildSettings.Web","BuildSettings.Web.Small", - "BuildSettings.WebGL","BuildSettings.WebGL.Small","BuildSettings.WP8","BuildSettings.WP8.Small", - "BuildSettings.Xbox360","BuildSettings.Xbox360.Small","BuildSettings.XboxOne", - "BuildSettings.XboxOne.Small","BuildSettings.Xiaomi","Camera Gizmo","CheckerFloor","Clipboard", - "ClothInspector.PaintTool","ClothInspector.PaintValue","ClothInspector.SelectTool", - "ClothInspector.SettingsTool","ClothInspector.ViewValue","CloudConnect","Collab.Build", - "Collab.BuildFailed","Collab.BuildSucceeded","Collab.FileAdded","Collab.FileConflict","Collab.FileDeleted", - "Collab.FileIgnored","Collab.FileMoved","Collab.FileUpdated","Collab.FolderAdded","Collab.FolderConflict", - "Collab.FolderDeleted","Collab.FolderIgnored","Collab.FolderMoved","Collab.FolderUpdated", - "Collab.NoInternet","Collab","Collab.Warning","CollabConflict","CollabError","CollabNew","CollabOffline", - "CollabProgress","CollabPull","CollabPush","ColorPicker.ColorCycle","ColorPicker.CycleColor", - "ColorPicker.CycleSlider","ColorPicker.SliderCycle","console.erroricon.inactive.sml","console.erroricon", - "console.erroricon.sml","console.infoicon","console.infoicon.sml","console.warnicon.inactive.sml", - "console.warnicon","console.warnicon.sml","curvekeyframe","curvekeyframeselected", - "curvekeyframeselectedoverlay","curvekeyframesemiselectedoverlay","curvekeyframeweighted","CustomSorting", - "d__Popup","d_aboutwindow.mainheader","d_ageialogo","d_AlphabeticalSorting","d_Animation.AddEvent", - "d_Animation.AddKeyframe","d_Animation.EventMarker","d_Animation.FirstKey","d_Animation.LastKey", - "d_Animation.NextKey","d_Animation.Play","d_Animation.PrevKey","d_Animation.Record", - "d_Animation.SequencerLink","d_animationanimated","d_animationkeyframe","d_animationnocurve", - "d_animationvisibilitytoggleoff","d_animationvisibilitytoggleon","d_AnimationWrapModeMenu", - "d_AS Badge Delete","d_AS Badge New","d_AssemblyLock","d_Asset Store","d_Audio Mixer", - "d_AvatarBlendBackground","d_AvatarBlendLeft","d_AvatarBlendLeftA","d_AvatarBlendRight", - "d_AvatarBlendRightA","d_AvatarCompass","d_AvatarPivot","d_back","d_back@2x","d_beginButton-On", - "d_beginButton","d_blueGroove","d_BuildSettings.Android","d_BuildSettings.Android.Small", - "d_BuildSettings.Broadcom","d_BuildSettings.FlashPlayer","d_BuildSettings.FlashPlayer.Small", - "d_BuildSettings.iPhone","d_BuildSettings.iPhone.Small","d_BuildSettings.Lumin", - "d_BuildSettings.Lumin.small","d_BuildSettings.PS4","d_BuildSettings.PS4.Small","d_BuildSettings.PSP2", - "d_BuildSettings.PSP2.Small","d_BuildSettings.SelectedIcon","d_BuildSettings.Standalone", - "d_BuildSettings.Standalone.Small","d_BuildSettings.tvOS","d_BuildSettings.tvOS.Small", - "d_BuildSettings.Web","d_BuildSettings.Web.Small","d_BuildSettings.WebGL","d_BuildSettings.WebGL.Small", - "d_BuildSettings.Xbox360","d_BuildSettings.Xbox360.Small","d_BuildSettings.XboxOne", - "d_BuildSettings.XboxOne.Small","d_CheckerFloor","d_CloudConnect","d_Collab.FileAdded", - "d_Collab.FileConflict","d_Collab.FileDeleted","d_Collab.FileIgnored","d_Collab.FileMoved", - "d_Collab.FileUpdated","d_Collab.FolderAdded","d_Collab.FolderConflict","d_Collab.FolderDeleted", - "d_Collab.FolderIgnored","d_Collab.FolderMoved","d_Collab.FolderUpdated","d_ColorPicker.CycleColor", - "d_ColorPicker.CycleSlider","d_console.erroricon","d_console.erroricon.sml","d_console.infoicon", - "d_console.infoicon.sml","d_console.warnicon","d_console.warnicon.sml","d_curvekeyframe", - "d_curvekeyframeselected","d_curvekeyframeselectedoverlay","d_curvekeyframesemiselectedoverlay", - "d_curvekeyframeweighted","d_CustomSorting","d_DefaultSorting","d_EditCollider","d_editcollision_16", - "d_editconstraints_16","d_editicon.sml","d_endButton-On","d_endButton","d_eyeDropper.Large", - "d_eyeDropper.sml","d_Favorite","d_FilterByLabel","d_FilterByType","d_FilterSelectedOnly", - "d_FilterSelectedOnly@2x","d_forward","d_forward@2x","d_GEAR","d_Groove","d_HorizontalSplit", - "d_icon dropdown","d_InspectorLock","d_JointAngularLimits","d_leftBracket","d_Lighting", - "d_LightmapEditor.WindowTitle","d_LookDevCenterLight","d_LookDevCenterLight@2x","d_LookDevClose", - "d_LookDevClose@2x","d_LookDevEnvRotation","d_LookDevEnvRotation@2x","d_LookDevMirrorViews", - "d_LookDevMirrorViews@2x","d_LookDevMirrorViewsActive","d_LookDevMirrorViewsActive@2x", - "d_LookDevMirrorViewsInactive","d_LookDevMirrorViewsInactive@2x","d_LookDevObjRotation", - "d_LookDevObjRotation@2x","d_LookDevPaneOption","d_LookDevPaneOption@2x","d_LookDevResetEnv", - "d_LookDevResetEnv@2x","d_LookDevShadow","d_LookDevShadow@2x","d_LookDevSideBySide", - "d_LookDevSideBySide@2x","d_LookDevSingle1","d_LookDevSingle1@2x","d_LookDevSingle2", - "d_LookDevSingle2@2x","d_LookDevSplit","d_LookDevSplit@2x","d_LookDevZone","d_LookDevZone@2x", - "d_Mirror","d_model large","d_monologo","d_MoveTool on","d_MoveTool","d_Navigation","d_Occlusion", - "d_P4_AddedLocal","d_P4_AddedRemote","d_P4_CheckOutLocal","d_P4_CheckOutRemote","d_P4_Conflicted", - "d_P4_DeletedLocal","d_P4_DeletedRemote","d_P4_Local","d_P4_LockedLocal","d_P4_LockedRemote", - "d_P4_OutOfSync","d_Particle Effect","d_PauseButton On","d_PauseButton","d_PlayButton On","d_PlayButton", - "d_PlayButtonProfile On","d_PlayButtonProfile","d_playLoopOff","d_playLoopOn","d_preAudioAutoPlayOff", - "d_preAudioAutoPlayOn","d_preAudioLoopOff","d_preAudioLoopOn","d_preAudioPlayOff","d_preAudioPlayOn", - "d_PreMatCube","d_PreMatCylinder","d_PreMatLight0","d_PreMatLight1","d_PreMatSphere","d_PreMatTorus", - "d_Preset.Context","d_PreTextureAlpha","d_PreTextureMipMapHigh","d_PreTextureMipMapLow","d_PreTextureRGB", - "d_Profiler.Audio","d_Profiler.CPU","d_Profiler.FirstFrame","d_Profiler.GPU","d_Profiler.LastFrame", - "d_Profiler.Memory","d_Profiler.Network","d_Profiler.NextFrame","d_Profiler.Physics","d_Profiler.PrevFrame", - "d_Profiler.Record","d_Profiler.Rendering","d_Profiler.Video","d_ProfilerColumn.WarningCount","d_Project", - "d_RectTool On","d_RectTool","d_RectTransformBlueprint","d_RectTransformRaw","d_redGroove","d_Refresh", - "d_renderdoc","d_rightBracket","d_RotateTool On","d_RotateTool","d_ScaleTool On","d_ScaleTool", - "d_SceneViewAlpha","d_SceneViewAudio","d_SceneViewFx","d_SceneViewLighting","d_SceneViewOrtho", - "d_SceneViewRGB","d_ScrollShadow","d_Settings","d_SettingsIcon","d_SocialNetworks.FacebookShare", - "d_SocialNetworks.LinkedInShare","d_SocialNetworks.Tweet","d_SocialNetworks.UDNOpen","d_SpeedScale", - "d_StepButton On","d_StepButton","d_StepLeftButton-On","d_StepLeftButton","d_SVN_AddedLocal", - "d_SVN_Conflicted","d_SVN_DeletedLocal","d_SVN_Local","d_SVN_LockedLocal","d_SVN_OutOfSync","d_tab_next", - "d_tab_next@2x","d_tab_prev","d_tab_prev@2x","d_TerrainInspector.TerrainToolLower On", - "d_TerrainInspector.TerrainToolLowerAlt","d_TerrainInspector.TerrainToolPlants On", - "d_TerrainInspector.TerrainToolPlants","d_TerrainInspector.TerrainToolPlantsAlt On", - "d_TerrainInspector.TerrainToolPlantsAlt","d_TerrainInspector.TerrainToolRaise On", - "d_TerrainInspector.TerrainToolRaise","d_TerrainInspector.TerrainToolSetheight On", - "d_TerrainInspector.TerrainToolSetheight","d_TerrainInspector.TerrainToolSetheightAlt On", - "d_TerrainInspector.TerrainToolSetheightAlt","d_TerrainInspector.TerrainToolSettings On", - "d_TerrainInspector.TerrainToolSettings","d_TerrainInspector.TerrainToolSmoothHeight On", - "d_TerrainInspector.TerrainToolSmoothHeight","d_TerrainInspector.TerrainToolSplat On", - "d_TerrainInspector.TerrainToolSplat","d_TerrainInspector.TerrainToolSplatAlt On", - "d_TerrainInspector.TerrainToolSplatAlt","d_TerrainInspector.TerrainToolTrees On", - "d_TerrainInspector.TerrainToolTrees","d_TerrainInspector.TerrainToolTreesAlt On", - "d_TerrainInspector.TerrainToolTreesAlt","d_TimelineDigIn","d_TimelineEditModeMixOFF", - "d_TimelineEditModeMixON","d_TimelineEditModeReplaceOFF","d_TimelineEditModeReplaceON", - "d_TimelineEditModeRippleOFF","d_TimelineEditModeRippleON","d_TimelineSelector","d_Toolbar Minus", - "d_Toolbar Plus More","d_Toolbar Plus","d_ToolHandleCenter","d_ToolHandleGlobal","d_ToolHandleLocal", - "d_ToolHandlePivot","d_tranp","d_TransformTool On","d_TransformTool","d_tree_icon","d_tree_icon_branch", - "d_tree_icon_branch_frond","d_tree_icon_frond","d_tree_icon_leaf","d_TreeEditor.AddBranches", - "d_TreeEditor.AddLeaves","d_TreeEditor.Branch On","d_TreeEditor.Branch","d_TreeEditor.BranchFreeHand On", - "d_TreeEditor.BranchFreeHand","d_TreeEditor.BranchRotate On","d_TreeEditor.BranchRotate", - "d_TreeEditor.BranchScale On","d_TreeEditor.BranchScale","d_TreeEditor.BranchTranslate On", - "d_TreeEditor.BranchTranslate","d_TreeEditor.Distribution On","d_TreeEditor.Distribution", - "d_TreeEditor.Duplicate","d_TreeEditor.Geometry On","d_TreeEditor.Geometry","d_TreeEditor.Leaf On", - "d_TreeEditor.Leaf","d_TreeEditor.LeafFreeHand On","d_TreeEditor.LeafFreeHand","d_TreeEditor.LeafRotate On", - "d_TreeEditor.LeafRotate","d_TreeEditor.LeafScale On","d_TreeEditor.LeafScale", - "d_TreeEditor.LeafTranslate On","d_TreeEditor.LeafTranslate","d_TreeEditor.Material On", - "d_TreeEditor.Material","d_TreeEditor.Refresh","d_TreeEditor.Trash","d_TreeEditor.Wind On", - "d_TreeEditor.Wind","d_UnityEditor.AnimationWindow","d_UnityEditor.ConsoleWindow", - "d_UnityEditor.DebugInspectorWindow","d_UnityEditor.FindDependencies","d_UnityEditor.GameView", - "d_UnityEditor.HierarchyWindow","d_UnityEditor.InspectorWindow","d_UnityEditor.LookDevView", - "d_UnityEditor.ProfilerWindow","d_UnityEditor.SceneHierarchyWindow","d_UnityEditor.SceneView", - "d_UnityEditor.Timeline.TimelineWindow","d_UnityEditor.VersionControl","d_UnityLogo","d_VerticalSplit", - "d_ViewToolMove On","d_ViewToolMove","d_ViewToolOrbit On","d_ViewToolOrbit","d_ViewToolZoom On", - "d_ViewToolZoom","d_VisibilityOff","d_VisibilityOn","d_VUMeterTextureHorizontal","d_VUMeterTextureVertical", - "d_WaitSpin00","d_WaitSpin01","d_WaitSpin02","d_WaitSpin03","d_WaitSpin04","d_WaitSpin05","d_WaitSpin06", - "d_WaitSpin07","d_WaitSpin08","d_WaitSpin09","d_WaitSpin10","d_WaitSpin11","d_WelcomeScreen.AssetStoreLogo", - "d_winbtn_graph","d_winbtn_graph_close_h","d_winbtn_graph_max_h","d_winbtn_graph_min_h", - "d_winbtn_mac_close","d_winbtn_mac_close_a","d_winbtn_mac_close_h","d_winbtn_mac_inact","d_winbtn_mac_max", - "d_winbtn_mac_max_a","d_winbtn_mac_max_h","d_winbtn_mac_min","d_winbtn_mac_min_a","d_winbtn_mac_min_h", - "d_winbtn_win_close","d_winbtn_win_close_a","d_winbtn_win_close_h","d_winbtn_win_max","d_winbtn_win_max_a", - "d_winbtn_win_max_h","d_winbtn_win_min","d_winbtn_win_min_a","d_winbtn_win_min_h","d_winbtn_win_rest", - "d_winbtn_win_rest_a","d_winbtn_win_rest_h","DefaultSorting","EditCollider","editcollision_16", - "editconstraints_16","editicon.sml","endButton-On","endButton","eyeDropper.Large","eyeDropper.sml", - "Favorite","FilterByLabel","FilterByType","FilterSelectedOnly","FilterSelectedOnly@2x","forward", - "forward@2x","GEAR","Grid.BoxTool","Grid.Default","Grid.EraserTool","Grid.FillTool","Grid.MoveTool", - "Grid.PaintTool","Grid.PickingTool","Grid.SelectTool","Groove","align_horizontally", - "align_horizontally_center","align_horizontally_center_active","align_horizontally_left", - "align_horizontally_left_active","align_horizontally_right","align_horizontally_right_active", - "align_vertically","align_vertically_bottom","align_vertically_bottom_active","align_vertically_center", - "align_vertically_center_active","align_vertically_top","align_vertically_top_active", - "d_align_horizontally","d_align_horizontally_center","d_align_horizontally_center_active", - "d_align_horizontally_left","d_align_horizontally_left_active","d_align_horizontally_right", - "d_align_horizontally_right_active","d_align_vertically","d_align_vertically_bottom", - "d_align_vertically_bottom_active","d_align_vertically_center","d_align_vertically_center_active", - "d_align_vertically_top","d_align_vertically_top_active","HorizontalSplit","icon dropdown", - "InspectorLock","JointAngularLimits","KnobCShape","KnobCShapeMini","leftBracket","Lighting", - "LightmapEditor.WindowTitle","Lightmapping","d_greenLight","d_lightOff","d_lightRim","d_orangeLight", - "d_redLight","greenLight","lightOff","lightRim","orangeLight","redLight","LockIcon-On","LockIcon", - "LookDevCenterLight","LookDevCenterLightl@2x","LookDevClose","LookDevClose@2x","LookDevEnvRotation", - "LookDevEnvRotation@2x","LookDevEyedrop","LookDevLight","LookDevLight@2x","LookDevMirrorViewsActive", - "LookDevMirrorViewsActive@2x","LookDevMirrorViewsInactive","LookDevMirrorViewsInactive@2x", - "LookDevObjRotation","LookDevObjRotation@2x","LookDevPaneOption","LookDevPaneOption@2x","LookDevResetEnv", - "LookDevResetEnv@2x","LookDevShadow","LookDevShadow@2x","LookDevShadowFrame","LookDevShadowFrame@2x", - "LookDevSideBySide","LookDevSideBySide@2x","LookDevSingle1","LookDevSingle1@2x","LookDevSingle2", - "LookDevSingle2@2x","LookDevSplit","LookDevSplit@2x","LookDevZone","LookDevZone@2x","loop","Mirror", - "monologo","MoveTool on","MoveTool","Navigation","Occlusion","P4_AddedLocal","P4_AddedRemote", - "P4_BlueLeftParenthesis","P4_BlueRightParenthesis","P4_CheckOutLocal","P4_CheckOutRemote","P4_Conflicted", - "P4_DeletedLocal","P4_DeletedRemote","P4_Local","P4_LockedLocal","P4_LockedRemote","P4_OutOfSync", - "P4_RedLeftParenthesis","P4_RedRightParenthesis","P4_Updating","PackageBadgeDelete","PackageBadgeNew", - "Particle Effect","PauseButton On","PauseButton","PlayButton On","PlayButton","PlayButtonProfile On", - "PlayButtonProfile","playLoopOff","playLoopOn","playSpeed","preAudioAutoPlayOff","preAudioAutoPlayOn", - "preAudioLoopOff","preAudioLoopOn","preAudioPlayOff","preAudioPlayOn","PreMatCube","PreMatCylinder", - "PreMatLight0","PreMatLight1","PreMatQuad","PreMatSphere","PreMatTorus","Preset.Context","PreTextureAlpha", - "PreTextureArrayFirstSlice","PreTextureArrayLastSlice","PreTextureMipMapHigh","PreTextureMipMapLow", - "PreTextureRGB","AreaLight Gizmo","AreaLight Icon","Assembly Icon","AssetStore Icon","AudioMixerView Icon", - "AudioSource Gizmo","Camera Gizmo","CGProgram Icon","ChorusFilter Icon","CollabChanges Icon", - "CollabChangesConflict Icon","CollabChangesDeleted Icon","CollabConflict Icon","CollabCreate Icon", - "CollabDeleted Icon","CollabEdit Icon","CollabExclude Icon","CollabMoved Icon","cs Script Icon", - "d_AudioMixerView Icon","d_CollabChanges Icon","d_CollabChangesConflict Icon","d_CollabChangesDeleted Icon", - "d_CollabConflict Icon","d_CollabCreate Icon","d_CollabDeleted Icon","d_CollabEdit Icon", - "d_CollabExclude Icon","d_CollabMoved Icon","d_GridLayoutGroup Icon","d_HorizontalLayoutGroup Icon", - "d_Prefab Icon","d_PrefabModel Icon","d_PrefabVariant Icon","d_VerticalLayoutGroup Icon", - "DefaultSlate Icon","DirectionalLight Gizmo","DirectionalLight Icon","DiscLight Gizmo","DiscLight Icon", - "dll Script Icon","EchoFilter Icon","Favorite Icon","Folder Icon","FolderEmpty Icon", - "FolderFavorite Icon","GameManager Icon","GridBrush Icon","HighPassFilter Icon", - "HorizontalLayoutGroup Icon","LensFlare Gizmo","LightingDataAssetParent Icon","LightProbeGroup Gizmo", - "LightProbeProxyVolume Gizmo","LowPassFilter Icon","Main Light Gizmo","MetaFile Icon", - "Microphone Icon","MuscleClip Icon","ParticleSystem Gizmo","PointLight Gizmo","Prefab Icon", - "PrefabModel Icon","PrefabOverlayAdded Icon","PrefabOverlayModified Icon","PrefabOverlayRemoved Icon", - "PrefabVariant Icon","Projector Gizmo","RaycastCollider Icon","ReflectionProbe Gizmo", - "ReverbFilter Icon","SceneSet Icon","Search Icon","SoftlockProjectBrowser Icon","SpeedTreeModel Icon", - "SpotLight Gizmo","Spotlight Icon","SpriteCollider Icon","sv_icon_dot0_pix16_gizmo", - "sv_icon_dot10_pix16_gizmo","sv_icon_dot11_pix16_gizmo","sv_icon_dot12_pix16_gizmo", - "sv_icon_dot13_pix16_gizmo","sv_icon_dot14_pix16_gizmo","sv_icon_dot15_pix16_gizmo", - "sv_icon_dot1_pix16_gizmo","sv_icon_dot2_pix16_gizmo","sv_icon_dot3_pix16_gizmo", - "sv_icon_dot4_pix16_gizmo","sv_icon_dot5_pix16_gizmo","sv_icon_dot6_pix16_gizmo", - "sv_icon_dot7_pix16_gizmo","sv_icon_dot8_pix16_gizmo","sv_icon_dot9_pix16_gizmo", - "AnimatorController Icon","AnimatorState Icon","AnimatorStateMachine Icon", - "AnimatorStateTransition Icon","BlendTree Icon","AnimationWindowEvent Icon","AudioMixerController Icon", - "DefaultAsset Icon","EditorSettings Icon","AnyStateNode Icon","HumanTemplate Icon", - "LightingDataAsset Icon","LightmapParameters Icon","Preset Icon","SceneAsset Icon", - "SubstanceArchive Icon","AssemblyDefinitionAsset Icon","NavMeshAgent Icon","NavMeshData Icon", - "NavMeshObstacle Icon","OffMeshLink Icon","AnalyticsTracker Icon","Animation Icon", - "AnimationClip Icon","AimConstraint Icon","d_AimConstraint Icon","d_LookAtConstraint Icon", - "d_ParentConstraint Icon","d_PositionConstraint Icon","d_RotationConstraint Icon", - "d_ScaleConstraint Icon","LookAtConstraint Icon","ParentConstraint Icon","PositionConstraint Icon", - "RotationConstraint Icon","ScaleConstraint Icon","Animator Icon","AnimatorOverrideController Icon", - "AreaEffector2D Icon","AudioMixerGroup Icon","AudioMixerSnapshot Icon","AudioSpatializerMicrosoft Icon", - "AudioChorusFilter Icon","AudioClip Icon","AudioDistortionFilter Icon","AudioEchoFilter Icon", - "AudioHighPassFilter Icon","AudioListener Icon","AudioLowPassFilter Icon","AudioReverbFilter Icon", - "AudioReverbZone Icon","AudioSource Icon","Avatar Icon","AvatarMask Icon","BillboardAsset Icon", - "BillboardRenderer Icon","BoxCollider Icon","BoxCollider2D Icon","BuoyancyEffector2D Icon","Camera Icon", - "Canvas Icon","CanvasGroup Icon","CanvasRenderer Icon","CapsuleCollider Icon","CapsuleCollider2D Icon", - "CharacterController Icon","CharacterJoint Icon","CircleCollider2D Icon","Cloth Icon", - "CompositeCollider2D Icon","ComputeShader Icon","ConfigurableJoint Icon","ConstantForce Icon", - "ConstantForce2D Icon","Cubemap Icon","d_Canvas Icon","d_CanvasGroup Icon","d_CanvasRenderer Icon", - "d_GameObject Icon","d_LightProbeProxyVolume Icon","d_ParticleSystem Icon","d_ParticleSystemForceField Icon", - "d_RectTransform Icon","d_StreamingController Icon","DistanceJoint2D Icon","EdgeCollider2D Icon", - "d_EventSystem Icon","d_EventTrigger Icon","d_Physics2DRaycaster Icon","d_PhysicsRaycaster Icon", - "d_StandaloneInputModule Icon","d_TouchInputModule Icon","EventSystem Icon","EventTrigger Icon", - "HoloLensInputModule Icon","Physics2DRaycaster Icon","PhysicsRaycaster Icon","StandaloneInputModule Icon", - "TouchInputModule Icon","SpriteShapeRenderer Icon","VisualTreeAsset Icon","d_VisualEffect Icon", - "d_VisualEffectAsset Icon","VisualEffect Icon","VisualEffectAsset Icon","FixedJoint Icon", - "FixedJoint2D Icon","Flare Icon","FlareLayer Icon","Font Icon","FrictionJoint2D Icon", - "GameObject Icon","Grid Icon","GUILayer Icon","GUISkin Icon","GUIText Icon","GUITexture Icon", - "Halo Icon","HingeJoint Icon","HingeJoint2D Icon","LensFlare Icon","Light Icon","LightProbeGroup Icon", - "LightProbeProxyVolume Icon","LightProbes Icon","LineRenderer Icon","LODGroup Icon","Material Icon", - "Mesh Icon","MeshCollider Icon","MeshFilter Icon","MeshRenderer Icon","Motion Icon","MovieTexture Icon", - "NetworkAnimator Icon","NetworkDiscovery Icon","NetworkIdentity Icon","NetworkLobbyManager Icon", - "NetworkLobbyPlayer Icon","NetworkManager Icon","NetworkManagerHUD Icon","NetworkMigrationManager Icon", - "NetworkProximityChecker Icon","NetworkStartPosition Icon","NetworkTransform Icon", - "NetworkTransformChild Icon","NetworkTransformVisualizer Icon","NetworkView Icon","OcclusionArea Icon", - "OcclusionPortal Icon","ParticleSystem Icon","ParticleSystemForceField Icon","PhysicMaterial Icon", - "PhysicsMaterial2D Icon","PlatformEffector2D Icon","d_PlayableDirector Icon","PlayableDirector Icon", - "PointEffector2D Icon","PolygonCollider2D Icon","ProceduralMaterial Icon","Projector Icon", - "RectTransform Icon","ReflectionProbe Icon","RelativeJoint2D Icon","d_SortingGroup Icon", - "SortingGroup Icon","RenderTexture Icon","Rigidbody Icon","Rigidbody2D Icon","ScriptableObject Icon", - "Shader Icon","ShaderVariantCollection Icon","SkinnedMeshRenderer Icon","Skybox Icon","SliderJoint2D Icon", - "TrackedPoseDriver Icon","SphereCollider Icon","SpringJoint Icon","SpringJoint2D Icon","Sprite Icon", - "SpriteMask Icon","SpriteRenderer Icon","StreamingController Icon","StyleSheet Icon","SurfaceEffector2D Icon", - "TargetJoint2D Icon","Terrain Icon","TerrainCollider Icon","TerrainData Icon","TextAsset Icon", - "TextMesh Icon","Texture Icon","Texture2D Icon","Tile Icon","Tilemap Icon","TilemapCollider2D Icon", - "TilemapRenderer Icon","d_TimelineAsset Icon","TimelineAsset Icon","TrailRenderer Icon","Transform Icon", - "SpriteAtlas Icon","AspectRatioFitter Icon","Button Icon","CanvasScaler Icon","ContentSizeFitter Icon", - "d_AspectRatioFitter Icon","d_CanvasScaler Icon","d_ContentSizeFitter Icon","d_FreeformLayoutGroup Icon", - "d_GraphicRaycaster Icon","d_GridLayoutGroup Icon","d_HorizontalLayoutGroup Icon","d_LayoutElement Icon", - "d_PhysicalResolution Icon","d_ScrollViewArea Icon","d_SelectionList Icon","d_SelectionListItem Icon", - "d_SelectionListTemplate Icon","d_VerticalLayoutGroup Icon","Dropdown Icon","FreeformLayoutGroup Icon", - "GraphicRaycaster Icon","GridLayoutGroup Icon","HorizontalLayoutGroup Icon","Image Icon","InputField Icon", - "LayoutElement Icon","Mask Icon","Outline Icon","PositionAsUV1 Icon","RawImage Icon","RectMask2D Icon", - "Scrollbar Icon","ScrollRect Icon","Selectable Icon","Shadow Icon","Slider Icon","Text Icon","Toggle Icon", - "ToggleGroup Icon","VerticalLayoutGroup Icon","VideoClip Icon","VideoPlayer Icon","VisualEffect Icon", - "VisualEffectAsset Icon","WheelCollider Icon","WheelJoint2D Icon","WindZone Icon", - "SpatialMappingCollider Icon","SpatialMappingRenderer Icon","WorldAnchor Icon","UssScript Icon", - "UxmlScript Icon","VerticalLayoutGroup Icon","VideoEffect Icon","VisualEffect Gizmo", - "VisualEffectAsset Icon","AnchorBehaviour Icon","AnchorInputListenerBehaviour Icon", - "AnchorStageBehaviour Icon","CloudRecoBehaviour Icon","ContentPlacementBehaviour Icon", - "ContentPositioningBehaviour Icon","CylinderTargetBehaviour Icon","d_AnchorBehaviour Icon", - "d_AnchorInputListenerBehaviour Icon","d_AnchorStageBehaviour Icon","d_CloudRecoBehaviour Icon", - "d_ContentPlacementBehaviour Icon","d_ContentPositioningBehaviour Icon","d_CylinderTargetBehaviour Icon", - "d_ImageTargetBehaviour Icon","d_MidAirPositionerBehaviour Icon","d_ModelTargetBehaviour Icon", - "d_MultiTargetBehaviour Icon","d_ObjectTargetBehaviour Icon","d_PlaneFinderBehaviour Icon", - "d_UserDefinedTargetBuildingBehaviour Icon","d_VirtualButtonBehaviour Icon","d_VuforiaBehaviour Icon", - "d_VuMarkBehaviour Icon","d_WireframeBehaviour Icon","ImageTargetBehaviour Icon", - "MidAirPositionerBehaviour Icon","ModelTargetBehaviour Icon","MultiTargetBehaviour Icon", - "ObjectTargetBehaviour Icon","PlaneFinderBehaviour Icon","UserDefinedTargetBuildingBehaviour Icon", - "VirtualButtonBehaviour Icon","VuforiaBehaviour Icon","VuMarkBehaviour Icon","WireframeBehaviour Icon", - "WindZone Gizmo","Profiler.Audio","Profiler.CPU","Profiler.FirstFrame","Profiler.GlobalIllumination", - "Profiler.GPU","Profiler.Instrumentation","Profiler.LastFrame","Profiler.Memory","Profiler.NetworkMessages", - "Profiler.NetworkOperations","Profiler.NextFrame","Profiler.Physics","Profiler.Physics2D", - "Profiler.PrevFrame","Profiler.Record","Profiler.Rendering","Profiler.UI","Profiler.UIDetails", - "Profiler.Video","ProfilerColumn.WarningCount","Project","RectTool On","RectTool","RectTransformBlueprint", - "RectTransformRaw","redGroove","Refresh","renderdoc","rightBracket","RotateTool On","RotateTool", - "SaveActive","SaveFromPlay","SavePassive","ScaleTool On","ScaleTool","SceneLoadIn","SceneLoadOut", - "SceneSave","SceneSaveGrey","SceneViewAlpha","SceneViewAudio","SceneViewFx","SceneViewLighting", - "SceneViewOrtho","SceneViewRGB","ScrollShadow","Settings","SettingsIcon","SocialNetworks.FacebookShare", - "SocialNetworks.LinkedInShare","SocialNetworks.Tweet","SocialNetworks.UDNLogo","SocialNetworks.UDNOpen", - "SoftlockInline","SpeedScale","StateMachineEditor.ArrowTip","StateMachineEditor.ArrowTipSelected", - "StateMachineEditor.Background","StateMachineEditor.State","StateMachineEditor.StateHover", - "StateMachineEditor.StateSelected","StateMachineEditor.StateSub","StateMachineEditor.StateSubHover", - "StateMachineEditor.StateSubSelected","StateMachineEditor.UpButton","StateMachineEditor.UpButtonHover", - "StepButton On","StepButton","StepLeftButton-On","StepLeftButton","sticky_arrow","sticky_p4","sticky_skin", - "sv_icon_dot0_sml","sv_icon_dot10_sml","sv_icon_dot11_sml","sv_icon_dot12_sml","sv_icon_dot13_sml", - "sv_icon_dot14_sml","sv_icon_dot15_sml","sv_icon_dot1_sml","sv_icon_dot2_sml","sv_icon_dot3_sml", - "sv_icon_dot4_sml","sv_icon_dot5_sml","sv_icon_dot6_sml","sv_icon_dot7_sml","sv_icon_dot8_sml", - "sv_icon_dot9_sml","sv_icon_name0","sv_icon_name1","sv_icon_name2","sv_icon_name3","sv_icon_name4", - "sv_icon_name5","sv_icon_name6","sv_icon_name7","sv_icon_none","sv_label_0","sv_label_1","sv_label_2", - "sv_label_3","sv_label_4","sv_label_5","sv_label_6","sv_label_7","SVN_AddedLocal","SVN_Conflicted", - "SVN_DeletedLocal","SVN_Local","SVN_LockedLocal","SVN_OutOfSync","tab_next","tab_next@2x","tab_prev", - "tab_prev@2x","TerrainInspector.TerrainToolLower On","TerrainInspector.TerrainToolLower", - "TerrainInspector.TerrainToolLowerAlt","TerrainInspector.TerrainToolPlants On", - "TerrainInspector.TerrainToolPlants","TerrainInspector.TerrainToolPlantsAlt On", - "TerrainInspector.TerrainToolPlantsAlt","TerrainInspector.TerrainToolRaise On", - "TerrainInspector.TerrainToolRaise","TerrainInspector.TerrainToolSculpt On", - "TerrainInspector.TerrainToolSculpt","TerrainInspector.TerrainToolSetheight On", - "TerrainInspector.TerrainToolSetheight","TerrainInspector.TerrainToolSetheightAlt On", - "TerrainInspector.TerrainToolSetheightAlt","TerrainInspector.TerrainToolSettings On", - "TerrainInspector.TerrainToolSettings","TerrainInspector.TerrainToolSmoothHeight On", - "TerrainInspector.TerrainToolSmoothHeight","TerrainInspector.TerrainToolSplat On", - "TerrainInspector.TerrainToolSplat","TerrainInspector.TerrainToolSplatAlt On", - "TerrainInspector.TerrainToolSplatAlt","TerrainInspector.TerrainToolTrees On", - "TerrainInspector.TerrainToolTrees","TerrainInspector.TerrainToolTreesAlt On", - "TerrainInspector.TerrainToolTreesAlt","TestFailed","TestIgnored","TestInconclusive","TestNormal", - "TestPassed","TestStopwatch","TimelineClipBG","TimelineClipFG","TimelineDigIn","TimelineEditModeMixOFF", - "TimelineEditModeMixON","TimelineEditModeReplaceOFF","TimelineEditModeReplaceON","TimelineEditModeRippleOFF", - "TimelineEditModeRippleON","TimelineSelector","Toolbar Minus","Toolbar Plus More","Toolbar Plus", - "ToolHandleCenter","ToolHandleGlobal","ToolHandleLocal","ToolHandlePivot","tranp","TransformTool On", - "TransformTool","tree_icon","tree_icon_branch","tree_icon_branch_frond","tree_icon_frond","tree_icon_leaf", - "TreeEditor.AddBranches","TreeEditor.AddLeaves","TreeEditor.Branch On","TreeEditor.Branch", - "TreeEditor.BranchFreeHand On","TreeEditor.BranchFreeHand","TreeEditor.BranchRotate On", - "TreeEditor.BranchRotate","TreeEditor.BranchScale On","TreeEditor.BranchScale", - "TreeEditor.BranchTranslate On","TreeEditor.BranchTranslate","TreeEditor.Distribution On", - "TreeEditor.Distribution","TreeEditor.Duplicate","TreeEditor.Geometry On","TreeEditor.Geometry", - "TreeEditor.Leaf On","TreeEditor.Leaf","TreeEditor.LeafFreeHand On","TreeEditor.LeafFreeHand", - "TreeEditor.LeafRotate On","TreeEditor.LeafRotate","TreeEditor.LeafScale On","TreeEditor.LeafScale", - "TreeEditor.LeafTranslate On","TreeEditor.LeafTranslate","TreeEditor.Material On","TreeEditor.Material", - "TreeEditor.Refresh","TreeEditor.Trash","TreeEditor.Wind On","TreeEditor.Wind","UnityEditor.AnimationWindow", - "UnityEditor.ConsoleWindow","UnityEditor.DebugInspectorWindow","UnityEditor.FindDependencies", - "UnityEditor.GameView","UnityEditor.Graphs.AnimatorControllerTool","UnityEditor.HierarchyWindow", - "UnityEditor.InspectorWindow","UnityEditor.LookDevView","UnityEditor.ProfilerWindow", - "UnityEditor.SceneHierarchyWindow","UnityEditor.SceneView","UnityEditor.Timeline.TimelineWindow", - "UnityEditor.VersionControl","UnityLogo","UnityLogoLarge","UpArrow","vcs_add","vcs_branch","vcs_change", - "vcs_check","vcs_delete","vcs_document","vcs_edit","vcs_incoming","vcs_integrate","vcs_local","vcs_lock", - "vcs_refresh","vcs_sync","vcs_unresolved","vcs_update","VerticalSplit","ViewToolMove On","ViewToolMove", - "ViewToolOrbit On","ViewToolOrbit","ViewToolZoom On","ViewToolZoom","VisibilityOff","VisibilityOn", - "VisualEffect Gizmo","VUMeterTextureHorizontal","VUMeterTextureVertical","WaitSpin00","WaitSpin01", - "WaitSpin02","WaitSpin03","WaitSpin04","WaitSpin05","WaitSpin06","WaitSpin07","WaitSpin08","WaitSpin09", - "WaitSpin10","WaitSpin11","WelcomeScreen.AssetStoreLogo","winbtn_graph","winbtn_graph_close_h", - "winbtn_graph_max_h","winbtn_graph_min_h","winbtn_mac_close","winbtn_mac_close_a","winbtn_mac_close_h", - "winbtn_mac_inact","winbtn_mac_max","winbtn_mac_max_a","winbtn_mac_max_h","winbtn_mac_min", - "winbtn_mac_min_a","winbtn_mac_min_h","winbtn_win_close","winbtn_win_close_a","winbtn_win_close_h", - "winbtn_win_max","winbtn_win_max_a","winbtn_win_max_h","winbtn_win_min","winbtn_win_min_a", - "winbtn_win_min_h","winbtn_win_rest","winbtn_win_rest_a","winbtn_win_rest_h", - "AvatarInspector/RightFingersIk","AvatarInspector/LeftFingersIk","AvatarInspector/RightFeetIk", - "AvatarInspector/LeftFeetIk","AvatarInspector/RightFingers","AvatarInspector/LeftFingers", - "AvatarInspector/RightArm","AvatarInspector/LeftArm","AvatarInspector/RightLeg","AvatarInspector/LeftLeg", - "AvatarInspector/Head","AvatarInspector/Torso","AvatarInspector/MaskEditor_Root", - "AvatarInspector/BodyPartPicker","AvatarInspector/BodySIlhouette","boo Script Icon","js Script Icon", - "EyeDropper.Large","AboutWindow.MainHeader","AgeiaLogo","MonoLogo","PlayButtonProfile Anim", - "StepButton Anim","PauseButton Anim","PlayButton Anim","MoveTool On","Icon Dropdown", - "AvatarInspector/DotSelection","AvatarInspector/DotFrameDotted","AvatarInspector/DotFrame", - "AvatarInspector/DotFill","AvatarInspector/RightHandZoom","AvatarInspector/LeftHandZoom", - "AvatarInspector/HeadZoom","AvatarInspector/RightLeg","AvatarInspector/LeftLeg", - "AvatarInspector/RightFingers","AvatarInspector/RightArm","AvatarInspector/LeftFingers", - "AvatarInspector/LeftArm","AvatarInspector/Head","AvatarInspector/Torso", - "AvatarInspector/RightHandZoomSilhouette","AvatarInspector/LeftHandZoomSilhouette", - "AvatarInspector/HeadZoomSilhouette","AvatarInspector/BodySilhouette","lightMeter/redLight", - "lightMeter/orangeLight","lightMeter/lightRim","lightMeter/greenLight","SceneviewAudio", - "SceneviewLighting","TerrainInspector.TerrainToolSetHeight","AS Badge New","AS Badge Move", - "AS Badge Delete","WelcomeScreen.UnityAnswersLogo","WelcomeScreen.UnityForumLogo", - "WelcomeScreen.UnityBasicsLogo","WelcomeScreen.VideoTutLogo","WelcomeScreen.MainHeader","Icon Dropdown", - "PrefabNormal Icon","PrefabNormal Icon","BuildSettings.BlackBerry.Small","BuildSettings.Tizen.Small", - "BuildSettings.XBox360.Small","BuildSettings.PS3.Small","BuildSettings.SamsungTV.Small", - "BuildSettings.BlackBerry","BuildSettings.Tizen","BuildSettings.XBox360","BuildSettings.PS3", - "BuildSettings.SamsungTV" - }; - - #endregion -} -#endif \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/EditorIcons.cs.meta b/Client/Assets/Scripts/Editor/EditorIcons.cs.meta deleted file mode 100644 index 4f8466f..0000000 --- a/Client/Assets/Scripts/Editor/EditorIcons.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d2587064bc4bba04fa2d3a699768d647 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas.meta b/Client/Assets/Scripts/Editor/Postprocessor/Atlas.meta deleted file mode 100644 index 72dfcbe..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ad986817a2f94919a9063c0f45cbfd78 -timeCreated: 1738748198 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs deleted file mode 100644 index 64b75f7..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs +++ /dev/null @@ -1,24 +0,0 @@ -// AtlasConfiguration.cs - -using UnityEditor; -using UnityEngine; - -[FilePath("ProjectSettings/AtlasConfiguration.asset",FilePathAttribute.Location.ProjectFolder)] -public class AtlasConfiguration : ScriptableSingleton -{ - [Header("Directory Settings")] - public string atlasOutputPath = "Assets/Art/Atlas"; - public string rawUIPath = "Assets/Art/UI/Raw"; - public string uiAtlasPath = "Assets/Art/UI/Atlases"; - - [Header("Texture Settings")] - public TextureImporterFormat androidFormat = TextureImporterFormat.ASTC_6x6; - public TextureImporterFormat iosFormat = TextureImporterFormat.ASTC_5x5; - public TextureImporterFormat webglFormat = TextureImporterFormat.ASTC_6x6; - public int compressionQuality = 50; - - [Header("Packing Settings")] - public int padding = 2; - public bool enableRotation = true; - public int blockOffset = 1; -} diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs.meta b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs.meta deleted file mode 100644 index e327d2f..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasConfiguration.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3b1dfcbf9ece40758a159f4edb04e983 -timeCreated: 1738748213 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs deleted file mode 100644 index a6e9de8..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs +++ /dev/null @@ -1,76 +0,0 @@ -// AtlasEditorWindow.cs - -using AlicizaX.Editor.Extension; -using UnityEditor; -using UnityEngine; - -public class AtlasEditorWindow : EditorWindow -{ - private AtlasConfiguration config; - private Vector2 scrollPos; - - [EditorToolFunction("图集工具",typeof(AtlasEditorWindow))] - public static void ShowWindow() - { - GetWindow("图集打包"); - } - - private void OnEnable() - { - LoadOrCreateConfig(); - } - - private void LoadOrCreateConfig() - { - config = AtlasConfiguration.instance; - } - - private void OnGUI() - { - scrollPos = EditorGUILayout.BeginScrollView(scrollPos); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Atlas Configuration", EditorStyles.boldLabel); - - if (config == null) return; - - DrawConfigurationGUI(); - EditorGUILayout.EndScrollView(); - } - - private void DrawConfigurationGUI() - { - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Paths", EditorStyles.boldLabel); - config.atlasOutputPath = EditorGUILayout.TextField("Atlas Output", config.atlasOutputPath); - config.rawUIPath = EditorGUILayout.TextField("Raw UI Path", config.rawUIPath); - config.uiAtlasPath = EditorGUILayout.TextField("UI Atlas Path", config.uiAtlasPath); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Texture Settings", EditorStyles.boldLabel); - config.androidFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("Android Format", config.androidFormat); - config.iosFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("iOS Format", config.iosFormat); - config.webglFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("WebGL Format", config.webglFormat); - config.compressionQuality = EditorGUILayout.IntSlider("Compression Quality", - config.compressionQuality, 0, 100); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Packing Settings", EditorStyles.boldLabel); - config.padding = EditorGUILayout.IntField("Padding", config.padding); - config.enableRotation = EditorGUILayout.Toggle("Enable Rotation", config.enableRotation); - config.blockOffset = EditorGUILayout.IntField("Block Offset", config.blockOffset); - - if (EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(config); - } - - EditorGUILayout.Space(); - if (GUILayout.Button("Force Rebuild All Atlases", GUILayout.Height(30))) - { - AtlasProcessor.ForceRebuildAtlases(config); - } - } -} diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs.meta b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs.meta deleted file mode 100644 index 1487f78..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasEditorWindow.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 42f94205e1cf43a0b15a96e17838c8b3 -timeCreated: 1738748236 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs deleted file mode 100644 index 6971134..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs +++ /dev/null @@ -1,37 +0,0 @@ -// AtlasPostprocessor.cs -using UnityEditor; -using UnityEngine; - -public class AtlasPostprocessor : AssetPostprocessor -{ - private static AtlasConfiguration config; - - private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, - string[] movedAssets, string[] movedFromAssetPaths) - { - if (config == null) - { - config = AtlasConfiguration.instance; - } - if (config == null) return; - - foreach (var path in importedAssets) HandleAsset(path); - foreach (var path in movedAssets) HandleAsset(path); - foreach (var path in deletedAssets) HandleDeletedAsset(path); - foreach (var path in movedFromAssetPaths) HandleDeletedAsset(path); - } - - private static void HandleAsset(string path) - { - if (path.EndsWith(".png") || path.EndsWith(".jpg")) - { - AtlasProcessor.ProcessSingleSprite(path, config); - } - } - - private static void HandleDeletedAsset(string path) - { - // Handle removed sprites from atlases - // Implementation depends on tracking system - } -} diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs.meta b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs.meta deleted file mode 100644 index ecc3c6f..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasPostprocessor.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1cf727bde4a5479b919d41cb8224d94b -timeCreated: 1738748276 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs deleted file mode 100644 index 92e4599..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs +++ /dev/null @@ -1,210 +0,0 @@ -// AtlasProcessor.cs -using System.Collections.Generic; -using System.IO; -using UnityEditor; -using UnityEditor.U2D; -using UnityEngine; -using UnityEngine.U2D; - -public static class AtlasProcessor -{ - private static readonly HashSet DirtyAtlas = new HashSet(); - private static readonly Dictionary> AtlasContents = - new Dictionary>(); - - public static void ForceRebuildAtlases(AtlasConfiguration config) - { - InitializeAtlasData(config); - ProcessAllSprites(config); - PackAllAtlases(config); - } - - private static void InitializeAtlasData(AtlasConfiguration config) - { - AtlasContents.Clear(); - var atlasGuids = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { config.atlasOutputPath }); - - foreach (var guid in atlasGuids) - { - var path = AssetDatabase.GUIDToAssetPath(guid); - var atlas = AssetDatabase.LoadAssetAtPath(path); - if (atlas == null) continue; - - var atlasName = Path.GetFileNameWithoutExtension(path); - var packed = atlas.GetPackables(); - AtlasContents[atlasName] = new HashSet(); - - foreach (var obj in packed) - { - var assetPath = AssetDatabase.GetAssetPath(obj); - if (!string.IsNullOrEmpty(assetPath)) - { - AtlasContents[atlasName].Add(assetPath); - } - } - } - } - - private static void ProcessAllSprites(AtlasConfiguration config) - { - var allSprites = AssetDatabase.FindAssets("t:Sprite", new[] { config.rawUIPath }); - foreach (var guid in allSprites) - { - var path = AssetDatabase.GUIDToAssetPath(guid); - ProcessSingleSprite(path, config); - } - } - - public static void ProcessSingleSprite(string path, AtlasConfiguration config) - { - if (!path.StartsWith(config.rawUIPath)) return; - - var importer = AssetImporter.GetAtPath(path) as TextureImporter; - if (importer == null) return; - - ConfigureTextureImporter(importer, config); - AddToAtlas(path, config); - } - - private static void ConfigureTextureImporter(TextureImporter importer, AtlasConfiguration config) - { - var changed = false; - var settings = new TextureImporterSettings(); - importer.ReadTextureSettings(settings); - - if (importer.textureType != TextureImporterType.Sprite) - { - importer.textureType = TextureImporterType.Sprite; - changed = true; - } - - if (settings.spriteGenerateFallbackPhysicsShape) - { - settings.spriteGenerateFallbackPhysicsShape = false; - importer.SetTextureSettings(settings); - changed = true; - } - - ApplyPlatformSettings(importer, "Android", config.androidFormat, config); - ApplyPlatformSettings(importer, "iPhone", config.iosFormat, config); - ApplyPlatformSettings(importer, "WebGL", config.webglFormat, config); - - if (changed) importer.SaveAndReimport(); - } - - private static void ApplyPlatformSettings(TextureImporter importer, string platform, - TextureImporterFormat format, AtlasConfiguration config) - { - var settings = importer.GetPlatformTextureSettings(platform); - if (!settings.overridden || settings.format != format || - settings.compressionQuality != config.compressionQuality) - { - settings.overridden = true; - settings.format = format; - settings.compressionQuality = config.compressionQuality; - importer.SetPlatformTextureSettings(settings); - } - } - - private static void AddToAtlas(string spritePath, AtlasConfiguration config) - { - var atlasName = GetAtlasName(spritePath, config); - if (string.IsNullOrEmpty(atlasName)) return; - - if (!AtlasContents.TryGetValue(atlasName, out var paths)) - { - paths = new HashSet(); - AtlasContents[atlasName] = paths; - } - - if (paths.Add(spritePath)) DirtyAtlas.Add(atlasName); - } - - private static string GetAtlasName(string path, AtlasConfiguration config) - { - var relativePath = path.Replace(config.rawUIPath, "").TrimStart('/'); - var directory = Path.GetDirectoryName(relativePath); - return directory?.Replace("/", "_"); - } - - private static void PackAllAtlases(AtlasConfiguration config) - { - foreach (var atlasName in DirtyAtlas) - { - CreateOrUpdateAtlas(atlasName, config); - } - DirtyAtlas.Clear(); - - SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget); - AssetDatabase.SaveAssets(); - } - - private static void CreateOrUpdateAtlas(string atlasName, AtlasConfiguration config) - { - if (!System.IO.Directory.Exists(config.atlasOutputPath)) - { - Directory.CreateDirectory(config.atlasOutputPath); - } - var path = $"{config.atlasOutputPath}/{atlasName}.spriteatlas"; - var atlas = AssetDatabase.LoadAssetAtPath(path) ?? new SpriteAtlas(); - - ConfigureAtlasSettings(atlas, config); - AddSpritesToAtlas(atlas, AtlasContents[atlasName]); - - if (!AssetDatabase.Contains(atlas)) - { - AssetDatabase.CreateAsset(atlas, path); - } - else - { - EditorUtility.SetDirty(atlas); - } - } - - private static void ConfigureAtlasSettings(SpriteAtlas atlas, AtlasConfiguration config) - { - // Packing Settings - var packingSettings = new SpriteAtlasPackingSettings - { - padding = config.padding, - enableRotation = config.enableRotation, - blockOffset = config.blockOffset - }; - atlas.SetPackingSettings(packingSettings); - - // Texture Settings - var textureSettings = new SpriteAtlasTextureSettings - { - generateMipMaps = false, - sRGB = true, - filterMode = FilterMode.Bilinear - }; - atlas.SetTextureSettings(textureSettings); - - // Platform Settings - SetPlatformFormat(atlas, "Android", config.androidFormat, config); - SetPlatformFormat(atlas, "iPhone", config.iosFormat, config); - SetPlatformFormat(atlas, "WebGL", config.webglFormat, config); - } - - private static void SetPlatformFormat(SpriteAtlas atlas, string platform, - TextureImporterFormat format, AtlasConfiguration config) - { - var settings = atlas.GetPlatformSettings(platform); - settings.overridden = true; - settings.format = format; - settings.compressionQuality = config.compressionQuality; - atlas.SetPlatformSettings(settings); - } - - private static void AddSpritesToAtlas(SpriteAtlas atlas, IEnumerable spritePaths) - { - var packables = new List(); - foreach (var path in spritePaths) - { - var obj = AssetDatabase.LoadAssetAtPath(path); - if (obj != null) packables.Add(obj); - } - atlas.Add(packables.ToArray()); - } -} diff --git a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs.meta b/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs.meta deleted file mode 100644 index 696dd23..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/Atlas/AtlasProcessor.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 07f56f8c156246ddbc51eb82876f729e -timeCreated: 1738748262 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs b/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs deleted file mode 100644 index 0b290ee..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs +++ /dev/null @@ -1,549 +0,0 @@ -// using System; -// using System.Collections.Generic; -// using System.IO; -// using UnityEditor; -// using UnityEditor.U2D; -// using UnityEngine; -// using UnityEngine.U2D; -// using Object = UnityEngine.Object; -// -// namespace GameFramework.Editor -// { -// /// -// /// 图集导入管线。 -// /// -// public class SpritePostprocessor : AssetPostprocessor -// { -// static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) -// { -// foreach (var s in importedAssets) -// { -// EditorSpriteSaveInfo.OnImportSprite(s); -// } -// -// foreach (var s in deletedAssets) -// { -// EditorSpriteSaveInfo.OnDeleteSprite(s); -// } -// -// foreach (var s in movedFromAssetPaths) -// { -// EditorSpriteSaveInfo.OnDeleteSprite(s); -// } -// -// foreach (var s in movedAssets) -// { -// EditorSpriteSaveInfo.OnImportSprite(s); -// } -// } -// } -// -// public static class EditorSpriteSaveInfo -// { -// private const string NormalAtlasDir = "Assets/AssetArt/Atlas"; -// private const string UISpritePath = "Assets/AssetRaw/UIRaw"; -// private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas"; -// private static readonly List _dirtyAtlasList = new List(); -// private static readonly Dictionary> _allASprites = new Dictionary>(); -// -// private static readonly Dictionary _uiAtlasMap = new Dictionary(); -// private static bool _isInit = false; -// private static bool m_dirty = false; -// -// public static void Init() -// { -// if (_isInit) -// { -// return; -// } -// -// EditorApplication.update += CheckDirty; -// -// //读取所有图集信息 -// string[] findAssets = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { NormalAtlasDir }); -// foreach (var findAsset in findAssets) -// { -// var path = AssetDatabase.GUIDToAssetPath(findAsset); -// SpriteAtlas sa = AssetDatabase.LoadAssetAtPath(path, typeof(SpriteAtlas)) as SpriteAtlas; -// if (sa == null) -// { -// Debug.LogError($"加载图集数据{path}失败"); -// continue; -// } -// -// string atlasName = Path.GetFileNameWithoutExtension(path); -// var objects = sa.GetPackables(); -// foreach (var o in objects) -// { -// if (!_allASprites.TryGetValue(atlasName, out var list)) -// { -// list = new List(); -// _allASprites.Add(atlasName, list); -// } -// -// list.Add(AssetDatabase.GetAssetPath(o)); -// } -// } -// -// _isInit = true; -// } -// -// public static void CheckDirty() -// { -// if (m_dirty) -// { -// m_dirty = false; -// -// AssetDatabase.Refresh(); -// float lastProgress = -1; -// for (int i = 0; i < _dirtyAtlasList.Count; i++) -// { -// string atlasName = _dirtyAtlasList[i]; -// Debug.Log("更新图集 : " + atlasName); -// var curProgress = (float)i / _dirtyAtlasList.Count; -// if (curProgress > lastProgress + 0.01f) -// { -// lastProgress = curProgress; -// var progressText = $"当前进度:{i}/{_dirtyAtlasList.Count} {atlasName}"; -// bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress); -// if (cancel) -// { -// break; -// } -// } -// -// bool isUI = atlasName.StartsWith("UIRaw"); -// SaveAtlas(atlasName, isUI); -// } -// -// EditorUtility.ClearProgressBar(); -// AssetDatabase.SaveAssets(); -// AssetDatabase.Refresh(); -// _dirtyAtlasList.Clear(); -// } -// } -// -// public static void OnImportSprite(string assetPath) -// { -// if (!assetPath.StartsWith(UISpritePath)) -// { -// return; -// } -// -// TextureImporter ti = AssetImporter.GetAtPath(assetPath) as TextureImporter; -// -// if (ti != null) -// { -// var modify = false; -// -// if (assetPath.StartsWith(UISpritePath)) -// { -// if (ti.textureType != TextureImporterType.Sprite) -// { -// ti.textureType = TextureImporterType.Sprite; -// modify = true; -// } -// -// if (!string.IsNullOrEmpty(ti.spritePackingTag)) -// { -// ti.spritePackingTag = string.Empty; -// modify = true; -// } -// -// var setting = new TextureImporterSettings(); -// ti.ReadTextureSettings(setting); -// if (setting.spriteGenerateFallbackPhysicsShape) -// { -// setting.spriteGenerateFallbackPhysicsShape = false; -// ti.SetTextureSettings(setting); -// modify = true; -// } -// -// if (IsKeepRawImage(assetPath)) -// { -// //调整android格式 -// var andPlatformSettings = ti.GetPlatformTextureSettings("Android"); -// if (!andPlatformSettings.overridden) -// { -// andPlatformSettings.overridden = true; -// modify = true; -// } -// -// if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6) -// { -// andPlatformSettings.format = TextureImporterFormat.ASTC_6x6; -// andPlatformSettings.compressionQuality = 50; -// ti.SetPlatformTextureSettings(andPlatformSettings); -// modify = true; -// } -// -// //调整ios格式 -// var iosPlatformSettings = ti.GetPlatformTextureSettings("iPhone"); -// if (!iosPlatformSettings.overridden) -// { -// iosPlatformSettings.overridden = true; -// modify = true; -// } -// -// if (iosPlatformSettings.format != TextureImporterFormat.ASTC_5x5) -// { -// iosPlatformSettings.format = TextureImporterFormat.ASTC_5x5; -// iosPlatformSettings.compressionQuality = 50; -// ti.SetPlatformTextureSettings(iosPlatformSettings); -// modify = true; -// } -// -// //调整WebGL格式 -// var webglSettings = ti.GetPlatformTextureSettings("WebGL"); -// if (!webglSettings.overridden) -// { -// webglSettings.overridden = true; -// modify = true; -// } -// -// if (webglSettings.format != TextureImporterFormat.ASTC_6x6) -// { -// webglSettings.format = TextureImporterFormat.ASTC_6x6; -// webglSettings.compressionQuality = 50; -// ti.SetPlatformTextureSettings(webglSettings); -// modify = true; -// } -// } -// } -// -// if (modify) -// { -// ti.SaveAndReimport(); -// } -// -// if (ti.textureType == TextureImporterType.Sprite) -// { -// OnProcessSprite(assetPath); -// } -// } -// } -// -// /// -// /// 是否保持散图(不打图集) -// /// -// /// -// /// -// public static bool IsKeepRawImage(string dirPath) -// { -// return dirPath.Contains("UIRaw/Raw/") || dirPath.Contains("UIRaw_Raw_"); -// } -// -// public static string GetSpritePath(string assetPath) -// { -// string path = assetPath.Substring(0, assetPath.LastIndexOf(".", StringComparison.Ordinal)); -// path = path.Replace("Assets/AssetRaw/", ""); -// return path; -// } -// -// /// -// /// 根据文件路径,返回图集名称 -// /// -// /// -// /// -// public static string GetPackageTag(string fullName) -// { -// fullName = fullName.Replace("\\", "/"); -// int idx = fullName.LastIndexOf("UIRaw", StringComparison.Ordinal); -// if (idx == -1) -// { -// return ""; -// } -// -// if (IsKeepRawImage(fullName)) -// { -// return ""; -// } -// -// var atlasPath = fullName.Substring(idx); -// string str = atlasPath; -// str = str.Substring(0, str.LastIndexOf("/", StringComparison.Ordinal)).Replace("/", "_"); -// -// return str; -// } -// -// public static void OnProcessSprite(string assetPath) -// { -// if (!assetPath.StartsWith("Assets")) -// { -// return; -// } -// -// if (assetPath.StartsWith("Assets/UIRaw_Delete")) -// { -// return; -// } -// -// Init(); -// -// var spriteName = Path.GetFileNameWithoutExtension(assetPath); -// var spritePath = GetSpritePath(assetPath); -// if (!_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath) -// { -// _uiAtlasMap[spriteName] = spritePath; -// m_dirty = true; -// } -// else -// { -// Debug.LogError($"有重名的图片:{spriteName}\n旧图集:{oldAssetPath}\n新图集:{spritePath} "); -// _uiAtlasMap[spriteName] = spritePath; -// m_dirty = true; -// } -// -// string atlasName = GetPackageTag(assetPath); -// if (string.IsNullOrEmpty(atlasName)) -// { -// bool keepRaw = IsKeepRawImage(assetPath); -// if (!keepRaw) -// { -// Debug.LogError($"empty packingTag of asset :{assetPath} !!!"); -// } -// -// return; -// } -// else -// { -// List ret; -// if (!_allASprites.TryGetValue(atlasName, out ret)) -// { -// ret = new List(); -// _allASprites.Add(atlasName, ret); -// } -// -// if (!ret.Contains(assetPath)) -// { -// ret.Add(assetPath); -// m_dirty = true; -// if (!_dirtyAtlasList.Contains(atlasName)) -// { -// _dirtyAtlasList.Add(atlasName); -// } -// } -// } -// } -// -// public static void OnDeleteSprite(string assetPath) -// { -// if (assetPath.StartsWith("Assets/UIRaw_Delete")) -// { -// return; -// } -// -// if (!assetPath.StartsWith(UISpritePath)) -// { -// return; -// } -// -// Init(); -// string atlasName = GetPackageTag(assetPath); -// if (!_allASprites.TryGetValue(atlasName, out var ret)) -// { -// return; -// } -// -// //改成文件名的匹配 -// if (!ret.Exists(s => Path.GetFileName(s) == Path.GetFileName(assetPath))) -// { -// return; -// } -// -// if (assetPath.StartsWith(UISpritePath)) -// { -// var spriteName = Path.GetFileNameWithoutExtension(assetPath); -// if (_uiAtlasMap.ContainsKey(spriteName)) -// { -// _uiAtlasMap.Remove(spriteName); -// m_dirty = true; -// } -// } -// -// ret.Remove(assetPath); -// m_dirty = true; -// if (!_dirtyAtlasList.Contains(atlasName)) -// { -// _dirtyAtlasList.Add(atlasName); -// } -// } -// -// #region 更新图集 -// -// public static void SaveAtlas(string atlasName, bool isUI) -// { -// List spriteList = new List(); -// if (_allASprites.TryGetValue(atlasName, out var list)) -// { -// list.Sort(StringComparer.Ordinal); -// -// foreach (var s in list) -// { -// var sprite = AssetDatabase.LoadAssetAtPath(s); -// if (sprite != null) -// { -// spriteList.Add(sprite); -// } -// } -// } -// -// var path = $"{NormalAtlasDir}/{atlasName}.spriteatlas"; -// -// if (spriteList.Count == 0) -// { -// if (File.Exists(path)) -// { -// AssetDatabase.DeleteAsset(path); -// } -// -// return; -// } -// -// var atlas = new SpriteAtlas(); -// // var atlas = new SpriteAtlasAsset(); -// var setting = new SpriteAtlasPackingSettings -// { -// blockOffset = 1, -// padding = 2, -// enableRotation = true -// }; -// -// bool isOpaque = atlasName.Contains("Opaque"); -// -// var textureSetting = new SpriteAtlasTextureSettings -// { -// generateMipMaps = false, -// sRGB = true, -// filterMode = FilterMode.Bilinear -// }; -// atlas.SetTextureSettings(textureSetting); -// -// var iphonePlatformSetting = atlas.GetPlatformSettings("iPhone"); -// if (!iphonePlatformSetting.overridden) -// { -// iphonePlatformSetting.overridden = true; -// iphonePlatformSetting.format = TextureImporterFormat.ASTC_5x5; -// iphonePlatformSetting.compressionQuality = 100; -// atlas.SetPlatformSettings(iphonePlatformSetting); -// } -// -// var androidPlatformSetting = atlas.GetPlatformSettings("Android"); -// if (!androidPlatformSetting.overridden) -// { -// androidPlatformSetting.overridden = true; -// androidPlatformSetting.format = TextureImporterFormat.ASTC_6x6; -// androidPlatformSetting.compressionQuality = 100; -// atlas.SetPlatformSettings(androidPlatformSetting); -// } -// -// var webglSettings = atlas.GetPlatformSettings("WebGL"); -// if (!webglSettings.overridden) -// { -// webglSettings.overridden = true; -// webglSettings.format = TextureImporterFormat.ASTC_6x6; -// webglSettings.compressionQuality = 50; -// atlas.SetPlatformSettings(webglSettings); -// } -// -// atlas.SetPackingSettings(setting); -// atlas.Add(spriteList.ToArray()); -// -// AssetDatabase.CreateAsset(atlas, path); -// AssetDatabase.SaveAssets(); -// AssetDatabase.Refresh(); -// } -// -// #endregion -// -// #region 重新生成图集 -// -// private static readonly Dictionary> m_tempAllASprites = new Dictionary>(); -// -// [MenuItem("开发工具/Atlas/重新生成UI图集", false, 90)] -// static void ForceGenAtlas() -// { -// Init(); -// List needSaveAtlas = new List(); -// m_tempAllASprites.Clear(); -// _allASprites.Clear(); -// var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath }); -// foreach (var findAsset in findAssets) -// { -// var path = AssetDatabase.GUIDToAssetPath(findAsset); -// var atlasName = GetPackageTag(path); -// if (!m_tempAllASprites.TryGetValue(atlasName, out var spriteList)) -// { -// spriteList = new List(); -// m_tempAllASprites[atlasName] = spriteList; -// } -// -// if (!spriteList.Contains(path)) -// { -// spriteList.Add(path); -// } -// } -// -// //有变化的才刷 -// var iter = m_tempAllASprites.GetEnumerator(); -// while (iter.MoveNext()) -// { -// bool needSave = false; -// var atlasName = iter.Current.Key; -// var newSpritesList = iter.Current.Value; -// -// if (_allASprites.TryGetValue(atlasName, out var existSprites)) -// { -// if (existSprites.Count != newSpritesList.Count) -// { -// needSave = true; -// existSprites.Clear(); -// existSprites.AddRange(newSpritesList); -// } -// else -// { -// for (int i = 0; i < newSpritesList.Count; i++) -// { -// if (!existSprites.Contains(newSpritesList[i])) -// { -// needSave = true; -// break; -// } -// } -// -// if (needSave) -// { -// existSprites.Clear(); -// existSprites.AddRange(newSpritesList); -// } -// } -// } -// else -// { -// needSave = true; -// _allASprites.Add(atlasName, new List(newSpritesList)); -// } -// -// if (needSave && !needSaveAtlas.Contains(atlasName)) -// { -// needSaveAtlas.Add(atlasName); -// } -// } -// -// iter.Dispose(); -// foreach (var atlas in needSaveAtlas) -// { -// Debug.LogFormat("Gen atlas:{0}", atlas); -// SaveAtlas(atlas, true); -// } -// -// AssetDatabase.SaveAssets(); -// AssetDatabase.Refresh(); -// -// SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget); -// Debug.Log("Gen end"); -// } -// -// #endregion -// } -// } diff --git a/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs.meta b/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs.meta deleted file mode 100644 index f5ec224..0000000 --- a/Client/Assets/Scripts/Editor/Postprocessor/SpritePostprocessor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 693ec7e51f3eb9642b1e4c8f9ca4b6ed -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs b/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs deleted file mode 100644 index 881f3ef..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Paps.UnityToolbarExtenderUIToolkit; -using UnityEditor; -using UnityEngine; -using UnityEngine.UIElements; - -[MainToolbarElement(id: "BuildSettingWindow", alignment: ToolbarAlign.Right, order: 1)] -public class BuildSettingWindow : IMGUIContainer -{ - private GUIContent buildBtContent; - public void InitializeElement() - { - buildBtContent = EditorGUIUtility.TrTextContentWithIcon("Build App/Hotfix", "打新包/打热更", EditorGUIUtility.IconContent("d_BuildSettings.Standalone").image); - onGUIHandler = MyGUIMethod; - } - - private void MyGUIMethod() - { - GUILayout.BeginHorizontal(); - - if (GUILayout.Button(buildBtContent, EditorStyles.toolbarButton, GUILayout.MaxWidth(125))) - Debug.Log("GUI Button clicked"); - - GUILayout.EndHorizontal(); - } -} diff --git a/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs.meta b/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs.meta deleted file mode 100644 index 225f498..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/BuildSettingWindow.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: af03d991c6e34e8bbfbf861b558aa11b -timeCreated: 1741240351 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs b/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs deleted file mode 100644 index 6020245..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Paps.UnityToolbarExtenderUIToolkit; -using UnityEditor; -using UnityEngine; -using UnityEngine.UIElements; - -namespace AlicizaX.Editor.Extension -{ - [MainToolbarElement("EditorQuickToolBar", alignment: ToolbarAlign.Right, order: 0)] - public class EditorQuickToolBar : IMGUIContainer - { - private static GUIContent toolsDropBtContent; - - public void InitializeElement() - { - toolsDropBtContent = EditorGUIUtility.TrTextContentWithIcon("Tools", "工具箱", "CustomTool"); - onGUIHandler = MyGUIMethod; - } - - private void MyGUIMethod() - { - GUILayout.BeginHorizontal(); - if (EditorGUILayout.DropdownButton(toolsDropBtContent, FocusType.Passive, EditorStyles.toolbarPopup, - GUILayout.MaxWidth(90))) - { - DrawEditorToolDropdownMenus(); - } - - GUILayout.Space(5); - GUILayout.EndHorizontal(); - } - - static void DrawEditorToolDropdownMenus() - { - GenericMenu popMenu = new GenericMenu(); - for (int i = 0; i < EditorToolFunctionAttributeCollector.Attributes.Count; i++) - { - var toolAttr = EditorToolFunctionAttributeCollector.Attributes[i]; - popMenu.AddItem(new GUIContent(toolAttr.ToolMenuPath), false, - menuIdx => { ClickToolsSubmenu((int)menuIdx); }, i); - } - - popMenu.ShowAsContext(); - } - - static void ClickToolsSubmenu(int menuIdx) - { - var editorTp = EditorToolFunctionAttributeCollector.Attributes[menuIdx]; - if (editorTp.MethodInfo != null && editorTp.MethodInfo.IsStatic) - { - editorTp.MethodInfo.Invoke(null, null); // Invoke the static method - } - else - { - Debug.LogError("Method is not static or not found."); - } - } - } -} diff --git a/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs.meta b/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs.meta deleted file mode 100644 index b2a2a22..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/EditorQuickToolBar.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6862584178a44687ab6912b5bbac36b4 -timeCreated: 1741334878 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs b/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs deleted file mode 100644 index 3324846..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using AlicizaX.Resource.Runtime; -using Paps.UnityToolbarExtenderUIToolkit; -using UnityEditor; -using UnityEditor.Toolbars; -using UnityEngine; -using UnityEngine.UIElements; - -namespace AlicizaX.Editor.Extension -{ - [MainToolbarElement("ResourceModeDropdownField", alignment: ToolbarAlign.Right, order: 0)] - public class ResourceModeDropdownField : IMGUIContainer - { - private static GUIContent appConfigBtContent; - - private static readonly string[] _resourceModeNames = - { - "Editor", - "Offline", - "Host", - }; - - public void InitializeElement() - { - appConfigBtContent = - EditorGUIUtility.TrTextContentWithIcon("Res:", "配置App运行时所需DataTable/Config/Procedure", - "Settings"); - onGUIHandler = MyGUIMethod; - } - - private void MyGUIMethod() - { - GUILayout.BeginHorizontal(); - string title = "Res:" + _resourceModeNames[EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0)]; - appConfigBtContent.text = title; - if (EditorGUILayout.DropdownButton(appConfigBtContent, FocusType.Passive, EditorStyles.toolbarPopup, GUILayout.MaxWidth(90))) - { - DrawEditorToolDropdownMenus(); - } - - GUILayout.Space(5); - GUILayout.EndHorizontal(); - } - - static void DrawEditorToolDropdownMenus() - { - int index = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0); - GenericMenu popMenu = new GenericMenu(); - for (int i = 0; i < _resourceModeNames.Length; i++) - { - var selected = index == i; - var toolAttr = _resourceModeNames[i]; - popMenu.AddItem(new GUIContent(toolAttr), selected, menuIdx => { ClickToolsSubmenu((int)menuIdx); }, i); - } - - popMenu.ShowAsContext(); - } - - static void ClickToolsSubmenu(int menuIdx) - { - EditorPrefs.SetInt(ResourceComponent.PrefsKey, menuIdx); - } - } -} diff --git a/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs.meta b/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs.meta deleted file mode 100644 index bba170d..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/ResourceModeDropdownField.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0a9f36ab7c6f42a5bed41bceeed67fc6 -timeCreated: 1741056284 \ No newline at end of file diff --git a/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs b/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs deleted file mode 100644 index f0631ed..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.Collections.Generic; -using Paps.UnityToolbarExtenderUIToolkit; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.UIElements; - -[MainToolbarElement(id: "SwitchSceneToolBar", alignment: ToolbarAlign.Left, order: 1)] -public class SwitchSceneToolBar : IMGUIContainer -{ - private GUIContent switchSceneBtContent; - - public void InitializeElement() - { - var curOpenSceneName = EditorSceneManager.GetActiveScene().name; - switchSceneBtContent = EditorGUIUtility.TrTextContentWithIcon( - string.IsNullOrEmpty(curOpenSceneName) ? "Switch Scene" : curOpenSceneName, "切换场景", "UnityLogo"); - onGUIHandler = MyGUIMethod; - EditorSceneManager.sceneOpened += OnSceneOpened; - } - - private void OnSceneOpened(Scene scene, OpenSceneMode mode) - { - switchSceneBtContent.text = scene.name; - } - - private static List sceneAssetList = new List(); - - private void MyGUIMethod() - { - GUILayout.BeginHorizontal(); - - if (EditorGUILayout.DropdownButton(switchSceneBtContent, FocusType.Passive, EditorStyles.toolbarPopup, - GUILayout.MaxWidth(150))) - { - DrawSwithSceneDropdownMenus(); - } - - GUILayout.EndHorizontal(); - } - - static string[] ScenePath = new[] { "Assets/Bundles/Scenes/", "Assets/Scenes/" }; - private static string RootScenePath = "Assets/Bundles/Scenes/"; - private static string BundleScenePath = "Assets/Scenes/"; - - static void DrawSwithSceneDropdownMenus() - { - GenericMenu popMenu = new GenericMenu(); - popMenu.allowDuplicateNames = true; - var sceneGuids = AssetDatabase.FindAssets("t:Scene", ScenePath); - sceneAssetList.Clear(); - for (int i = 0; i < sceneGuids.Length; i++) - { - var scenePath = AssetDatabase.GUIDToAssetPath(sceneGuids[i]); - sceneAssetList.Add(scenePath); - string fileDir = System.IO.Path.GetDirectoryName(scenePath); - bool isInRootDir = AlicizaX.Runtime.Utility.Path.GetRegularPath(BundleScenePath).TrimEnd('/') == - AlicizaX.Runtime.Utility.Path.GetRegularPath(fileDir).TrimEnd('/'); - var sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath); - string displayName = sceneName; - if (!isInRootDir) - { - var sceneDir = System.IO.Path.GetRelativePath(RootScenePath, fileDir); - displayName = $"{sceneDir}/{sceneName}"; - } - - popMenu.AddItem(new GUIContent(displayName), false, menuIdx => { SwitchScene((int)menuIdx); }, i); - } - - popMenu.ShowAsContext(); - } - - private static void SwitchScene(int menuIdx) - { - if (menuIdx >= 0 && menuIdx < sceneAssetList.Count) - { - var scenePath = sceneAssetList[menuIdx]; - var curScene = EditorSceneManager.GetActiveScene(); - if (curScene != null && curScene.isDirty) - { - int opIndex = - EditorUtility.DisplayDialogComplex("警告", $"当前场景{curScene.name}未保存,是否保存?", "保存", "取消", "不保存"); - switch (opIndex) - { - case 0: - if (!EditorSceneManager.SaveOpenScenes()) - { - return; - } - - break; - case 1: - return; - } - } - - EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single); - } - } -} diff --git a/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs.meta b/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs.meta deleted file mode 100644 index 58bf986..0000000 --- a/Client/Assets/Scripts/Editor/ToolBar/SwitchSceneToolBar.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 558a3f0219eb4dc498ca3ef90446af34 -timeCreated: 1741329998 \ No newline at end of file diff --git a/Client/Assets/Scripts/Startup/Framework/Procedure/ProcedureGetAppVersionInfoState.cs b/Client/Assets/Scripts/Startup/Framework/Procedure/ProcedureGetAppVersionInfoState.cs index db3b203..c2a4e3e 100644 --- a/Client/Assets/Scripts/Startup/Framework/Procedure/ProcedureGetAppVersionInfoState.cs +++ b/Client/Assets/Scripts/Startup/Framework/Procedure/ProcedureGetAppVersionInfoState.cs @@ -45,9 +45,10 @@ namespace Unity.Startup.Procedure #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else - Application.OpenURL(GlobalConfig.PatchData.AppDownloadUrl); + Application.OpenURL(GlobalSetting.PatchData.AppDownloadUrl); Application.Quit(); #endif + return; } ChangeState(procedureOwner); diff --git a/Client/Assets/Scripts/Startup/Unity.Startup.asmdef b/Client/Assets/Scripts/Startup/Unity.Startup.asmdef index 7f9a5f2..3c65a81 100644 --- a/Client/Assets/Scripts/Startup/Unity.Startup.asmdef +++ b/Client/Assets/Scripts/Startup/Unity.Startup.asmdef @@ -11,7 +11,6 @@ "AlicizaX.Resource.Runtime", "AlicizaX.Runtime", "AlicizaX.Fsm.Runtime", - "HybridCLRData", "AlicizaX.Setting.Runtime", "AlicizaX.Audio.Runtime", "YooAsset", diff --git a/Client/Assets/Settings/PC_RPAsset.asset b/Client/Assets/Settings/PC_RPAsset.asset index fb240e0..1dc8001 100644 --- a/Client/Assets/Settings/PC_RPAsset.asset +++ b/Client/Assets/Settings/PC_RPAsset.asset @@ -17,7 +17,7 @@ MonoBehaviour: m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: - - {fileID: 11400000, guid: f288ae1f4751b564a96ac7587541f7a2, type: 2} + - {fileID: 11400000, guid: 0bb04a7c6e8e8a849960d3a572f4961d, type: 2} m_DefaultRendererIndex: 0 m_RequireDepthTexture: 1 m_RequireOpaqueTexture: 1 diff --git a/Client/Assets/Settings/PC_Renderer.asset b/Client/Assets/Settings/PC_Renderer.asset index 475b02e..3913a09 100644 --- a/Client/Assets/Settings/PC_Renderer.asset +++ b/Client/Assets/Settings/PC_Renderer.asset @@ -13,30 +13,22 @@ MonoBehaviour: m_Name: PC_Renderer m_EditorClassIdentifier: debugShaders: - debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, - type: 3} + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} - probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, - type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} probeVolumeResources: - probeVolumeDebugShader: {fileID: 4800000, guid: e5c6678ed2aaa91408dd3df699057aae, - type: 3} - probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 03cfc4915c15d504a9ed85ecc404e607, - type: 3} - probeVolumeOffsetDebugShader: {fileID: 4800000, guid: 53a11f4ebaebf4049b3638ef78dc9664, - type: 3} - probeVolumeSamplingDebugShader: {fileID: 4800000, guid: 8f96cd657dc40064aa21efcc7e50a2e7, - type: 3} - probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 57d7c4c16e2765b47a4d2069b311bffe, - type: 3} - probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, - type: 3} - probeVolumeBlendStatesCS: {fileID: 7200000, guid: b9a23f869c4fd45f19c5ada54dd82176, - type: 3} + probeVolumeDebugShader: {fileID: 4800000, guid: e5c6678ed2aaa91408dd3df699057aae, type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 03cfc4915c15d504a9ed85ecc404e607, type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: 53a11f4ebaebf4049b3638ef78dc9664, type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: 8f96cd657dc40064aa21efcc7e50a2e7, type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 57d7c4c16e2765b47a4d2069b311bffe, type: 3} + probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, type: 3} + probeVolumeBlendStatesCS: {fileID: 7200000, guid: b9a23f869c4fd45f19c5ada54dd82176, type: 3} m_RendererFeatures: - {fileID: 7833122117494664109} m_RendererFeatureMap: ad6b866f10d7b46c m_UseNativeRenderPass: 1 + xrSystemData: {fileID: 0} postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} m_AssetVersion: 2 m_OpaqueLayerMask: @@ -56,6 +48,8 @@ MonoBehaviour: m_RenderingMode: 2 m_DepthPrimingMode: 0 m_CopyDepthMode: 0 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 0 --- !u!114 &7833122117494664109 diff --git a/Client/Assets/Settings/PC_Renderer.asset.meta b/Client/Assets/Settings/PC_Renderer.asset.meta index ddae6a5..aa06acf 100644 --- a/Client/Assets/Settings/PC_Renderer.asset.meta +++ b/Client/Assets/Settings/PC_Renderer.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f288ae1f4751b564a96ac7587541f7a2 +guid: 0bb04a7c6e8e8a849960d3a572f4961d NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Client/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/Client/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset index 76ecf76..dc08c31 100644 --- a/Client/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset +++ b/Client/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -33,27 +33,28 @@ MonoBehaviour: m_Settings: m_SettingsList: m_List: - - rid: 8521677007200977269 - - rid: 8521677007200977270 + - rid: 8521677142241312790 + - rid: 8521677142241312791 - rid: 6852985685364965378 - rid: 6852985685364965379 - rid: 6852985685364965380 - rid: 6852985685364965381 - - rid: 8521677007200977271 - - rid: 8521677007200977272 + - rid: 8521677142241312792 + - rid: 8521677142241312793 - rid: 6852985685364965384 - rid: 6852985685364965385 - - rid: 8521677007200977273 - - rid: 8521677007200977274 - - rid: 8521677007200977275 - - rid: 8521677007200977276 - - rid: 8521677007200977277 - - rid: 8521677007200977278 + - rid: 8521677142241312794 + - rid: 8521677142241312795 + - rid: 8521677142241312796 + - rid: 8521677142241312797 + - rid: 8521677142241312798 + - rid: 8521677142241312799 - rid: 6852985685364965392 - - rid: 8521677007200977279 + - rid: 8521677142241312800 - rid: 6852985685364965394 - rid: 8712630790384254976 - rid: 3945244723512606720 + - rid: 8521677141868019712 m_RuntimeSettings: m_List: - rid: 6852985685364965378 @@ -96,6 +97,8 @@ MonoBehaviour: references: version: 2 RefIds: + - rid: -2 + type: {class: , ns: , asm: } - rid: 3945244723512606720 type: {class: UniversalRenderPipelineRuntimeXRResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -155,14 +158,18 @@ MonoBehaviour: m_version: 0 m_EnableCompilationCaching: 1 m_EnableValidityChecks: 1 - - rid: 8521677007200977269 + - rid: 8521677141868019712 + type: {class: UniversalRenderPipelineEditorAssets, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultSettingsVolumeProfile: {fileID: 11400000, guid: eda47df5b85f4f249abf7abd73db2cb2, type: 2} + - rid: 8521677142241312790 type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_Version: 0 m_StripUnusedPostProcessingVariants: 1 m_StripUnusedVariants: 1 m_StripScreenCoordOverrideVariants: 1 - - rid: 8521677007200977270 + - rid: 8521677142241312791 type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} @@ -174,7 +181,7 @@ MonoBehaviour: m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} - - rid: 8521677007200977271 + - rid: 8521677142241312792 type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_Version: 0 @@ -189,7 +196,7 @@ MonoBehaviour: m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} - - rid: 8521677007200977272 + - rid: 8521677142241312793 type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} @@ -197,7 +204,7 @@ MonoBehaviour: m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} - - rid: 8521677007200977273 + - rid: 8521677142241312794 type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} data: m_Version: 0 @@ -210,13 +217,13 @@ MonoBehaviour: m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3} m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3} m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} - - rid: 8521677007200977274 + - rid: 8521677142241312795 type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} - - rid: 8521677007200977275 + - rid: 8521677142241312796 type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 @@ -229,12 +236,12 @@ MonoBehaviour: skyOcclusionRT: {fileID: -5126288278712620388, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} renderingLayerCS: {fileID: -6772857160820960102, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} - - rid: 8521677007200977276 + - rid: 8521677142241312797 type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 m_ProbeVolumeDisableStreamingAssets: 0 - - rid: 8521677007200977277 + - rid: 8521677142241312798 type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 @@ -244,14 +251,14 @@ MonoBehaviour: probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3} probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3} numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} - - rid: 8521677007200977278 + - rid: 8521677142241312799 type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_version: 0 m_IncludeReferencedInScenes: 0 m_IncludeAssetsByLabel: 0 m_LabelToInclude: - - rid: 8521677007200977279 + - rid: 8521677142241312800 type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 diff --git a/Client/Assets/StreamingAssets.meta b/Client/Assets/StreamingAssets.meta deleted file mode 100644 index 0c4c885..0000000 --- a/Client/Assets/StreamingAssets.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e1f8a05e8ca47d74b8777ca92c26d313 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Test.meta b/Client/Assets/Test.meta deleted file mode 100644 index 5754738..0000000 --- a/Client/Assets/Test.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5ec286b1b8368f1478cc4b26e606c3a6 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Test/GameBase.dll.bytes b/Client/Assets/Test/GameBase.dll.bytes deleted file mode 100644 index dd81d213f467fbe4bc9c523e6ad9ca81fcefe4c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeHKUu;`f8UK#$xM@m5(|_y4=x&=;&9>m#u^lH{Gh+MNO-iyvaoTRkQhRNmCbzr3 z*ShyQ)D<1!Pthg;Dv$6m;H`*i0%_990BMzY0HH}pY`_DEA|ZhgVtZo(Y327F-)lEf z#}Lva9(J7jo$ufM&hPuqpL??S>1z}vq8Oe#cZhDH=QgY8eaM z!s|y?*G*4rxz3tvG_|^6+m5f*q~^A5&9pUrsiHNVhD_|8}nW_OV|=9UH^+4qd_Gi@`7)7yvskAW<0Z zyMhIvdPG2f@Cv}i;*W&m6e_0*B0$TzZ)6h5L^_#HO*8lbvOrf6bo4o**U(!SZ?xjO zroHB|$2f;aKYF@CN$^~<(UYg=b@a24*MW4jU^z9&+z>*XeIugn1VjH6X*$@g)d)l& zQxAqv)5-JCb!6A=J^K(fBdq5|zCUs+5~qx!zYs4)K1zSYYjOH~Bp!{^JA&yC#516& z=w*0*PTYzN(M53<^bd-DQ(S}otYGU(gz3>J$1E#<9eN(=drW|ae|yNl@JAHSnIDFQ zB{)L=av;TMm)Jw&&}6ZrVzdw3*I>(HeRm}&0x2ziMZcxASft+p`(bgLGgI_mkw1Zd zThWE+pJ`dcOZ4SK*MU&b(=3Uv(^T}YkZ!Wnv+cy%7c>GIr~5&NC-6!glhQ3Zu&@s>=CBzq%W)K*sfB=gW zoPdsJ^eA1&E)jGaG(xdWD7Q4OBCnyaJw{J(Nw(>_^&dbD?~Fe8V^EdDk^M z^S0@)c3QGxUY0Z26rG0LsW@%7E>B8Zx`rFHfY~ak@dEV z$z7Ii)AT&luW##uQbk>nmT^gOUf&+%%Wg2$Obc=P)|5%>=tRHf9J@C#_yB z5)I1=Tqp#Ruk$4KUu;O-=?38XP@<0Fg;w1()@;Yas`WxufJu$WFI1$vVb-Nb-KyZY zWe6UvI=*4?v<9r2>o7=&CDE^n7tZdSv|7^jXsLEl)_u&5PrO@9!@^!sn}_DTZn>9i ztFt|1xHo^F{?VzwT#V*l_|E8?k1c%b?-bL77>sHp2EdGrD0)EAhX=HX7#@!85F`6{ zP(Gq!B|u3?R9%k7$F);}dXtIo61o~h+>Mz)@vOiiaV68q_ZSdHwdJZrWP3G1@1 zR*Q(nM;^d)C>sCxKqNjGiAQikjqD#3!L8)5z=5_JIe6AJT2DE4=~7*`cmb@g^9B*{ zQ=bcp@ks_r9cYvjlu~C>qQ4h|ed4%x>E`VVPEU_pWw#kW{RWQr#bu7XhUdp)c=(PN zG#+Cgp5u5%an_FR3JgKF?K(p%6}>`^b5;N07fLr?&3yMCw|@Nw$2j?TRe@Y~9bPNd zJj!QYHmXI-#8#*-m^IgMJJo`eRm1ho3r5}ds;TK@vX(STiH5OO4G)b(t5KuMTz(=u zNx?{0{}znI+00mPUUNo&Q+egaCw}GvaoE1XycSAZ`|!rq)t)Olu5MY2hG~;p6jG|) z*|pv|hA3g$oZ6#RKK=o>d-8kLImf?XUg`nvF$rwVu+4yGw>u;4`3Ss6yvJOSA%R9yjf$AkTxAySHxoN$jn6)pbL?)hC|} zSpKfw6;^3=P=Tlhxrk%pjwcb*rVHdK`$Ov6x(cfStp~e7KKvX=-S++14OCMAlMgQw z`n7vRdS3Y?Dg0%q1|D}tAQC-)9iw|xS8-Zf#?j!L#D44ho`J6m?>?3!ZY2GO=yBQ& zf6m5NzBaI1sFy)a$XMF}S3vJUlb{Cde9I*oQ@9qOT~lurk#UPU3fUU1BO+lr@jn4P z#!{f??0Jl^k}SRdSQ(YqGGaJD&_@0~W@Kx2{k%9w!p(|nkq2%@-b6Jmpwr&>J-qs1 Z`=BbIb^mAlw)%hRgBs++xc{#e_%|*C(nbIP diff --git a/Client/Assets/Test/GameBase.pdb.bytes b/Client/Assets/Test/GameBase.pdb.bytes deleted file mode 100644 index 37bc60e86886a087b44cc806c41262d86d40d67a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20136 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 X45*#|8NV(6U;3yg``G{gTL%6KiO0td diff --git a/Client/Assets/Test/GameLib.dll.bytes.meta b/Client/Assets/Test/GameLib.dll.bytes.meta deleted file mode 100644 index b53c1c7..0000000 --- a/Client/Assets/Test/GameLib.dll.bytes.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3aeb77d5212f8c3418f6efdd8be4eb00 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Test/GameLib.pdb.bytes b/Client/Assets/Test/GameLib.pdb.bytes deleted file mode 100644 index 0464f01547e495772b2a4334fb117e1f5c641366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20048 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 diff --git a/Client/Assets/Test/GameLogic.pdb.bytes.meta b/Client/Assets/Test/GameLogic.pdb.bytes.meta deleted file mode 100644 index 8d0839f..0000000 --- a/Client/Assets/Test/GameLogic.pdb.bytes.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4073b40de7752da48863e56b8a0cb4a1 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Test/GameProto.dll.bytes b/Client/Assets/Test/GameProto.dll.bytes deleted file mode 100644 index 8901b9ec6d95b58cdc754264fdaebd8c07bad3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 zcmeHvdw5&bmG3%7M-NN3Y{_{i5alfr$F&{XamdT^D>m4PiJcd?wPjmzL}bZGa)|T7 zCJ>+vEezBx<&}g`U`i=7r7bYP7g{FM7Rsg2LJNf^e3YRr)51)9VYrmu-&*_VVLNcc z^t*q}C^^5q*JH1}_C9Mr&OVY`F1~>*L}cLl>tBf;M#`UR!B2)^h~2Xvb<;yRKbiBe z*8Gz>?K{E=-#|Rp7Z3LPdVfwk zyQ?^!i1$D&z6~S84c&?>>r;)}RU8jRVo+pX=?E^i)qyMPQ%zKpMN0M>?pJ)+H=V5X zOexXvl|-6wKRs;BCqGQukPIM6a&=i<*pc9mitQpvR{`8=z5 zSf#MUkfy*VkC#50JO{3N$#)oCas48=y5PB6(Jy{4bobwe9AwWy*OYxNExTQ0vkUg$ znabQDnJN2^Ahj(%SN9ikeVcXvB&526n5$d%Tj2^A zdnIKC27oXmo#C5W`ubNE+whP5F{latVElS!N>vM{#L@79V+*G0ekUwC(OpweP>;<( z&Bqo@i{pMkJYD(Vhw_qR3ueU6VXl7`bg~+cKH$cqRkpYCGTI+spnVezN`N`0XG8NN4vyYjgB|8hEFFl(rY zSpp**BSR@qmkQ%!Jgk5a9xmsa$AyQ8Obn<2x6&NS8&=km>ATNvw8l`_V9Js6G{V$Nv}_uuevU&B>$G@z_+!&Ua53S=l3q4>+t0W`+xfcF8;2#Du z#+q~gT~P6ozW;7XE&Gp4I(h#wN%twS--7DBB$R(18^2QbW9GFjb;UJ}1`_kZ+oSt0 z1j`cp7I1N;qV(7UOkpO+a68kCz6EUD`E4v67qud?#1_D|lH)#YVm)p-ZlJVWQf8pd z!jN=^&(-p1!}xgtt4Ahom%wkCm$$-X_I+6`0?f!4LxB6@UkC@rMQ&zA!u@9dd)cpy z{|FYRUqt4p6FL0vVm)?uuIa9%%s{t_|B_-}@V;38aq~hCjPSg$A?0aE7-QyzHCQeC z!G>=!u5-I?_M|Y)yhz~HPS#*2(AVOGq|89ug&`@ga;Y`KncbI{r23L~8r+wv%cjLc zDGvw62*!ANF+9B-Vt6{liPgUs$>PzJ!y+>s76mgeT5x`lwb@r}J;YZ@nSn`I7?LvM zJd+`5X3g%znBexL$85SiyJ7o`?b$O%FeBbC4aI2PH%2gK!0tgq4?>KFUd@Tse+?&Y z!+#yp#V1n@79F#ZqG;wt+ssP|G=79ja?>zhN?Rpm1{M!tNXiT>UBZx*8CXq(A!+K~ zqKBm~X6K|Puyki!g}Tnz8HdIQvO441F@jm~LFuJ)bpPka2+qx()-pruMkt}LZbFhZ zw6IJ${UWmXgAge>x&jN4>WX5sU6OJ`KVvc^o#88dX7*nfU!ePMMu7!O^@WQq{yr{i zt~pk^0DWL&$M^nJeE%KvvgeBHQ}L~A84D*Zv6@@EF){vpdZoJ!7SO0WII;SVaDo6h zCaKkbTvD6=>qr;Nd<_mia*bR6#EQB8i79iM5qoA{Y?^tt`|)ce*EVL2ya$Z2YoxCG zkAk_s96f{lU7W{)&-uGKU!}S@@ih<6Qp5(j6b5axfi9fnU-z!dvzp+IeEl1!K^TlEDUGY^9>3i9E)egny z-oiK%yST9u3$yc5?X#$7tEPqSURpYMjb0hpbeJyg!u{g~SDT(o~BcZ|df`ifkLm(==x zFC@Ia-zVwh{V)c4pJMwBwXQRz)^(bRJr`~OKeu}Hz30Jv3|--LF3E#M%q4iBf+-sa z%p=aFzkAKik2F@InK8^G&R=oAY1o_VurOmGxj~+d&A(KY&MjQLNxLtNLMb=k;2C;pL ze?1iJdwDYz^TB2UGl$de_{jDT;3rC$b3bza3jho3vh9f>(48>^w^Nmi$Ka4DLWDd0 z2uf!RJ?qT#TKtGa=h9XBlm$-NXz4loF$N7?ZMQ7CAN{%Hwa@8$nVYBY|3-Fos(Ad`^g=_Q{gE;$wmgO(W5xMe;aIl+d@vWweZq+mo%#b!$39A{ zR1R4D2q)E#7AizP;wB;%IC9XB97rx((Q5l%4!YPXsK)S&CCyrcbm>}Y7HgwfxUXoI zL>roAL$h9e3SF%4WdT~o$w!l&xM$KbiB5}uE$rml_g1s*0Kl#Su?AU(Jk=K(OIjTM zTha7Fs}g#wv0Blr1A^eec`4F*VX`HYS!naxozr^iF69|Q|QlmHIZ01E8_!IZOgBZ zEy+QD(g)fy!UF|vA3>EC;zDQBcW_;e3%c^G--GlJF4kin?zLR=kv8HoaIxb-+vsEtV{^`5JT|&Lf7Ioq^R!%t zlP(mz3uvPmu;8W-9Jwwx?a5)R$ayf&M%Oq-T{b%I8g+T;b;pCiVdsP3lxoa>J%@3K zHdv-mS-~m0jb0V~o5Y_#JEx-FH;Hw6iSyGO?BNgd7+=q2{$a^K0H1B-f&Wv`FKlNm zN?k$)(u$qL`n68h-=ELX3TPv&%t5IOM7Bce zn~hUfuKg9UGM73j2b4>@-Wi|;bg59aLM@`CP`3)Tn1-d?eQvIyn7$~~{DPhCCMu;{ zq&^oY8?B`KAtQRh@sg*WR?&k(-6>SHNqtkOT9cZT_b={xM61#)cQduoq<-tU+EouP zmFz~xqTG5!f}$=HYQISxa6E3Wr^6;y;$rFslX}eYhrD{a85A6)hj7iIuYq!*?Kp&_ z0Nn=40t!PIvZE#iMaYiPKZ@){q3)rFWLD*q!2o@OzAIE)nzGp}mZvS7hab?N1-_s$ z9!4Jb-TFN6eA|oQe5gNdNokJK^Wfa5Gd^0tI(J*22A;IB9oE#S$Y87krZ_R%%iuIx zUruv0+pFL_W@I=oNU7b{)8Id9{Y_f4)%G?xB?a#Q-!}dP{G!x2*Y;joN7;V`wWMn_ z-h<|qg0Zapmp_KnA^dK!9J76pwsWs|HB* zj6Rf2SzD=31t%a_BDfHkl5TX&g!GAg#`|21Zxt}Eu`|9c{Pj-GFBZ-g$-gI>uUnYk zA)Kq-oNp9s&RovFtTDPo=T*_USFDwYoqzYR^vyiRTSPh^^`^Y?<;@0vp`gpod5?v$ z+{3t5@~=8M|Lt7HKe`xKivE7d4@#*wg)_fkcG~i-`aEd9q%l5L7a})F^%6zRs}I^+Js}-nZRgIA~O9 zI^MC38aZ@_DSOv_E2w)+*<0?ThLgS})JZyQ3F5TiyGllb&aXrEut|A5_Zu#H%+&mz zb0@Dyb5nkP&&Z`kY3iWirgcJ%(mMr@8~L{%i0Gd0<>N%X9ep$ETbOrkf^)Innk8S~idQQDdJ zlrfcZg&J{u0ZYL&nk>{I$1nwHI-O(6W?})GP76(0ffl40R4kP8Yz9>*nRqsXmYWoN zHj`GFn(Wyu`l6D-vss{yr>TR+x%8A!qx4RpHL%?7cl}$ z>1w6v_%Y(TjIK9jU5<~8G8#2yTO5XU8Qo#ZT5@wh-DAqu=6bE=^ev&3*X8tGB@?g9 z>0y&%uPf*=QbvdmR>JUAWzW~$)igNtkvQ(?0 zjb^#`ElaFb)M08SEhW|!bdO27QQ!IWL!}8{c%Sv6DSJbx*Ayjl$Vz%MO;uZ0(uZm4 zps|`}En+`MsW`vEx`yTpHR343NL@=yg*xPzi;-GQ6{f5!ufP>`_dJW8<430KQO{1CB-#AjKIK^xG*~I0=3c?Oxf=sYo(h_*&C2uM7JqQ ze7T73Fe&zBBOMXyB(X1T^zTXrUsi$2!9k8%9}XIu=`%u&QkB+a-9pQSQod}ZYNaW@ zY@cd`y#v`Lbg81m&r2v`QtW334G5+D{4BkqWbm_= zK1&~@se?w4iWaliqjZDTXYHnPp_HFJv|6Y`;%6__n=cm?TEjFoO&v6L(sH3j z=??dxH9~8J8gaa2*QlQwm8Roadyt~kYRdK$?6XE`n<%52BYGhp-;) zCx=j&H8B46lgE_J#`rrx(@ohP%&iA#t|_|&bL$nfSSZyKS5T>vNl#os2QT>6IfDykFe zv}VPr##OWr=YmA1wIvQesKX}3va9JaoDQaBS0ks<3eR}_(8i}Mj(p}{>&#%Ipx{VTm6@zspGVUzb|uN z?kAO+*mlLKfrog4mHxRJwWoTfM0)0caIQUzo>VP8dDcDoy3U^e0eE(IDx+_q4?eNf z#FmaPYtZv&VPT@3S8yM7;+CGB&%c(tGasca^f1t%qbO^o67-Ud4xGjPQa)s3cJ%I) zILYR$L?mdm(lL()v9}zg9GdCo{XIX^Ob0r#Kbz?;pcTRi3SI`Bg87Q~#`g*5N5HxC zTjFu|TjH^pqp<~#U=yU3SVwtP+y< z)BP;$+?4+UT_>ex(Q^A+crN1FbLj^Kc5Oc8xuR{8aHADYltzGonq3MU^VE#*52Q}jKb-sz*u3Q?(|DD#08vg<*qXXY1aqA993V{VQ z4LFO=0nVqnKtC-47Euwfib{cXR0(XQmB0?F21ckJcokg$yn!|VPf$DXE!qbBlh}V> z?0+cs4UKDbXi}r(CrN&qCbesygLJ;|{lYI2eu?nQwH`>Tv>m`zT0gK_iv#Pl%Yn^O zs#Qw0OR23=szXY3NvU2bwL?lpq||`64`q|u2ynM{2skVjt`ZB^iiN{s;byV_RgvB% z(j&q@E_UwKzJRj#Yc~KN)V>USNc$S_VeL-fW7=`x3GF`MQ`!T-A8OwQKBGMhd`^2D z_%rSMz+Y(p0{oTs4DgipQ{Wrgi@>+ESAcJ8r-1KhzX854o_whN4tdi52sHFR0Ui2( z0(13`fCak6;-E>o12|331J2UDK%YJpIA5Oy^y_ngMfyTuxz2Z|O6R+?O6NOLC!9v% zGz+I)I9r9&A)GFq?^>_kqc5T*xYxyahxt2eF%{B(0B4fd)!J~qw1vQ;D1A;-pVZkGUM+Hv^J}G!gP_uBUIf4Pf z9t+nyBKao;PYIqDB!l%eL5rYIuv#!6SSuJ5>=8UDcvSF7!PA18RcaTk77Pe>2?hm+ z1xEyr2p$!DQt-6k9GkRVFerFL@TlMk!Bc{#1<5Y;3X+5KKEZ0iF2P~JBZ{BHI$eTC z1WyQ_%4wsSwo^`)l1uCeRx8YvQi8*RM-=8U|3qFwkn^X6LvH4fTR4K0FPwbl_yntk zQ!V)}!C~PHD^3Ax4i|8#VaXp6JRzJDl0PL#9^Q#5B1cwzCGXIF+ z3Bgl>G)e3TRtt6s4htR;JRx{WaVED>i>+(QPPQiKzzVzs`*i+N^#ZJ!{Ke~q7y*}1 zj6RPyD>u>I^euXcens!nUof}brdgq7$4c(N3Z8?U6X?RfT)gYc!@TXr$yq*DuL8U> z^kB91(m7N}cr{5M+8(mv8-w|e0Eb*p0M~gKzeJ3)HOBi3z7KrJ&S>PF1U_Zq{L2=W zzUp`ycwg>wKv%&pfFD|31(t}l19_*BR~AlsxYX-9bN(Qho&VrtIL{0J6}$4}Hz@mS zsdv6`9u}{Tiiag){{TGE(E}FrNe+;|slff?0_u1ZW=DP!P^YPoYv_?2R6ALA%764(;>7& z!&6KJ^4Fpr8eId_5o;@uzYeI=-(hCfu!CBO{LS+I@Ft*6x8qDm!`rd7$lr<9Yjg)t z#~ZR*@RqC|`MYTy^2dQX-Gj3jjlK??N4?rq;C5{~b{0F3pHG(}UyR+< zDazM;TB&xCwpIHF?fcqk?N8c+QNsJV;Q^vs$rwf$kNFhg$pAwp{jur|*o}_=?7^;g zyxu6DEXIG{7rn9EQ^K2r=$eb@nulvXVrl`RXd$lUG>q#TXzvejy@$K{Gops^FKqNR+8wn;7r6rxm} zO)wFv3nqi@!R|;1bW?qFus;+xsrF!ECzzZBE)Ry2p*X1Ka3YDMFO=-u7>xFXN-2@a zZffcb^d!TvXen)qhLb~WvB7vxXk91@o5>K|O@#WpBSS5*XsoR#9v(=x4-JG8ox4zT zG`XxS+gmiMOu1P`ZLv5?*M-G&Fh0~(Ms=Y?C>{<*!h1ryLOo>}f66lcl+pUo<(or2 z$ynSpwQO9uWf_fS)Y;jV3?{=pfp|PP)CBk0xi(a=y0o;i{1e3GkdF1IJY%< z2P2_1w5l~8-i3Z>>K}-N`a@B!Ef%c{C4=DzzF8iqt)=!_YQ_C)4(|$;)luDw(&Y^` z4T1U<6%7rwffY4@lB(Jj%LC=hOUueDt7s6fy$DKWo4zPuA;0VP#LIN5hz(vQCStJ$7e;wiu&aZ6}1iJ^$iqg zYG@$b`nDah%QrPqbMu9?ITr2-)vRlww))NW>uJ;a3)gShvYy(vY@mi#YS^%8Bh@#p zYiyVMwnc8)7HVtSD)d&NReqb~w+a7Z$zO~+(Nx#jNxOoP!4T3wWMD^-YJ(iOBmu=C zO%35ls5O|}kq{~qazeJoL)(Mh)Su{y#UtTvY8y%(u`RsGLemVIukS6DtJ92@wBvV^6H9N5T|SX{VQ6Rq zlSc_|whTE=Igr=IV}ntZ?NeFSlDn^lCdUD_?FjA!CgU+AP0?MPwDkldAks@8vRF7{ z310YU;~@IAKO|$MF&OOys}23kk{Cc1w)$vaI2yuy5f7=^T?QS;k<=_1b|w{F!c7zF zpog;2?cu)SJ}$$m9B!f}nLs4m6W$Ztno={JqUOQwV6-?zwe?_W&Gv|zWJ|ycS*Rt5 zXo9#clpI4RvW2|bv<Z7a38`BHPvRl8is~_VV)2@I>~gtX z(ll&qN;^BHVZ`$u#&kTh>qz3OlHG$Snr7AF*UW)5dsB25_7dB}eD}vn>O$RveSOT& zXpgHuBbdCp8X3xzF~fw5LcKd2K~))P%@Ddo7E$ivL@cr^L@hDE#!x>e91Fbt z0Uhi$GorOIw4Jzc&ER(G>;`1TGu1=}ijcJX?lCk1mP>mq~_XOG?hB)PkE{-&--No1*_nV$j zO)Qy=^%HNVsR7G&Q&f%H>|J7NJk?%UgFw%g$Y_Zm)J;)KI7+pHaqJSK6c`u?1$mr= zFsDig$bK;p4fiW56;Wy%KGwr%A{if)-Hq8Ib8Ru(m7=({S+n}Mg-Db?L7cta;ayF7 zCZNnLKpO^lrr_BaJNVx8)KR~?C!{2pvoZubl!^^=wG%JK^UUp)nBE-j4aG<%m&_f- z?G6o4dw75@80<$THbAuz^d|+dEl0u?sZ~?#o7t=u$wsO@cDX6xonZ*2`6-N_l3GH^ z9kJe;!El7xtJWktF+3EJj?vywU5q!HYLd!+xZ-`J`J6?y2xFM2-4Pt%G&|6GOkR>F zRfI_lV)PbbjVEAG#r(jN8WeTmU|*DX2t5he8zbyeB6D^~`_dMQ@4~JS&#^H3ZKdqe_ zGsT%{7&4g|c!$su97tgAAMHyMX3t@6z@nGn=>TIt;(&^L2D@8Y?b*2U2l1cY?Pn0=b`%2-ZT z_hgMy>c<4e`wb2}nIx%a9Ib9`M&8Gh9_I2?#VF4^K&dj7XPvBCQfxH&Ol&OG@g(sX z0hVVp9(~KF3A7nh81uOhjj?!m52`Xro<27Wa*w4W3eT6#!J!zKyjrd2zsG?-OV64d zYtmDxU8i`QCU%Jo`%YnV+7e16f_QF%r0f_f;ojlXxoI&Q-PV7x-Vv8s0 zr0Sa};XY$4+)11^CDe|Bm+moREy2?#)n7D-+LJ@n9NrmJOL!{EQ*kTjL3w*|V$_3E zyk5eucJhjFdWH#&5=>c(@ZAYAHDY*^2A-=3@)%C{kT2x2apG^6^x%;WZ9prZ>%d+UCwJnt z)X)Zv82IR!bX(d%4JgY~i*Odm<$GZ#%hq}AsI6Q4@IjJ5{ZZ&8kw%aPp&!CE2Q6dY z*xy~aq%Y9cDBdLZqkIT8!!z{GPUMF;pTqjQIcG0Y9He_pTKX@aHQG_D+4{nik6HcX zVx6#R5!%hVLFsMS#oda6GE1LVgnSR}fR6H!`P|#8-B~u#_swWq4}5Kh&TimkFZ zX%35zG%GS5kKkm%3ad}o+-}Z$gMx$h$=>1XHE%OZa&v7y3ozI2GdRh$+BMJcRXAwZ zyu){UhVQf5Ee?kprX4txcR08bw*j4Lt^!SS!_p(#xnyx_Zk*h^&v9GqnuEn%QqEzW z?A@k0xY|Op+I5F#D^wj)$6>r5@C=XGOYkPV;9RmgQSV{HN8T_uhHK0DZZL#^ZLKMoiTOHmK@9?#rA@6==Aq=(Q8#SfIy)|o^oqN+e{1d!`@P?)J>@RtS zoF%%>?I<``vpaRq5E>)By?>J3;qbP4Tj0VisLkPRc8GnhT6uU2YG)5woa@xhoM-rk z9Jn$3Q{7!i4wXTh6w8@nInipk#C_uU-ky%l)5}j?CnxHLhDi%wRtNAO#xX{!@Z+T` z84fb=pPDiFPqrBRcTWud(;^1{0S$xyT!X=X^T6O=XB+&>UVOMBtDhQ=RpaxUHs)8uiv!S#rC>f zn65C5$h^YRB2&7RrCS|h98-=RV?Q4t9*kKE8gBF7l&a zEPis}!e1Xi`xv&`{mOd~xY>UEmfnxq5JZ(jQB_&wRg62)US!Q+bI=dq}eXB?vC`1-z_;1y@y z2$;u0v3M4*DY`wD=KocS(hE~xe3G=5R(5>{uBZBOZBQ~suAvauB3wmyvsl!MOxB0z zp6t)Ywz{@U-&r#Gj;a>|Pi)?IvifshfuDGDetw6zh*JoDj_3%ev%rqp2tNgMG>5z6 zcnQ`~6AE?k!`Jp;PcqR_x}v0{yChg&+#Brc;0{t}7z4d{xzQLXtEeQis?q~yRcKD& zTgKB@yx-?+KUVgS6?@@w>hopJ`%=`{^qMR^B0N{b>mrdBKAn*1Clr!{6DjjoewCSS zwr5}c`12QN6=vPdeW@op@F!>UGkbnWW@JmoJ(5olo5z;sSqj9y?9yj^BQxHHyqCbU zjXJf5l+Mkvfk#Y!7~YrlRKP0P)udF$1Su=c%(Am@TKJ*}lk0@C=3zkU%n0&= z?6UHX^bAa1peAVY@4&}2ao-sp;#IiUcknx1gr9nyo9JkaCAWunX9BPT{f5WR4!-j^ z1CB){mwg6TjFSmvY~|S+OP%9(nBkH!vHDY+NJm!2NX@4MQ(%-G7{`g zqp^cKW2)*?d&Kj=-&lUx-&nppQ~uM3&cumGS>qY&zww8E`%3tgDGiV91hwlaIRl^d z8gXqMCTdoDF=ippv;Ssl!}I@UeCucZ^C z2A`79Qm0B2EnO=*C6xMCjfid;?pj(2CY({r8bmP#@ z_)>!Jlw~e_9Sh%$)X+ofY%Gp62>(+jV%XDx=5w4@*x^&D7|QoTBZ9iHgGSkANc*G| zpUn*5q=`N2!%i~^9rmeC>eyiNx%FH}sy(R_q))D^T-v3)=*5{=53G-GU8Y^!M#A?J rxi11}e*!-8DOm*G`Tn2fQ1pL3|G#>mOZ~l_d-1oF{^#@GuLu4wFd|9$TENf1uzlJX=7i$dA|a2Tn2zETbVUs_M&|Twtg?u1%`f-m*70OozUOx(E+t{{hbDUh%b2p2+F1>q$KA490y zhlH8;k;5V&OoFfq!X^kGL--j&3q=yEzA;V98fS&6i_S>4=5FAe}opK)q=EI z*wo1W*bJZ*K-Yop0X+qJ1M~^#2M`w3A5#L-0MZ2-95oO#1+oIN2TB9VibCZy5Ss~~ z%YdqJUJu(6rH8cv-2!?D^aAJ|PzO*@gdUWI9+ZV1_A5#slb@iE=>v@f>JzCC`O}B8 z(1)_n2b=Z5W__?(AM!T{bD1y*^9BkB;s7N8r2vV5rU4ZI&7EL?Ee5Is+6UAIbQ;Jd z!T{>T0J{XAZvqtnMF9U`!eHz<5NYCIY%tIz_>vCvg9G1K{Neyb16M@I;z^0`Q9PU&`wOuSDRP1RnJl?h+npKppB}36CVAehs=& zOd0SBz@vXkKq^2|UKu_^H`v9acvS+A;!*!5O^@Q$3Gz^1r$OM67R_$F7J;Wjyf%SH z`O_irM!@$Y@JJsjL#cjb55h=!6hDB#qxgXY9>wbsYH z4;uRWas8MQ_2s}zPtQ&7m;E}x+1RmLI zN#K!f!wEdH#|nsO?+5~q;;jihve$;dqj+0_JY?@k0*~yq>&Dv?co&FwAn?duM*@%R zbt3RcpED5AUL-@xqxew-9@*lMX45;v)z=ijO4lC_aiH z50&2p0*`Vvu^T^$z=3;<*GK#U~Kt zA$t=EJhC^b8_y%~sBKLq@S4C+A@KUZClh$2F9k?yAF_u};8DDQz@zw70*~U;2=b79 z!ft#zfk)*jBJgM|$RO~;fX^iGNd8nHqJ3Ee9>r%9cw}D=fk*Mv2t10PPT)~|E(;EeMUZkw+Fs}z$5vEKt%hC2t10PMc|Qrvk5$kFDCFPehz_0@pB10 ziZ3DXD1IKn9+bcN-S`Cr9+l-n0+0NC5rIekzL>xx`AdL^`CCfhQG6+ZNA@iv@F>2F zAP@O_Ie|xWrV0X&>|ajcQQx)#W<*l`Xb!cKz}FIZ)DNTn9mOj{{~ZmVQGO7w0z7J$ zsDEDtd|yKUUJ1{nJhFc^fk*bQA@C@^iom1zwFDl;R}**?zmCA8_!0s**6;Xw!=8t0%e8I?ldjHL#qr5VZT96vkm_K(WsH@gT2#egTL(> zPvGxs4SD%K*e4BB`1?VF0)M|~#KGV18inxpt40m{{iV?ce}8IRmsh|-m7l<8Ow(h4 zG8V_lgTMPx=fvS~?J%AlgnT=U!ZsT-&XvPS7R1FQr=y2Fempk|KE!4uKtIpP1O)z1 z^WyM1yS4jy7SEfiF{@(pfbX$^9C=-`AVPmKRYhYFZ31!SL={?=h|5ps3Hbfc zCm}y3IXF9&8zSN*+s37~>l<5)bn);GG``5HTg-Ed%eeMqg5kNtotuUjv^PJh zzn0=!+46BtOaO1B&4WT%b2@#MHtTvALbSfUvqNau;bFo_&389BG|9vR=BV193fw&yaB zeRHRp*n|t0YDByz%aM5#8>@!C@|)}3my!}s7AB^5HzMEE`1f4(ySX(@9QkU`v1)g> z>WuvT%)(W^Au6=E?}dchBiRVroBjEdjF}nV7XLgm-fxh_4^M0P7kd-ud~b+88E5y$ z`HjxfMBhM#L?~iaRL;E_p1&f0jWLNgNA>*64S#QB8)wK1`rj;Gb)Zdtv)+eeLvN{Q zHKTZ)fdbotdX zT0=94n=Z%@#`T&PkdR=!wDHB8)jGTKYC>tp1F<)0sie4tvwr=3;ODE^aU*>DJ_VkL zo1#h!%!o+_U+tc!g8G6j#bJFD9PB7GPkBcJ2XUj?{G7df>&{O<%QgI z4R(@XDmWx6%!HoaiM-*kwk~dZ}ecZU5 zrC+n&QMG~`o9O>~?;UNUvRk?)S)1*$w7|NSn&*`g&TFg;l3wtLMLn~x^hM|M=-rt4nN?r%>y-&(NI_2<~d zel^a|+mtf7aSq+@$g){l%wEt^J8l{8)r@ z?2aqeHXafG?)$q*Q`;u)zMr|eZO1c}POl@kOjac+`s%6<)4sL{;hcKl=*CY@doEvB zl*?nJj^6*Y+2t4Inr4NP#pV+S3Xkhk*EWsS4dumi1;N}b5j!JR#1nxJ^pKKo%)0vF z#UWAFjP%$`<4Jyv2lvcSd;4Xbe@MBR^!=tgMd<@eZeowm6@1B#X{$HOBW|tl?|9DB1%ilQYfAMS@d`=tv@pY;{& zuI%^q#H``kjo-e0Tauq^G=vm5-^+7N^Aa6y%>&D-V_`Ml0)73{PrrJ(IHCD_@|Sld zrSp$Dl};@v%=>-%3AL)pLN0j1<^G|I6n9!DxhHH0JpaV<@JmZyJ@Ux){k@X<`850( z=Q3o2>7L6!F2%TyJ$WI#->@@B7EU#=$lp97AUK-NTw7#w<(=P~r%&7HEw!rmsb@bn z33d$23|dE@xOUc-L+}0G`Yl_%Wa$21Ej}mg1P0%K3~*83YjfDWE>{2h&97(gTdR~d z|N78opu=Ta=bN~sY;Zm|sJ;j*xtW%8WpL${Gwjo`8gHH&uPVrY!ZVGybGS~hbJ$+> zNIBBP_LY3W>82Cb)oE5s3{L$t-#P!fV~d8>&^(jOw)-QJEWdJG+?Q9LX!>2(L>bkX z)^?=)?XKE}5z#G*n_td$`TDE#@{omhw07nu|M2%d(w32=q9EG#Ug2BKgkgugb{;59 zsp&9p&2QM5WpOB9|Eqc53=fUEnwGRGrGlIMgW8*i`sNxJ7dB1R8T35xxX$jqxx3^F znuhIM6h9s7@;H6Wl0gp+gq>u#{+=w5kMK9@|4hrw zAxue?JZIghA10lpAsS@;zi-`b6U#y`7CEY(wQyNv{&Zw^koKZcgDz+M?yOU-GgEM# zVric9d(h#BEsILGk4W11gRMveRNBy!bA3Z6jAB7KC-~V}h%I>NV-wQj3%1>KA z;@G?6t3yfy3T}9P%#`;OUGaEjxL&1Q{q^onH^1_&RvTB99a)|DaZyp#l~-x*ESIpC zHtVWhtn-ThdH7a@zuvr&C)3K0>d${vuB%#OkY+rAv;F1RM;ACw)^{sE(AHGXpTM7d z?b*?gdFDAbWhK=IU7S8TJljy6T|FRj<%`L65&P8p{h9X3Fh?#*m6DaZmZBW~X7zzA ztE1|E^zhm3_B$>X&klIpXSSy$_t8PS*8^>i``&5dvMkg3^M?-IsG|5fd)2awS~;Si7PV{X&^Da-PS1 zx$^C4)rfJlMT0pXLxUEa&slWo)}bKv*@GA{>xwj;#|KO*{AgE?W!hp5H4{1x=mb5- z^vnywd^UMF|IoA@V@J$@E2`pE2Mf$JP}-o0CpdoBF>g~P3k3bohcPE!MIg=?R`+b(#n z(V6fz^0BRE_4>SqH^)-amX|$SaC^rlo#UI{KHN0tZqoSGzc+2=?OfA&xX9Jj?VJ19 zuz*KiEqURTq}o%*<0h*poA1T$rx|Vz*zaFIR%6m{n~X7!mW{mgI^pG`g*v$tcXVED zFWc)iCGKMLj@L{2HD&1EG(Epd|6Sy)Q1aKkefA{o30u*;cjc6ju#Rta(@5+T=DoVa z{XtpSVh8#?)uXSQvG|vU#;20~Y_8pSzc|Wc`rf>sr?`6${ha#Q*rDISd)Lvi!et!3|1nk86ul0us48Fv-vS8JlHKr z&SvoVQ@HUAUaT-in2iZiMZ6SPkE106Cgdh_W74@;Dol+M1i}=I%+IEzW?({)2otU@ zqg`z6Y#r=JaGmU89b;k>>|>qmT^#J=ogCa;U7Q?ZoD?!qb>;LX*R^Msa0$K1b?a5G zTd#86dX?+O=|!%CU2k&XX)pG|(_YHK!M;}s_Pt85?^S|BuM!-3mEh2;1jk+_IQA;R zv8M!y4|cg%0D~Ot#R_6_$Uzhzj*FAj8>JuU{uD+CmBtCCv4h#xG=H)ug9d54K7~-} zEGa`FQ+(+D-d!w%73?ErXrVO!U`}8NErce0#H3S#SOGpP|9?+H7{T-aP(Y=#!LW!f zg#kVhY&xZj4W@+$hXm0$?BF08nMqI?N)HMSAv47Bgy)P%CRwT$Z+o~oUGhS^@)Jh$ zq>!01N#Rit4Gd=oOCN`Yg-JhB7_1N~hfNC#rBi5K@?@WK$khK86T+r(ddlwxrv#DN zKAa$004pe%kf&~`0z#ky$?X4~fb36ZLVI4+bCcCNrUwyX8*Y zdC5d^x`cDsApyuxsUWcu29%CJyQ`ih(tScaIo)EQFxV`LA1#KLPDsdrcY9?gB zn?~jMvOK%$O8P7~i0seC+emM*WPdsnY-0KMip7=p8iSW&FoSI^ZDG_1fAD1r$Ga;F zY)TM409851o5Bh6BnJi2X+do3t|lufYBq<-@@H8G(fp~jAP$@56&yx}#z6@QVzas& zn@J90`;Zw7Bu%C*htjFEt`_W14yAjGbHnoTV$#??0Py1kv!L8VrL45f$P@~VfocT` zSzKEjD$O&*8!E=z8kH}F1!ma8hzAM8gPEk_S^kU&sYDL$cVIY`763H{bxbAXFqrI5 zB{QIl;DpirdwVYFuh_B)#V-2qq15D{5dUC0xb(j=X0k%TaisD7wBRsSkY5)Ig+uS^ zILOSd=0O2L&|OOVAqtBLwzJvb1yU$0B$&hU;sgY-pkH8f#BJCIaswqMO#?kEI~Y}2 zgg>R*GrE63NbtY>h6GTdVAveoco5BoO2frNCkX-=ELMQEw^ulohPok67@3axba9sp zwZ;b54hUfe5ah8z7%e;iS|2@_!=y1;K@l9WzXx&XFj=9K8T3f7w5P8j;drw{IffRB zdrL3rpaX}5-a+I5ALw&rn*efGC~6p`UGPv`T}~WVX(>RldC^fx;SOaDEs#Q!)HG`C z&=0cw*^&ohpORtzjbjprL(U@^yTrOEECvI*2PB3=@u5-tx?I2$noTf=%nFuB42BV= ztCtdk!Md&|5~&oZNfr}2X}k?~>s+Lrj?@GOi-L+*Tyhct?0_IT)UY%OxJ3~8pV7fk z7))|NS1kB2G|aC46!#WzBk-oKv5P_TCQ~AyGQp9gRr{}1da+ z=tHk5BnC5B-qtKC-5)ft1Mr@<8_RL*@qlA5eiRDX2Zx5<3762t!gR%6nn#}q&mcOL z!U(eVB7>K)BRF{BTT`GL3ku+jLY)fCUBE}Wp8T7#Vf$vYc|tCqmu1U}=ke+M^i(*a z69{d|BDm%qn<0XYx%lK{I0Q}nvoj7m1b2{k6ub&hImRehj@_+aI&f$2a2jlxgA_3| z2|?FdW6_6hf4u)ri@KmN()npvLI4pO3db(-F$g0AU5KF3O4voy=O6n`JH}k9p27%M z*}P8*Wpjl*K#Er{w&J5gqQPr1tSKU{`M1ky|Lt?GHx*oLDCr$av{Vs0y7<}FK;!WFc&>#%CmRB_(kpWXf~w5L}U%I_S*SZ!N4PWiywq-S@GN3_2bTGkKZZ z0Im?N`{3AwDNJT~Vu zmPf*N^0!&h`~C3R_p;ea-(=QwBA6l&ay>KBVG)>~&g6pg#ih&0c!QP9M;9*6#4qf8 zb9xbVmUgO1)R}(b4QNRbAQ>{CuXRIjVuw~?k2lRTdge6TV+||4_}mdS8LO$>OkNz9 z%}dFEHLpM@gTL=Fc`arvhkeP-A60dTM4l65c_}zK@*~l3DlaCHk51gW8GP1n=XdNO zhW&gKNr|}W%qkdZAJ&IEbrTUQ_PU$1pFKmhtB^MBS?wNd4e$q8&NT<(9`@%V)DPwJdK=L$?Fd{31@r^E`mvPGk_#qK4R2lp&0I!V@+ zYMzy0BRP?YmLwv~n=Vrt6yu67s0x@JUp(KsPGhYY|7+vl#xzeE2y$B}3bqKHtq78n zp*w+%1!+6w%G%yJJ)sF1p}M_(>fB|=Si97Vnp%I7SND(@%HvLzvE}UU@y%GY0@kX$ z{X~Yn1EYA4dh~h6iS@EbUOb#3viUKoGT6?UCqJN?$-VfeEN_G}rR4aBd3u2b2fAZr zKs$^Me?^(UaYg;Q{s^*fUF{TWi>Pp!Hp|RN7V%)~B)eNS6V!8?5cX41qU-TGGfG9H zq7OfL>v^KWfTZknC^rYHjMnkvGv^`)d>h45dCc_mKQOT9)%OiC>|T&ExZH_et1;-9 zKJQWHX9iuPtv9*sv>|f|R|W^?#c=Z?M7EMAEO*LBZS|S4^YJ%RpHM1?e=13Mzgi@V z6u^l+>IY?%u09d+3e~1k_{@)XR~%VuW+s`%A4>m2ga&5t;-;{D4i?SD*daM=WleNG`P*?;QAX=#H`*%$8MO%A!vSwzCAZ+^^f+xx z4u7%ds)2fcLdrG|lR+lM#B+sSupJjKln!4S9uI zyE867pm#)(w>FI?**0n4?+InY%@)~m(mMX69bw%k?{`zES>v_jw5D!`T40e3HX}A& z)MMb7xBc!NUDaqopM5xdA67WSdejoNL z6p27#FCvyGPp`t(%41Pyt{*(yFU_}@XQy=I4aumx6+v9MeudtPlQF;{io6R|mhPz< z(x~62UX2%88;=NLD`e0xSf+IApuT2Y{e*CVlSdAdkNoVpJT%ADc$txh46b{Jz9%c~ z4svD19|0?Jt_`7AM?9XlbbwMG5fnlvXNUwT_+GD!rK<O|1|+6b zHLS@x4>N}M^2pO>t;+FY)vYY)%&$MBOhknT$v}p(YQLdoYS8iBXK>{-W~ol+iSyKl zhs6-Qh1mY@d15fB8cGFTOZ-g|4f!GPUB61}!<72$=Q3#7(W3fg?KxBdtcjlo}$pbP|hKLIb^7xsUMvr<)!(l6*z<^tWLyC3&i!(4mXeWv`El^j_puNP-E zK4AF-HA+S5?kr_fe@f$#?cQ3^j&U+b*@C&YvZ)MJ`IvQH)4#lrWzN%IEC0^#fTS!X z1%oakdO}~_ZT6ZtNp3f4jYC^%N4OlcX0==#Q+EA+(qtKR=pvy^_Nv{Tk6{l<*b~R3 zjZ@bo(dS=m2z#nv8%{(~k_95!VX*c@I9`EY|MJS4Z?`hm{&H|I@wjF#i^@ocdxvyB zobAY{ymsWtdz8t0UvdqNKBh6Zc1(|5vhcoFFJN(h)vYOK4J$1{c)3uc2LS=sybm0` zVe=~Vuw*b47ZNlHxQ8iX2x8)8bbD3a-i18xP}cjObh{9G!=lQhqi=jnWpsC+p1&V+ zvmEm<#OA6U+)-orhgO=jsBq%vk#}W4!kF}=Aa1Gv<{RC**K5bFok#X=a{Kf6_0)K3 zV=5R{3o?IHvt2SKiGkv&`GyB` zUZZ(bf$E31HdAvvwm&^(Vz$sJmS`cB9e^*^WK`%asJn*B;}SOF!(p3nuU*Q5>-`=V zNycfh3Uv390)^SF8Y~tVtU~Rc`XEr1?APM4-8FpN9kbnIh&sE?%-fm=Z9pZVt}%4R zs`VN^d#fjQOgntXSqAd|H8YP0AJdBFa&g0#%w4AGz^rh|YFG9Qm1$$%LY}M>40k!U z3}t%qxUb)=n>tuc?24*KyBuX&nGX-{dcy1vI@fNCwO#qnkI_Qr>6)jjE)Tc$FFFwS zGsJLrJTVh+J2;4&+}-)i^4%|>>}R%JReNnxOPwF{xuz+naUKy#Pl1zC@LtKWt4w8m zol;zd>~3ne-q`o~43D|~x?dJ+--wpMGvUQ{8I*nC_QhD9JhqW}Y-Maso=0N@KY)|F z@vRIBHBv8uup9Kp5$8r!#c`u8GtPIm`0YJky<^J8_b+=u8QjE}IN7P=f`?RiFN1_N zq(A*uyJn2fzQ?~BDUFjPGi9-7_3RsBYqq~dMYJS(+}hU%_j*)}-Z{p5!O<|HMqf7U z@<}#SWM@**ukJP?^x!`mr|qa3_QkAL!P{%#_gfv%!Uc4B18sjuRQ+X(De(dzlO zz07CZm?+P66DDCqFf&G&o&;yp-J5uSh38dhmJBp|HrB; zmppkXa^c^5Up!-nPo$Ns>u-FzucJQ^3l|7s;hxN8XG52oB4c*swCIJX>94q*`qz0^ zj(??_XY_2NtqC&lf4e2UcTtpEk$B!0uvrUg`dNGLDt|M4{b~Af86mx{{G97XoWr8! zvDHQ=*v);?8S@_u%p9YXmE8+c#%y`)_ZGCW2yFjUWgPd#H-B^A#EAd2-mR+VmSIhCL!LxnZAklJ`T#D}%%r0q8J2!Z+TyEIvLK#PFec!I&g{EZgDw zITYeE@yQL`kelzOGiyd>*Ue1#Qz04!_XoLLJ_WX+GP-pP3J0FmAqTSXoxFxsU(Z~6 zG}Ad#q){$|#+O>5F|ZxT7m?xZfb1R{GFum9yg*{Uwr|YYdF2MPj2bp1<-!P=;SE+k zLT)@A^~oSZcDhhue|_|6q}IbcQ19!Ir{u~+z$M)T1Svr##`^!ivUm5L^DY>|mdRy;hy7E3?9&%VlS^j;MPJ8bn zB}#SJxc1*fl@gp}t3<}_$2FW^gO{**tf9>*ipQ+c-@j#Ly}Kg||Ig*3+iLPoH2!=& zlY4#A`cQg{TwGS=^me!2MEsBC;{M3;?^s?RY^%f5y~h&xzPr6P<)4pPCt0{jGoJ-x zSZ~Y4kp-cxsAvD3cAS0X%^OEuN@fs+$?*X_M; zQqm6k$r#RH%aqssO+K5DSAAS4{OC}tOI>$IT{ zjPObO-K{M@#*Mf1FH?ThtQnmzSvE;*MC-J!_6|47Qv|a62<|^8m!gc0v|EmyKGo>6 zplzbgp)|wMGOA^S$duFeAG?;JvK?$Svv}iK6KdhCyaiXQXDxY(gp3&EyzsQqVaB#O^bW1zdprI^h)jum zHavR<%>>4TQ;f!V*myPZE1UH)7AXD)9yQYLV~L$;%YNL9WYy|XpNqYB-V6=0JQ20y zKg7T-78y%&uzt&tN7bfJJZAR7*=Mg{i1*4>6J=^Olna~S-FGVz*|b*(m^(Pb^RKqM z@4mi6mRG3GA4}BTee2-8slzuc8ooM+&iI>Fvemb^vXZZKbE}0623_!%F>&qX>t~SH zs%Ra5$lJBXr(n@1C-*0DC9)`?2wrv)7gG13Lquymg?jO;!$Ssq+$!{|x-t2@QGto8 zi~!js_L?`dOHl4+CCi`FSM~B-rgYqT_TS`O`b^hO)%HKWXKIu3s89V`u=A7bg^?3lc=OAjHwZHb4ls zBhks26lh*Q8a966AZqgVZS4cw$lH9auIl~0yp#`n>9{^&yyV>N{`F}vVIX0vCPyBk zmCAXPZHjx*;%odtJlV7*r>5eo=`4{Xy`xs2KS;9agn3EN4VF;XyRtV8e^Q(wN$;7F zkO0?6C5ao20jjupC_|Lp!r$v@NooKE1Y0!iY3M=$BRjpt;4k3g?|Sg! zB!;F3nbace#s|YzQ>^IJq6>oXH(~seUa)L9d=}3trA4@Xkl;81JEsQzoaT}4znEqf z!i~J?*aeonK?F_(FCvopd;y$0!FiLklwt+_mLYs$ww&`YL8t%L0@|uK{l{x^5wgXZ5Pna!gq^+lQ?fdr*NAJ&wSGF*1m6W=I zm+NUH!PjSvV7OYX&w=0MiLCqeSzQwN>4L5U;u(3PcB91g%29=;{)5RoPPF?~{`})9 zNlc9q#efr`p;aQi{=h?A`a|pJ$kvSgtn~{YO>6BJEiEF#ktlLLkuWAsB(0Ir`*+|q z@_O{Dyyw{u{Hu;+e=gluUoO@4?=;nx%8kuPlxS34Hf#?vG1^r7z~v+QtWB{x>ULJS zQgXvY$> zJ@0$LqJB6Go!ba;0Sq22NZ~DIi4o1lMR~{w4tIIbw1|1iSaIMd| zpT$zJFlH(Y8$CNn?uz3p5iWLY@kR}8H@|%k+)NrKwoQ`a#23+RB`ZmZvYU5?&qbht zF(-JA+QXO)KgX4np0ab1fV|;L1iN+@Y$-9xFoA|G0}0sbXCK_B=B^%+=eXO6S@zL$ z$Ceuk>|Vj*M*ec>I@}%H4L{y92^m1Ee%3c()#RA=ULidOkIuas9S>DT#$n~Z82bxuo7fy{v;LP336*eSh=?`36hXY$`Y$%p>Zn_W%l#n< z^a6W@P=zq45gN#V?62Dqn6{I4bHx1XK82Q6%_~R&)xCmy^jN`-Gw~j4LW#*n%p;gw zvH8+CuY);=gQ?UZsi7%~Su70X+0dqPSE~8Jj&psRzCPSeuaSN~;}k$JJKxq3^%cA$+(n z1BS(m6|(WwxCC9fN9_wj7iF~X9neS4_u%~%;1I_q)^#?>0dQBE?VkAox zr5>N~2tlSA4VZFm*#lNNiB2nKJ~k&p0yDV6Z1lpg1T*jM@nVEo7wNDsX}LaSzvj?y zatUomB^YtWC25UD?mvXmuCb)nYp&ApY;DGj6*H2TO49msMYcX7QL1f_NIG0*eLe;| zPZ)Oiz?8e!t|t2LzpiJsILqZR0pSmu<>>YDvOEhWeHts~YU!9I$Gaj60?P=t_ z&PlbFx&YDyG*uv+f*c*LH4(6G_pR3;tY-h&Gt6gMv1Y4GSGj*|&U%8*0Mx&Uo#6gi zJy_X8>-aO?*|}j6tGHokpy|sDjF`InOtD65_X>n5uiE-@Z)>9Wmi;09);#=RK)^^= zUee06*DF|x5c#U41H07PsB;#*y7AY)_7MTW=E7VKeM5oRt}n^+@P0E;c*4>5TbbXw z0Y(w!ckUPy5rR0lNg!1rDp1>nRJ2upuVNWBc(i`8s42C|OeO$eMd-stHy8d*A|=}H z3|x8ufxTUPly)7CpqA%Wj9Mya%a#SRB?`q~@F9WbvLenSXpX;wM&mQ8UrFqQf!0H{ zl6r@VGdHg6Io`tSU)1Eyd_raHA1ALph0_=y!LVY{_lbz7eqzAJj_LS#8+xkMx8VL{ zMnl2X`9EHaStbDlaT6r>k!-2F^inqT{=47Nb{hy zjtOY7w#^ev@Sgk?`PE2)L7Y$Z*-Kk8)16s8wb5V+At?u)rv~__dUE*QpPOdsGB*vG zKG0>9Amo35=nTo5)Bl{FMcsv~T~HdUsFx!0TR*<-RpakVE&oFTgO`{jn#x6gB_`}L z+Hn(A#fRaqoeQ!U-UnZt+H~wnqjW}2$Y+m%ub*b|as*vCFS(uiq{(yN@yWLanoJ+w zQ+JOMLhJptD+sCf7n(eOkKm;8ZS@@=IKIsv>Q=mMe>S=YTs-xXpi;*) zUPGwZT$i$7jYd|(`^wC59w&ZEQQ|#te2j-tMF?jm=n7%FZ744tR@4-Ulq@oAdV`e4 z0+!dG#qWI!)BV5vNO#!VO^Vo;qBM8GEk5{4rqh>{f5Cl%di@23r87zexa;7cdq2EP=kjA@ zOx+fZ)$A+l{0?S~QM0+S>DK>4o@9wHwN-4}Av>1`NY<&hk-DboZRCBwTZ@Whgxw6AvPAs0YIdOxLASY%|z! z6#^z-9kjbu&o7bpnhb4z`(?jwH{G&QeABzevX%7dZxDW+(Ng|BM;G5R;rPw&PN5b5 ziSN}FUUQ|-@&xPTPdz}w>{O8;5uHP4 z+me$L1u%{!bxCoYUV0BniJTTkS*bS6zp(Il0Dose?te<5q^C-ZpiDo3PazUi9zXn( zW8t}WYJ2YKUB>hO6HepD3EUi_zw9#t@< zVi}$h#Vl<~%L6M`*`vZ6oxX#q|0yNh+0KoE?o=kgJG%dF-Jfi8!S^DnvTWZpMA%dJ zr94!LTs^u+eSi`CI9_Uuv>x9Mu>FW~GIq}_&K!$C|G7LK`M2L^>DsNU9`O%cn6UmU zgp4uf_&~k0@x#m38-H2LD2vAmse1KY=Hs26c+{n4z?G~lNe#Fz&b)vX^H1e(L9pou&ha@`O4Oy>KB#Sof4{XieK45|j+55- zz1N&Z1YBAmw``nl2Yqqy?sGNvsnW%*jJ_U~)NfYgHU!>${>kUvk(-&b>JDGlov-(< zH?3WzB{q24(e@Jvy71~%=hd6$do3;w`SxqlJ?SI^E#z&xIaaRuLcDGN@tD4qK5dVG zg_c?QiE+1&OSH*Cdi3$GhHLR@(6qNMr=6avd6pLZ)ioRG&_+ZDaTDSGy0GW^fb-%o zUMq91R~)A}t)g!GWxDFpHMVpoDmV#F4hc=b>(In?D08pte!gBkE0$JKKRRdgi+bt0 z_+N4sT%<_GS5}hhpAo$ach!5rrsrzU`T3NJCPb32v=~aQ>{1jA7gMEOhkIHs-uX9; zzx?Co)=gg3>kS*^m1nH^AD|vZGekXO88UasAS1TU*E5X9e)@vNe=zB?rQH@n z6K@~ciqOgLs;SFw%<|f|VTbpWoB-*Rgn-74mt@pfec~L1@{CicxisIvt6-I>^}6A_ z6+LanQ30?YBSAhhx&Hwn-@C8#J*5@QSTt#TtHTD>RXvgD%Z((Uz5^B=MW7#k4WB9> zz4P3dX!x_;Y^oFlFV19egHbz_qz{@q8Q&?>iPK6MaM;VMf-=^7ZL+I$zY6vB;u)6A zlqW3R>M+uxyJk;$s6h&S+wAL z%~4lNpEVdra)U!slDmNxOi;sf(>&@vfAZg0uXRP%Rju}Ym1IHEL9(k5)K_l6uOmI$ z*?#ur-6M>(y7>$0hi6cTuz(m*lB5h8Qy&!}(+-{aWp!=QZszVCYd;#a1U~7JynCK> zK0LjTfY|toKZ?{^-wNY#Uv%qz%m1AUP|y_tX&03JY6jji=h)lOu1zWMEUdV+y3ug# z&6M;wfiRgDD=|lLWz${eO2tXG55RMSdKjRDPywtx{)fw2Y*S@kR^7rJv>9+0orO8@Gk4xz+?QIpWz5KS(aZ#?Z0YU}p#DfB7^*=)1%@XYvbvp0ruv-*yI@ z@Pw0*pCu#kD>)WXyPsXq`9NNh!_u*})>fA&`!^-zxtCu=Rbzelpv?(B?xJ;qh=|y+6%$IzC>d2U%&Ji7-@+47i?Pn*iT* z$3;6?lGHoLR>orw6|nMiQ#*8LPiAh@_&tOBoRWaPR?U_I=V;PF=R9NiZ0unl%-lx% z-Ihod|M_1pO#75KMZ=#vRRjlR=%kad3ORpm=?e6fy49ZsX9iMDm`m!i+MKSgS%sgj zN*1`{Z+b&BM!JB{i-YZLiA_txyrNN)KmLdRDfiNA@AcE}23nr9G3gx~5rakt5o&1S zHl~v68I7*4DU9AyU3{5OYce^L%e%d47`&T}I(`Zq zG}_{yAlvX2IugYOV>Dxh!EdH+BaC8g?-(uUPOUO-- zAlLQjScMk;CoX=`8DF-?^FUeI4Txs~l#) zO&~e!b%T&ck0|rr`1n~_?2kVW6fyWY3>6hT50b*_Lpp?o+oA|t4HXnP_EUi$Gg4Ft zQ%7H3Zlw(mH5HVVFl{*uz9n2CyAPf%&90IYmw8_#W(xX~HcAd|8t4JcP(fJ@8zm>F z13yW^SA*YXafKN8jU;S_68wmX6Z%$beFgaWl!*!$N%`Oiq+H)r9R+IUhA2=l#~-R$ z7~`CU4GI*8Tcdzvhg(Z>Qc;x0@L%JBX!@M}eB1kyxs=Vjo=UAb6PE zWhCw>1`^R@Af@SG5Ur0yk3gcGkw>^;lhvU9b8wG~w2cm)9{94+4HNmx`Jf%(^MaRV$;(n=SI1E+&01tI#Y>a}k zDrTvW4PGXfjlRy@h^`Kw74XmM0bm3?N2y03Pwj^)f#^QQ$Wx)FWh-Hb)KdrJT89ru zftroD5^Ss$Rl1zgp{o*z{%?k=7WWjQQw}v(M}?r;4+=q5Qd{VO?jW$3*iZ&Y+oZT@ zn2Q^Vg_yIzIg%}CfWmfAQS1xGxZrO4PqI`z%DAq9RJ@FiVdDC+6ic-f>#!1YRu&*t zLCswq`B^uqAR2y)Kp`7N=?<0=EhFDTEPsSp;s~*PYcXeyoKTev{A(jB(x3- zR51fk#f&Dj4l`-R7>FyzQd}{3gI2H^h3bE>le#vt&k8>0RUz5xT`do9C^jeq(5{uS zv68GrffQrZWcnk0V1*irSHmpOAH1#OEy!2gg7PZ=H6b(ECNxChzymeR4Z((?KO{xG z<1@1rmxYr)Zncv+Zndk}xm<_i+!%3d8zXLQRJ=tgP~Gr2hPY2*pgsjt3l2hoLNEsf zilO4R7o&ozdL&mJeuGU8dVeT1J-m@Y<5o+?{Vo888Pq95*D06XHF`wRjo}9Xlt-Ar zUpe>{f<)-^6u@e^+`&+q8W^c>2%f;n5Kqtt6DWaa;|cnU6DUtah8Wt8VWD3UfL|m4 zRtHlzhsLR-pxg(lHd_f5hbqRFgC7!LDZuY%4VQx->7vNNpyaHGe&~RK^;H0z7P0__ zD=-j#r2zf70k$4!A5h+QU&I5+V?zf)6~nLiKuxKlQBoB?DFXn0^-mG16`rVLgW;zI dk(wcxd Node; // 用于时间轮中的链表节点 + + public void Clear() + { + Handler = null; + Args = null; + Node = null; + IsActive = false; + } + } + + [UnityEngine.Scripting.Preserve] + internal sealed class GameTimerManager : ITimerManager + { + private int _curTimerId; + private TimeWheel _scaledTimeWheel; + private TimeWheel _unscaledTimeWheel; + private readonly Dictionary _activeTimers = new Dictionary(); + + private class TimeWheel + { + private readonly float _slotInterval; // 每个槽的时间间隔(秒) + private readonly int _slotCount; // 槽的数量 + private readonly LinkedList[] _slots; + private float _currentTime; + private int _currentSlotIndex; + + public TimeWheel(float slotInterval, int slotCount) + { + _slotInterval = slotInterval; + _slotCount = slotCount; + _slots = new LinkedList[slotCount]; + for (int i = 0; i < slotCount; i++) + _slots[i] = new LinkedList(); + _currentTime = 0f; + _currentSlotIndex = 0; + } + + public void AddTimer(Timer timer, float currentTime) + { + if (!timer.IsActive) return; + + float triggerTime = timer.TriggerTime; + float delta = triggerTime - currentTime; + + if (delta < 0) + { + // 立即触发 + delta = 0; + } + + int slotsToAdvance = Mathf.FloorToInt(delta / _slotInterval); + int targetSlot = (_currentSlotIndex + slotsToAdvance) % _slotCount; + + timer.Node = _slots[targetSlot].AddLast(timer); + timer.IsRunning = true; + } + + public void Advance(float currentTime, Action processTimer) + { + float timeDelta = currentTime - _currentTime; + if (timeDelta <= 0) return; + + int steps = Mathf.FloorToInt(timeDelta / _slotInterval); + for (int i = 0; i < steps; i++) + { + _currentSlotIndex = (_currentSlotIndex + 1) % _slotCount; + _currentTime += _slotInterval; + + LinkedList currentSlot = _slots[_currentSlotIndex]; + LinkedListNode currentNode = currentSlot.First; + while (currentNode != null) + { + LinkedListNode nextNode = currentNode.Next; + Timer timer = currentNode.Value; + currentSlot.Remove(currentNode); + + if (timer.IsActive && timer.IsRunning) + { + processTimer(timer); + } + + currentNode = nextNode; + } + } + } + } + + public GameTimerManager() + { + _scaledTimeWheel = new TimeWheel(1f, 60); + _unscaledTimeWheel = new TimeWheel(1f, 60); + } + + + public int AddTimer(TimerHandler callback, float time, bool isLoop = false, + bool isUnscaled = false, params object[] args) + { + Timer timer = GetTimerFromPool(); + timer.TimerId = ++_curTimerId; + timer.TriggerTime = (isUnscaled ? Time.unscaledTime : Time.time) + time; + timer.Interval = isLoop ? time : 0f; + timer.Handler = callback; + timer.IsLoop = isLoop; + timer.IsRunning = true; + timer.IsUnscaled = isUnscaled; + timer.Args = args; + timer.IsActive = true; + + _activeTimers.Add(timer.TimerId, timer); + TimeWheel targetWheel = isUnscaled ? _unscaledTimeWheel : _scaledTimeWheel; + targetWheel.AddTimer(timer, isUnscaled ? Time.unscaledTime : Time.time); + return timer.TimerId; + } + + public void Stop(int timerId) + { + if (_activeTimers.TryGetValue(timerId, out Timer timer)) + timer.IsRunning = false; + } + + public void Resume(int timerId) + { + if (_activeTimers.TryGetValue(timerId, out Timer timer)) + timer.IsRunning = true; + } + + public bool IsRunning(int timerId) => + _activeTimers.TryGetValue(timerId, out Timer timer) && timer.IsRunning; + + public float GetLeftTime(int timerId) => + _activeTimers.TryGetValue(timerId, out Timer timer) + ? Mathf.Max(timer.TriggerTime - (timer.IsUnscaled ? Time.unscaledTime : Time.time), 0) + : 0; + + public void Restart(int timerId) + { + if (_activeTimers.TryGetValue(timerId, out Timer timer)) + { + timer.TriggerTime = (timer.IsUnscaled ? Time.unscaledTime : Time.time) + timer.Interval; + TimeWheel targetWheel = timer.IsUnscaled ? _unscaledTimeWheel : _scaledTimeWheel; + targetWheel.AddTimer(timer, timer.IsUnscaled ? Time.unscaledTime : Time.time); + } + } + + public void RemoveTimer(int timerId) + { + if (_activeTimers.TryGetValue(timerId, out Timer timer)) + { + timer.IsActive = false; // 标记为无效 + _activeTimers.Remove(timerId); + ReturnTimerToPool(timer); + } + } + + public void RemoveAllTimer() + { + foreach (var timer in _activeTimers.Values) + { + timer.IsActive = false; + ReturnTimerToPool(timer); + } + + _activeTimers.Clear(); + } + + private Timer GetTimerFromPool() => ReferencePool.Acquire(); + + + private void ReturnTimerToPool(Timer timer) + { + ReferencePool.Release(timer); + } + + void IModuleUpdate.Update(float elapseSeconds, float realElapseSeconds) + { + float scaledTime = Time.time; + _scaledTimeWheel.Advance(scaledTime, ProcessTimer); + + float unscaledTime = Time.unscaledTime; + _unscaledTimeWheel.Advance(unscaledTime, ProcessTimer); + } + + private void ProcessTimer(Timer timer) + { + if (!timer.IsActive || !timer.IsRunning) return; + + try + { + timer.Handler?.Invoke(timer.Args); + } + catch (Exception e) + { + Debug.LogError($"Timer callback error: {e}"); + } + + if (timer.IsLoop) + { + timer.TriggerTime += timer.Interval; + TimeWheel targetWheel = timer.IsUnscaled ? _unscaledTimeWheel : _scaledTimeWheel; + targetWheel.AddTimer(timer, timer.IsUnscaled ? Time.unscaledTime : Time.time); + } + else + { + RemoveTimer(timer.TimerId); + } + } + + void IModule.Dispose() => RemoveAllTimer(); + + public int Priority => 0; + } +} diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/GameTimerManager.cs.meta b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/GameTimerManager.cs.meta new file mode 100644 index 0000000..c85d8fd --- /dev/null +++ b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/GameTimerManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 205d0803930745d7825f89aa604530a5 +timeCreated: 1741683842 \ No newline at end of file diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/ITimerManager.cs b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/ITimerManager.cs index 36b598f..0188f03 100644 --- a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/ITimerManager.cs +++ b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/ITimerManager.cs @@ -4,8 +4,6 @@ using AlicizaX.Runtime; namespace AlicizaX.Timer.Runtime { - public delegate void TimerHandler(object[] args); - ///

/// 定时器接口 /// @@ -52,16 +50,6 @@ namespace AlicizaX.Timer.Runtime /// public void Restart(int timerId); - /// - /// 重置计时器。 - /// - public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false); - - /// - /// 重置计时器。 - /// - public void Reset(int timerId, float time, bool isLoop, bool isUnscaled); - /// /// 移除计时器。 /// diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerComponent.cs b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerComponent.cs index 1669a76..7bd254b 100644 --- a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerComponent.cs +++ b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerComponent.cs @@ -115,32 +115,6 @@ namespace AlicizaX.Timer.Runtime _timerManager.Restart(timerId); } - /// - /// 重置计时器。 - /// - public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false) - { - if (_timerManager == null) - { - throw new GameFrameworkException("TimerMgr is invalid."); - } - - _timerManager.Reset(timerId, callback, time, isLoop, isUnscaled); - } - - /// - /// 重置计时器。 - /// - public void Reset(int timerId, float time, bool isLoop, bool isUnscaled) - { - if (_timerManager == null) - { - throw new GameFrameworkException("TimerMgr is invalid."); - } - - _timerManager.Reset(timerId, time, isLoop, isUnscaled); - } - /// /// 移除计时器。 /// diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs deleted file mode 100644 index 738661a..0000000 --- a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs +++ /dev/null @@ -1,468 +0,0 @@ -using System; -using System.Collections.Generic; -using AlicizaX.Runtime; -using UnityEngine; - -namespace AlicizaX.Timer.Runtime -{ - [Serializable] - public class Timer - { - public int timerId = 0; - public float curTime = 0; - public float time = 0; - public TimerHandler Handler; - public bool isLoop = false; - public bool isNeedRemove = false; - public bool isRunning = false; - public bool isUnscaled = false; //是否使用非缩放的时间 - public object[] Args = null; //回调参数 - } - - [UnityEngine.Scripting.Preserve] - internal sealed class TimerManager : ITimerManager - { - private int _curTimerId = 0; - private readonly List _timerList = new List(); - private readonly List _unscaledTimerList = new List(); - private readonly List _cacheRemoveTimers = new List(); - private readonly List _cacheRemoveUnscaledTimers = new List(); - - /// - /// 添加计时器。 - /// - /// 计时器回调。 - /// 计时器间隔。 - /// 是否循环。 - /// 是否不收时间缩放影响。 - /// 传参。(避免闭包) - /// 计时器Id。 - public int AddTimer(TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false, params object[] args) - { - Timer timer = new Timer - { - timerId = ++_curTimerId, - curTime = time, - time = time, - Handler = callback, - isLoop = isLoop, - isUnscaled = isUnscaled, - Args = args, - isNeedRemove = false, - isRunning = true - }; - - InsertTimer(timer); - return timer.timerId; - } - - private void InsertTimer(Timer timer) - { - bool isInsert = false; - if (timer.isUnscaled) - { - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - if (_unscaledTimerList[i].curTime > timer.curTime) - { - _unscaledTimerList.Insert(i, timer); - isInsert = true; - break; - } - } - - if (!isInsert) - { - _unscaledTimerList.Add(timer); - } - } - else - { - for (int i = 0, len = _timerList.Count; i < len; i++) - { - if (_timerList[i].curTime > timer.curTime) - { - _timerList.Insert(i, timer); - isInsert = true; - break; - } - } - - if (!isInsert) - { - _timerList.Add(timer); - } - } - } - - /// - /// 暂停计时器。 - /// - /// 计时器Id。 - public void Stop(int timerId) - { - Timer timer = GetTimer(timerId); - if (timer != null) timer.isRunning = false; - } - - /// - /// 恢复计时器。 - /// - /// 计时器Id。 - public void Resume(int timerId) - { - Timer timer = GetTimer(timerId); - if (timer != null) timer.isRunning = true; - } - - /// - /// 计时器是否在运行中。 - /// - /// 计时器Id。 - /// 否在运行中。 - public bool IsRunning(int timerId) - { - Timer timer = GetTimer(timerId); - return timer is { isRunning: true }; - } - - /// - /// 获得计时器剩余时间 - /// - public float GetLeftTime(int timerId) - { - Timer timer = GetTimer(timerId); - if (timer == null) return 0; - return timer.curTime; - } - - /// - /// 重置计时器,恢复到开始状态。 - /// - public void Restart(int timerId) - { - Timer timer = GetTimer(timerId); - if (timer != null) - { - timer.curTime = timer.time; - timer.isRunning = true; - } - } - - - /// - /// 重置计时器。 - /// - public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false) - { - Timer timer = GetTimer(timerId); - if (timer != null) - { - timer.curTime = time; - timer.time = time; - timer.Handler = callback; - timer.isLoop = isLoop; - timer.isNeedRemove = false; - if (timer.isUnscaled != isUnscaled) - { - RemoveTimerImmediate(timerId); - - timer.isUnscaled = isUnscaled; - InsertTimer(timer); - } - } - } - - /// - /// 重置计时器。 - /// - public void Reset(int timerId, float time, bool isLoop, bool isUnscaled) - { - Timer timer = GetTimer(timerId); - if (timer != null) - { - timer.curTime = time; - timer.time = time; - timer.isLoop = isLoop; - timer.isNeedRemove = false; - if (timer.isUnscaled != isUnscaled) - { - RemoveTimerImmediate(timerId); - - timer.isUnscaled = isUnscaled; - InsertTimer(timer); - } - } - } - - /// - /// 立即移除。 - /// - /// - private void RemoveTimerImmediate(int timerId) - { - for (int i = 0, len = _timerList.Count; i < len; i++) - { - if (_timerList[i].timerId == timerId) - { - _timerList.RemoveAt(i); - return; - } - } - - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - if (_unscaledTimerList[i].timerId == timerId) - { - _unscaledTimerList.RemoveAt(i); - return; - } - } - } - - /// - /// 移除计时器。 - /// - /// 计时器Id。 - public void RemoveTimer(int timerId) - { - for (int i = 0, len = _timerList.Count; i < len; i++) - { - if (_timerList[i].timerId == timerId) - { - _timerList[i].isNeedRemove = true; - return; - } - } - - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - if (_unscaledTimerList[i].timerId == timerId) - { - _unscaledTimerList[i].isNeedRemove = true; - return; - } - } - } - - /// - /// 移除所有计时器。 - /// - public void RemoveAllTimer() - { - _timerList.Clear(); - _unscaledTimerList.Clear(); - } - - private Timer GetTimer(int timerId) - { - for (int i = 0, len = _timerList.Count; i < len; i++) - { - if (_timerList[i].timerId == timerId) - { - return _timerList[i]; - } - } - - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - if (_unscaledTimerList[i].timerId == timerId) - { - return _unscaledTimerList[i]; - } - } - - return null; - } - - private void LoopCallInBadFrame() - { - bool isLoopCall = false; - for (int i = 0, len = _timerList.Count; i < len; i++) - { - Timer timer = _timerList[i]; - if (timer.isLoop && timer.curTime <= 0) - { - if (timer.Handler != null) - { - timer.Handler(timer.Args); - } - - timer.curTime += timer.time; - if (timer.curTime <= 0) - { - isLoopCall = true; - } - } - } - - if (isLoopCall) - { - LoopCallInBadFrame(); - } - } - - private void LoopCallUnscaledInBadFrame() - { - bool isLoopCall = false; - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - Timer timer = _unscaledTimerList[i]; - if (timer.isLoop && timer.curTime <= 0) - { - if (timer.Handler != null) - { - timer.Handler(timer.Args); - } - - timer.curTime += timer.time; - if (timer.curTime <= 0) - { - isLoopCall = true; - } - } - } - - if (isLoopCall) - { - LoopCallUnscaledInBadFrame(); - } - } - - private void UpdateTimer(float elapseSeconds) - { - bool isLoopCall = false; - for (int i = 0, len = _timerList.Count; i < len; i++) - { - Timer timer = _timerList[i]; - if (timer.isNeedRemove) - { - _cacheRemoveTimers.Add(i); - continue; - } - - if (!timer.isRunning) continue; - timer.curTime -= elapseSeconds; - if (timer.curTime <= 0) - { - if (timer.Handler != null) - { - timer.Handler(timer.Args); - } - - if (timer.isLoop) - { - timer.curTime += timer.time; - if (timer.curTime <= 0) - { - isLoopCall = true; - } - } - else - { - _cacheRemoveTimers.Add(i); - } - } - } - - for (int i = _cacheRemoveTimers.Count - 1; i >= 0; i--) - { - _timerList.RemoveAt(_cacheRemoveTimers[i]); - _cacheRemoveTimers.RemoveAt(i); - } - - if (isLoopCall) - { - LoopCallInBadFrame(); - } - } - - private void UpdateUnscaledTimer(float realElapseSeconds) - { - bool isLoopCall = false; - for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) - { - Timer timer = _unscaledTimerList[i]; - if (timer.isNeedRemove) - { - _cacheRemoveUnscaledTimers.Add(i); - continue; - } - - if (!timer.isRunning) continue; - timer.curTime -= realElapseSeconds; - if (timer.curTime <= 0) - { - if (timer.Handler != null) - { - timer.Handler(timer.Args); - } - - if (timer.isLoop) - { - timer.curTime += timer.time; - if (timer.curTime <= 0) - { - isLoopCall = true; - } - } - else - { - _cacheRemoveUnscaledTimers.Add(i); - } - } - } - - for (int i = _cacheRemoveUnscaledTimers.Count - 1; i >= 0; i--) - { - _unscaledTimerList.RemoveAt(_cacheRemoveUnscaledTimers[i]); - _cacheRemoveUnscaledTimers.RemoveAt(i); - } - - if (isLoopCall) - { - LoopCallUnscaledInBadFrame(); - } - } - - private readonly List _ticker = new List(); - - public System.Timers.Timer AddSystemTimer(Action callBack) - { - int interval = 1000; - var timerTick = new System.Timers.Timer(interval); - timerTick.AutoReset = true; - timerTick.Enabled = true; - timerTick.Elapsed += new System.Timers.ElapsedEventHandler(callBack); - - _ticker.Add(timerTick); - - return timerTick; - } - - private void DestroySystemTimer() - { - foreach (var ticker in _ticker) - { - if (ticker != null) - { - ticker.Stop(); - } - } - } - - void IModuleUpdate.Update(float elapseSeconds, float realElapseSeconds) - { - UpdateTimer(elapseSeconds); - UpdateUnscaledTimer(realElapseSeconds); - } - - void IModule.Dispose() - { - RemoveAllTimer(); - DestroySystemTimer(); - } - - public int Priority { get; } - } -} diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs new file mode 100644 index 0000000..f0636c9 --- /dev/null +++ b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs @@ -0,0 +1,468 @@ +// using System; +// using System.Collections.Generic; +// using AlicizaX.Runtime; +// using UnityEngine; +// +// namespace AlicizaX.Timer.Runtime +// { +// [Serializable] +// public class Timer +// { +// public int timerId = 0; +// public float curTime = 0; +// public float time = 0; +// public TimerHandler Handler; +// public bool isLoop = false; +// public bool isNeedRemove = false; +// public bool isRunning = false; +// public bool isUnscaled = false; //是否使用非缩放的时间 +// public object[] Args = null; //回调参数 +// } +// +// [UnityEngine.Scripting.Preserve] +// internal sealed class TimerManager : ITimerManager +// { +// private int _curTimerId = 0; +// private readonly List _timerList = new List(); +// private readonly List _unscaledTimerList = new List(); +// private readonly List _cacheRemoveTimers = new List(); +// private readonly List _cacheRemoveUnscaledTimers = new List(); +// +// /// +// /// 添加计时器。 +// /// +// /// 计时器回调。 +// /// 计时器间隔。 +// /// 是否循环。 +// /// 是否不收时间缩放影响。 +// /// 传参。(避免闭包) +// /// 计时器Id。 +// public int AddTimer(TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false, params object[] args) +// { +// Timer timer = new Timer +// { +// timerId = ++_curTimerId, +// curTime = time, +// time = time, +// Handler = callback, +// isLoop = isLoop, +// isUnscaled = isUnscaled, +// Args = args, +// isNeedRemove = false, +// isRunning = true +// }; +// +// InsertTimer(timer); +// return timer.timerId; +// } +// +// private void InsertTimer(Timer timer) +// { +// bool isInsert = false; +// if (timer.isUnscaled) +// { +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// if (_unscaledTimerList[i].curTime > timer.curTime) +// { +// _unscaledTimerList.Insert(i, timer); +// isInsert = true; +// break; +// } +// } +// +// if (!isInsert) +// { +// _unscaledTimerList.Add(timer); +// } +// } +// else +// { +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// if (_timerList[i].curTime > timer.curTime) +// { +// _timerList.Insert(i, timer); +// isInsert = true; +// break; +// } +// } +// +// if (!isInsert) +// { +// _timerList.Add(timer); +// } +// } +// } +// +// /// +// /// 暂停计时器。 +// /// +// /// 计时器Id。 +// public void Stop(int timerId) +// { +// Timer timer = GetTimer(timerId); +// if (timer != null) timer.isRunning = false; +// } +// +// /// +// /// 恢复计时器。 +// /// +// /// 计时器Id。 +// public void Resume(int timerId) +// { +// Timer timer = GetTimer(timerId); +// if (timer != null) timer.isRunning = true; +// } +// +// /// +// /// 计时器是否在运行中。 +// /// +// /// 计时器Id。 +// /// 否在运行中。 +// public bool IsRunning(int timerId) +// { +// Timer timer = GetTimer(timerId); +// return timer is { isRunning: true }; +// } +// +// /// +// /// 获得计时器剩余时间 +// /// +// public float GetLeftTime(int timerId) +// { +// Timer timer = GetTimer(timerId); +// if (timer == null) return 0; +// return timer.curTime; +// } +// +// /// +// /// 重置计时器,恢复到开始状态。 +// /// +// public void Restart(int timerId) +// { +// Timer timer = GetTimer(timerId); +// if (timer != null) +// { +// timer.curTime = timer.time; +// timer.isRunning = true; +// } +// } +// +// +// /// +// /// 重置计时器。 +// /// +// public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false) +// { +// Timer timer = GetTimer(timerId); +// if (timer != null) +// { +// timer.curTime = time; +// timer.time = time; +// timer.Handler = callback; +// timer.isLoop = isLoop; +// timer.isNeedRemove = false; +// if (timer.isUnscaled != isUnscaled) +// { +// RemoveTimerImmediate(timerId); +// +// timer.isUnscaled = isUnscaled; +// InsertTimer(timer); +// } +// } +// } +// +// /// +// /// 重置计时器。 +// /// +// public void Reset(int timerId, float time, bool isLoop, bool isUnscaled) +// { +// Timer timer = GetTimer(timerId); +// if (timer != null) +// { +// timer.curTime = time; +// timer.time = time; +// timer.isLoop = isLoop; +// timer.isNeedRemove = false; +// if (timer.isUnscaled != isUnscaled) +// { +// RemoveTimerImmediate(timerId); +// +// timer.isUnscaled = isUnscaled; +// InsertTimer(timer); +// } +// } +// } +// +// /// +// /// 立即移除。 +// /// +// /// +// private void RemoveTimerImmediate(int timerId) +// { +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// if (_timerList[i].timerId == timerId) +// { +// _timerList.RemoveAt(i); +// return; +// } +// } +// +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// if (_unscaledTimerList[i].timerId == timerId) +// { +// _unscaledTimerList.RemoveAt(i); +// return; +// } +// } +// } +// +// /// +// /// 移除计时器。 +// /// +// /// 计时器Id。 +// public void RemoveTimer(int timerId) +// { +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// if (_timerList[i].timerId == timerId) +// { +// _timerList[i].isNeedRemove = true; +// return; +// } +// } +// +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// if (_unscaledTimerList[i].timerId == timerId) +// { +// _unscaledTimerList[i].isNeedRemove = true; +// return; +// } +// } +// } +// +// /// +// /// 移除所有计时器。 +// /// +// public void RemoveAllTimer() +// { +// _timerList.Clear(); +// _unscaledTimerList.Clear(); +// } +// +// private Timer GetTimer(int timerId) +// { +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// if (_timerList[i].timerId == timerId) +// { +// return _timerList[i]; +// } +// } +// +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// if (_unscaledTimerList[i].timerId == timerId) +// { +// return _unscaledTimerList[i]; +// } +// } +// +// return null; +// } +// +// private void LoopCallInBadFrame() +// { +// bool isLoopCall = false; +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// Timer timer = _timerList[i]; +// if (timer.isLoop && timer.curTime <= 0) +// { +// if (timer.Handler != null) +// { +// timer.Handler(timer.Args); +// } +// +// timer.curTime += timer.time; +// if (timer.curTime <= 0) +// { +// isLoopCall = true; +// } +// } +// } +// +// if (isLoopCall) +// { +// LoopCallInBadFrame(); +// } +// } +// +// private void LoopCallUnscaledInBadFrame() +// { +// bool isLoopCall = false; +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// Timer timer = _unscaledTimerList[i]; +// if (timer.isLoop && timer.curTime <= 0) +// { +// if (timer.Handler != null) +// { +// timer.Handler(timer.Args); +// } +// +// timer.curTime += timer.time; +// if (timer.curTime <= 0) +// { +// isLoopCall = true; +// } +// } +// } +// +// if (isLoopCall) +// { +// LoopCallUnscaledInBadFrame(); +// } +// } +// +// private void UpdateTimer(float elapseSeconds) +// { +// bool isLoopCall = false; +// for (int i = 0, len = _timerList.Count; i < len; i++) +// { +// Timer timer = _timerList[i]; +// if (timer.isNeedRemove) +// { +// _cacheRemoveTimers.Add(i); +// continue; +// } +// +// if (!timer.isRunning) continue; +// timer.curTime -= elapseSeconds; +// if (timer.curTime <= 0) +// { +// if (timer.Handler != null) +// { +// timer.Handler(timer.Args); +// } +// +// if (timer.isLoop) +// { +// timer.curTime += timer.time; +// if (timer.curTime <= 0) +// { +// isLoopCall = true; +// } +// } +// else +// { +// _cacheRemoveTimers.Add(i); +// } +// } +// } +// +// for (int i = _cacheRemoveTimers.Count - 1; i >= 0; i--) +// { +// _timerList.RemoveAt(_cacheRemoveTimers[i]); +// _cacheRemoveTimers.RemoveAt(i); +// } +// +// if (isLoopCall) +// { +// LoopCallInBadFrame(); +// } +// } +// +// private void UpdateUnscaledTimer(float realElapseSeconds) +// { +// bool isLoopCall = false; +// for (int i = 0, len = _unscaledTimerList.Count; i < len; i++) +// { +// Timer timer = _unscaledTimerList[i]; +// if (timer.isNeedRemove) +// { +// _cacheRemoveUnscaledTimers.Add(i); +// continue; +// } +// +// if (!timer.isRunning) continue; +// timer.curTime -= realElapseSeconds; +// if (timer.curTime <= 0) +// { +// if (timer.Handler != null) +// { +// timer.Handler(timer.Args); +// } +// +// if (timer.isLoop) +// { +// timer.curTime += timer.time; +// if (timer.curTime <= 0) +// { +// isLoopCall = true; +// } +// } +// else +// { +// _cacheRemoveUnscaledTimers.Add(i); +// } +// } +// } +// +// for (int i = _cacheRemoveUnscaledTimers.Count - 1; i >= 0; i--) +// { +// _unscaledTimerList.RemoveAt(_cacheRemoveUnscaledTimers[i]); +// _cacheRemoveUnscaledTimers.RemoveAt(i); +// } +// +// if (isLoopCall) +// { +// LoopCallUnscaledInBadFrame(); +// } +// } +// +// private readonly List _ticker = new List(); +// +// public System.Timers.Timer AddSystemTimer(Action callBack) +// { +// int interval = 1000; +// var timerTick = new System.Timers.Timer(interval); +// timerTick.AutoReset = true; +// timerTick.Enabled = true; +// timerTick.Elapsed += new System.Timers.ElapsedEventHandler(callBack); +// +// _ticker.Add(timerTick); +// +// return timerTick; +// } +// +// private void DestroySystemTimer() +// { +// foreach (var ticker in _ticker) +// { +// if (ticker != null) +// { +// ticker.Stop(); +// } +// } +// } +// +// void IModuleUpdate.Update(float elapseSeconds, float realElapseSeconds) +// { +// UpdateTimer(elapseSeconds); +// UpdateUnscaledTimer(realElapseSeconds); +// } +// +// void IModule.Dispose() +// { +// RemoveAllTimer(); +// DestroySystemTimer(); +// } +// +// public int Priority { get; } +// } +// } diff --git a/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs.meta b/Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs.meta similarity index 100% rename from Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManager.cs.meta rename to Client/Packages/com.alicizax.unity.timer/Runtime/Timer/TimerManagerOld.cs.meta diff --git a/Client/Packages/com.alicizax.unity.timer/package.json b/Client/Packages/com.alicizax.unity.timer/package.json index 248991a..c10fbf9 100644 --- a/Client/Packages/com.alicizax.unity.timer/package.json +++ b/Client/Packages/com.alicizax.unity.timer/package.json @@ -6,7 +6,7 @@ "version": "1.0.1", "unity": "2017.1", "keywords": [ - "Game Framework X" + "Aliciza X" ], "repository": { "name": "com.alicizax.unity", diff --git a/Client/Packages/com.alicizax.unity.ui/Editor/GenerateTool/UIGenerateEditorTool.cs b/Client/Packages/com.alicizax.unity.ui/Editor/GenerateTool/UIGenerateEditorTool.cs index 5e830d5..6184eb1 100644 --- a/Client/Packages/com.alicizax.unity.ui/Editor/GenerateTool/UIGenerateEditorTool.cs +++ b/Client/Packages/com.alicizax.unity.ui/Editor/GenerateTool/UIGenerateEditorTool.cs @@ -6,7 +6,7 @@ namespace AlicizaX.UI.Editor { public static class UIGenerateEditorTool { - [MenuItem("GameObject/AlicizaX/生成UI代码", priority = -1)] + [MenuItem("GameObject/UI工具/生成UI代码", priority = -1)] public static void GenerateUIScript() { UIGenerateWindow.ShowWindow(Selection.gameObjects.FirstOrDefault()); diff --git a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Constant/UIMetadataFactory.cs b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Constant/UIMetadataFactory.cs index 27a2f0f..75a5191 100644 --- a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Constant/UIMetadataFactory.cs +++ b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Constant/UIMetadataFactory.cs @@ -17,13 +17,13 @@ namespace AlicizaX.UI.Runtime } } - static class UIMetadataFactory + internal static class UIMetadataFactory { private static readonly Dictionary UIWindowMetadata = new(); private static readonly Dictionary UIWidgetMetadata = new(); - public static UIMetadata GetWindowInfo(RuntimeTypeHandle handle) + internal static UIMetadata GetWindowInfo(RuntimeTypeHandle handle) { if (!UIWindowMetadata.TryGetValue(handle, out var meta)) { @@ -34,7 +34,7 @@ namespace AlicizaX.UI.Runtime return meta; } - public static UIMetadata GetWidgetInfo(RuntimeTypeHandle handle) + internal static UIMetadata GetWidgetInfo(RuntimeTypeHandle handle) { if (!UIWidgetMetadata.TryGetValue(handle, out var meta)) { diff --git a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/IUIManager.cs b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/IUIManager.cs index 52566f0..1e36dcd 100644 --- a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/IUIManager.cs +++ b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/IUIManager.cs @@ -12,11 +12,11 @@ namespace AlicizaX.UI.Runtime void Initlize(Transform root); Camera UICamera { get; set; } Transform UICanvasRoot { get; set; } - UIBase ShowUI(Type type, params System.Object[] userDatas); + UIBase ShowUI(UIMetadata meta, params System.Object[] userDatas); - UniTask ShowUIAsync(Type type, params System.Object[] userDatas); - void CloseUI(Type type, bool force = false); - UIBase GetUI(Type type); + UniTask ShowUIAsync(UIMetadata meta, params System.Object[] userDatas); + void CloseUI(UIMetadata meta, bool force = false); + UIBase GetUI(UIMetadata meta); protected internal void SetTimerManager(ITimerManager timerManager); } diff --git a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.Open.cs b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.Open.cs index c4bfb68..d4dbf8b 100644 --- a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.Open.cs +++ b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.Open.cs @@ -21,24 +21,23 @@ namespace AlicizaX.UI.Runtime { private readonly LayerData[] _openUI = new LayerData[(int)UILayer.All]; - private async UniTask ShowUIImplAsync(RuntimeTypeHandle typeHandle, params object[] userDatas) + private async UniTask ShowUIImplAsync(UIMetadata meta, params object[] userDatas) { - var metaInfo = GetOrCreateMeta(typeHandle); - await UILoaderFactory.LoadUIResourcesAsync(metaInfo,UICacheLayer); + var metaInfo = GetOrCreateMeta(meta); + await UILoaderFactory.LoadUIResourcesAsync(metaInfo, UICacheLayer); return FinalizeShow(metaInfo, userDatas); } - public UIBase ShowUIImplSync(RuntimeTypeHandle typeHandle, params object[] userDatas) + public UIBase ShowUIImplSync(UIMetadata meta, params object[] userDatas) { - var metaInfo = GetOrCreateMeta(typeHandle); - UILoaderFactory.LoadUIResourcesSync(metaInfo,UICacheLayer); + var metaInfo = GetOrCreateMeta(meta); + UILoaderFactory.LoadUIResourcesSync(metaInfo, UICacheLayer); return FinalizeShow(metaInfo, userDatas); } - private void CloseUIImpl(RuntimeTypeHandle typeHandle, bool force) + private void CloseUIImpl(UIMetadata meta, bool force) { - UIMetadata meta = UIMetadataFactory.GetWindowInfo(typeHandle); if (meta.State == UIState.Uninitialized) { return; @@ -52,16 +51,14 @@ namespace AlicizaX.UI.Runtime } - private UIBase GetUIImpl(RuntimeTypeHandle typeHandle) + private UIBase GetUIImpl(UIMetadata meta) { - var metaData = UIMetadataFactory.GetWindowInfo(typeHandle); - return metaData.View; + return meta.View; } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private UIMetadata GetOrCreateMeta(RuntimeTypeHandle typeHandle) + private UIMetadata GetOrCreateMeta(UIMetadata meta) { - UIMetadata meta = UIMetadataFactory.GetWindowInfo(typeHandle); if (meta.State == UIState.Uninitialized) meta.CreateUI(); return meta; } diff --git a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.cs b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.cs index 43c8e5b..b74878e 100644 --- a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.cs +++ b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/Manager/UIManager.cs @@ -37,25 +37,25 @@ namespace AlicizaX.UI.Runtime } } - public UIBase ShowUI(Type type, params System.Object[] userDatas) + public UIBase ShowUI(UIMetadata meta, params System.Object[] userDatas) { - return ShowUIImplSync(type.TypeHandle, userDatas); + return ShowUIImplSync(meta, userDatas); } - public async UniTask ShowUIAsync(Type type, params System.Object[] userDatas) + public async UniTask ShowUIAsync(UIMetadata meta, params System.Object[] userDatas) { - return await ShowUIImplAsync(type.TypeHandle, userDatas); + return await ShowUIImplAsync(meta, userDatas); } - public void CloseUI(Type type, bool force = false) + public void CloseUI(UIMetadata meta, bool force = false) { - CloseUIImpl(type.TypeHandle, force); + CloseUIImpl(meta, force); } - public UIBase GetUI(Type type) + public UIBase GetUI(UIMetadata meta) { - return (UIWindow)GetUIImpl(type.TypeHandle); + return (UIWindow)GetUIImpl(meta); } diff --git a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/UIComponent.cs b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/UIComponent.cs index 0f1f2c7..8b795a0 100644 --- a/Client/Packages/com.alicizax.unity.ui/Runtime/UI/UIComponent.cs +++ b/Client/Packages/com.alicizax.unity.ui/Runtime/UI/UIComponent.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Runtime.CompilerServices; using AlicizaX.Resource.Runtime; using AlicizaX.Runtime; using AlicizaX.Timer.Runtime; @@ -115,57 +118,91 @@ namespace AlicizaX.UI.Runtime public T ShowUI(params System.Object[] userDatas) where T : UIWindow { - return (T)ShowUI(typeof(T), userDatas); + return (T)ShowUI(MetaTypeCache.Metadata, userDatas); } public async UniTask ShowUIAsync(params System.Object[] userDatas) where T : UIWindow { - return (T)await ShowUIAsync(typeof(T), userDatas); - } - - public UIBase ShowUI(string windowName, params System.Object[] userDatas) - { - Type uiType = UITypeCollector.GetUIInst(windowName); - GameFrameworkGuard.NotNull(uiType, nameof(uiType)); - return ShowUI(uiType, userDatas); - } - - public async UniTask ShowUIAsync(string windowName, params System.Object[] userDatas) - { - Type uiType = UITypeCollector.GetUIInst(windowName); - GameFrameworkGuard.NotNull(uiType, nameof(uiType)); - return await ShowUIAsync(uiType, userDatas); + return (T)await ShowUIAsync(MetaTypeCache.Metadata, userDatas); } public void CloseUI(bool force = false) where T : UIWindow { - CloseUI(typeof(T), force); + CloseUI(MetaTypeCache.Metadata, force); } public T GetUI() where T : UIWindow { - return (T)GetUI(typeof(T)); + return (T)GetUI(MetaTypeCache.Metadata); } - public UIBase ShowUI(Type type, params System.Object[] userDatas) + // public UIBase ShowUI(string windowName, params System.Object[] userDatas) + // { + // Type uiType = UITypeCollector.GetUIInst(windowName); + // GameFrameworkGuard.NotNull(uiType, nameof(uiType)); + // return ShowUI(uiType, userDatas); + // } + // + // public async UniTask ShowUIAsync(string windowName, params System.Object[] userDatas) + // { + // Type uiType = UITypeCollector.GetUIInst(windowName); + // GameFrameworkGuard.NotNull(uiType, nameof(uiType)); + // return await ShowUIAsync(uiType, userDatas); + // } + + + public UIBase ShowUI(UIMetadata meta, params System.Object[] userDatas) { - return _uiManager.ShowUI(type, userDatas); + return _uiManager.ShowUI(meta, userDatas); } - public async UniTask ShowUIAsync(Type type, params System.Object[] userDatas) + public async UniTask ShowUIAsync(UIMetadata meta, params System.Object[] userDatas) { - return await _uiManager.ShowUIAsync(type, userDatas); + return await _uiManager.ShowUIAsync(meta, userDatas); } - private void CloseUI(Type type, bool force = false) + private void CloseUI(UIMetadata meta, bool force = false) { - _uiManager.CloseUI(type, force); + _uiManager.CloseUI(meta, force); } - private UIBase GetUI(Type type) + private UIBase GetUI(UIMetadata meta) { - return _uiManager.GetUI(type); + return _uiManager.GetUI(meta); + } + + private static Dictionary _triggerCache = new Dictionary(); + + private static void TriggerStaticCtor(Type type) + { + // 已有缓存直接触发 + if (_triggerCache.TryGetValue(type, out var trigger)) + { + trigger(); + return; + } + + // 无缓存时动态编译并缓存 ------------------------------------------------- + // 1. 构造泛型类型 MetaTypeCache + var genericType = typeof(MetaTypeCache<>).MakeGenericType(type); + + // 2. 构建表达式树:RuntimeHelpers.RunClassConstructor(typeof(MetaTypeCache).TypeHandle) + var method = typeof(RuntimeHelpers).GetMethod( + nameof(RuntimeHelpers.RunClassConstructor), + new[] { typeof(RuntimeTypeHandle) } + ); + + var typeHandleExpr = Expression.Constant(genericType.TypeHandle); + var callExpr = Expression.Call(method, typeHandleExpr); + var lambda = Expression.Lambda(callExpr); + + // 3. 编译为原生委托(性能关键!) + var compiledTrigger = lambda.Compile(); + + // 4. 缓存并触发(非线程安全) + _triggerCache[type] = compiledTrigger; + compiledTrigger(); } } } diff --git a/Client/Packages/com.alicizax.unity/Editor/HybridCLR/BuildDLLCommand.cs b/Client/Packages/com.alicizax.unity/Editor/HybridCLR/BuildDLLCommand.cs index dd3a71a..ca37415 100644 --- a/Client/Packages/com.alicizax.unity/Editor/HybridCLR/BuildDLLCommand.cs +++ b/Client/Packages/com.alicizax.unity/Editor/HybridCLR/BuildDLLCommand.cs @@ -24,19 +24,17 @@ public static class BuildDLLCommand { ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); HybridCLR.Editor.SettingsUtil.Enable = false; - SyncAssemblyContent.RefreshAssembly(); } /// /// 开启HybridCLR宏定义。 /// - [MenuItem("HybridCLR/Tools/Tools/Define Symbols/Enable HybridCLR", false, 31)] + [MenuItem("HybridCLR/Tools/Define Symbols/Enable HybridCLR", false, 31)] public static void Enable() { ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); ScriptingDefineSymbols.AddScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); HybridCLR.Editor.SettingsUtil.Enable = true; - SyncAssemblyContent.RefreshAssembly(); } #if ENABLE_HYBRIDCLR @@ -49,6 +47,11 @@ public static class BuildDLLCommand } #endif + public static void GenerateHybridCLRSome() + { + PrebuildCommand.GenerateAll(); + } + public static void BuildAndCopyDlls(BuildTarget target) { #if ENABLE_HYBRIDCLR @@ -71,7 +74,7 @@ public static class BuildDLLCommand string aotAssembliesSrcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target); string aotAssembliesDstDir = Application.dataPath + "/" + AssemblyTextAssetPath; - foreach (var dll in AssemblyLoadData.Instance.AOTMetaAssemblies) + foreach (var dll in SettingsUtil.AOTAssemblyNames) { string srcDllPath = $"{aotAssembliesSrcDir}/{dll}"; if (!System.IO.File.Exists(srcDllPath)) diff --git a/Client/Packages/com.alicizax.unity/Editor/HybridCLR/SynAssemblysContent.cs b/Client/Packages/com.alicizax.unity/Editor/HybridCLR/SynAssemblysContent.cs index be72960..3f96322 100644 --- a/Client/Packages/com.alicizax.unity/Editor/HybridCLR/SynAssemblysContent.cs +++ b/Client/Packages/com.alicizax.unity/Editor/HybridCLR/SynAssemblysContent.cs @@ -6,15 +6,14 @@ namespace AlicizaX.Editor { public static class SyncAssemblyContent { - [MenuItem("HybridCLR/Sync Assembly")] - public static void RefreshAssembly() + public static void GenerateAssemblyLoadData() { AssemblyLoadData assemblyLoadData = new AssemblyLoadData(); assemblyLoadData.HotUpdateAssemblies = HybridCLR.Editor.SettingsUtil.HotUpdateAssemblyFilesIncludePreserved; assemblyLoadData.AOTMetaAssemblies = HybridCLR.Editor.SettingsUtil.AOTAssemblyNames; - File.WriteAllText("Assets/Resources/AssemblyLoadData.json", Utility.Json.ToJson(assemblyLoadData)); - AssetDatabase.Refresh(); + File.WriteAllText("Assets/Resources/AssemblyLoadData.bytes", Utility.Json.ToJson(assemblyLoadData)); AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); } } } diff --git a/Client/Packages/commit.bat b/Client/Packages/commit.bat index 6e39950..bedf732 100644 --- a/Client/Packages/commit.bat +++ b/Client/Packages/commit.bat @@ -10,14 +10,14 @@ for /d %%i in (*) do ( pushd "%%i" if exist ".git" ( echo. - echo [正在处理仓库] %%i + echo [Process Git Library] %%i :: 拉取更新(如果启用) if !DO_PULL! equ 1 ( - echo 拉取最新更改... + echo Pull New Changed... git pull if errorlevel 1 ( - echo [错误] 拉取失败于 %%i + echo [Error] pull failed %%i popd goto :next_folder ) @@ -27,17 +27,17 @@ for /d %%i in (*) do ( git add . git commit -m "modify" if errorlevel 1 ( - echo [信息] 无新更改或提交失败于 %%i + echo [inffo] NoChange or commit failed for %%i ) else ( - echo 推送更改到远程... + echo Commit Change to Remote ... git push if errorlevel 1 ( - echo [错误] 推送失败于 %%i + echo [Error] Push Failed %%i ) ) ) else ( echo. - echo [跳过] %%i 不是Git仓库 + echo [Skip] %%i Not Git Library ) :next_folder popd @@ -45,5 +45,5 @@ for /d %%i in (*) do ( :: 主动等待用户关闭 echo. -echo 所有操作已完成,按任意键关闭窗口... +echo Commit Finished,Please Input Any key to Close... pause >nul \ No newline at end of file diff --git a/Client/Packages/manifest.json b/Client/Packages/manifest.json index 4a77a70..bdaa6c8 100644 --- a/Client/Packages/manifest.json +++ b/Client/Packages/manifest.json @@ -3,18 +3,18 @@ "com.code-philosophy.hybridclr": "https://gitee.com/focus-creative-games/hybridclr_unity.git", "com.fantasy.unity": "http://101.34.252.46:3000/AlicizaX/Fantasy.Unity.git", "com.paps.unity-toolbar-extender-ui-toolkit": "http://101.34.252.46:3000/AlicizaX/com.paps.unity-toolbar-extender-ui-toolkit.git", - "com.unity.ai.navigation": "2.0.4", + "com.unity.ai.navigation": "2.0.6", "com.unity.editorcoroutines": "1.0.0", - "com.unity.ide.rider": "3.0.31", + "com.unity.ide.rider": "3.0.34", "com.unity.ide.visualstudio": "2.0.22", - "com.unity.inputsystem": "1.11.1", + "com.unity.inputsystem": "1.13.1", "com.unity.nuget.newtonsoft-json": "3.2.1", "com.unity.render-pipelines.universal": "17.0.3", "com.unity.scriptablebuildpipeline": "2.1.4", - "com.unity.test-framework": "1.4.5", - "com.unity.timeline": "1.8.7", + "com.unity.test-framework": "1.4.6", + "com.unity.timeline": "1.8.8", "com.unity.ugui": "2.0.0", - "com.unity.visualscripting": "1.9.4", + "com.unity.visualscripting": "1.9.6", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Client/Packages/packages-lock.json b/Client/Packages/packages-lock.json index 6853da9..df62112 100644 --- a/Client/Packages/packages-lock.json +++ b/Client/Packages/packages-lock.json @@ -48,6 +48,12 @@ "source": "embedded", "dependencies": {} }, + "com.alicizax.unity.editor.extension": { + "version": "file:com.alicizax.unity.editor.extension", + "depth": 0, + "source": "embedded", + "dependencies": {} + }, "com.alicizax.unity.entry": { "version": "file:com.alicizax.unity.entry", "depth": 0, @@ -177,7 +183,7 @@ "hash": "da793070ba60e051230abdd5d174c774fb3d3b49" }, "com.unity.ai.navigation": { - "version": "2.0.4", + "version": "2.0.6", "depth": 0, "source": "registry", "dependencies": { @@ -222,7 +228,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.31", + "version": "3.0.34", "depth": 0, "source": "registry", "dependencies": { @@ -240,7 +246,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.11.1", + "version": "1.13.1", "depth": 0, "source": "registry", "dependencies": { @@ -346,7 +352,7 @@ } }, "com.unity.test-framework": { - "version": "1.4.5", + "version": "1.4.6", "depth": 0, "source": "registry", "dependencies": { @@ -367,7 +373,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.8.7", + "version": "1.8.8", "depth": 0, "source": "registry", "dependencies": { @@ -388,7 +394,7 @@ } }, "com.unity.visualscripting": { - "version": "1.9.4", + "version": "1.9.6", "depth": 0, "source": "registry", "dependencies": { diff --git a/Client/ProjectSettings/HybridCLRSettings.asset b/Client/ProjectSettings/HybridCLRSettings.asset index eea59cc..bad7217 100644 --- a/Client/ProjectSettings/HybridCLRSettings.asset +++ b/Client/ProjectSettings/HybridCLRSettings.asset @@ -34,8 +34,8 @@ MonoBehaviour: - YooAsset.dll - UniTask.Runtime.dll - ZString.dll - outputLinkFile: HybridCLRData/Generated/link.xml - outputAOTGenericReferenceFile: HybridCLRData/Generated/AOTGenericReferences.cs + outputLinkFile: HybridCLRGenerate/link.xml + outputAOTGenericReferenceFile: HybridCLRGenerate/AOTGenericReferences.cs maxGenericReferenceIteration: 10 maxMethodBridgeGenericIteration: 10 enableProfilerInReleaseBuild: 0 diff --git a/Client/ProjectSettings/ProjectSettings.asset b/Client/ProjectSettings/ProjectSettings.asset index bc788a5..2bdc44f 100644 --- a/Client/ProjectSettings/ProjectSettings.asset +++ b/Client/ProjectSettings/ProjectSettings.asset @@ -12,7 +12,7 @@ PlayerSettings: targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 - companyName: DefaultCompany + companyName: com.alicizax.unity productName: Aliciza defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} @@ -164,7 +164,7 @@ PlayerSettings: androidMinAspectRatio: 1 applicationIdentifier: Android: com.UnityTechnologies.com.unity.template.urpblank - Standalone: com.Unity-Technologies.com.unity.template.urp-blank + Standalone: com.alicizax.unity.template iPhone: com.Unity-Technologies.com.unity.template.urp-blank buildNumber: Standalone: 0 @@ -527,6 +527,15 @@ PlayerSettings: - m_BuildTarget: AndroidPlayer m_APIs: 150000000b000000 m_Automatic: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_APIs: 0200000012000000 + m_Automatic: 1 + - m_BuildTarget: MacStandaloneSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_APIs: 1100000015000000 + m_Automatic: 1 m_BuildTargetVRSettings: [] m_DefaultShaderChunkSizeInMB: 16 m_DefaultShaderChunkCount: 0 diff --git a/Client/ProjectSettings/QualitySettings.asset b/Client/ProjectSettings/QualitySettings.asset index f5269d7..0bf51f8 100644 --- a/Client/ProjectSettings/QualitySettings.asset +++ b/Client/ProjectSettings/QualitySettings.asset @@ -4,7 +4,7 @@ QualitySettings: m_ObjectHideFlags: 0 serializedVersion: 5 - m_CurrentQuality: 0 + m_CurrentQuality: 1 m_QualitySettings: - serializedVersion: 4 name: Mobile diff --git a/Client/UserSettings/Layouts/default-6000.dwlt b/Client/UserSettings/Layouts/default-6000.dwlt index 5667469..1a312d3 100644 --- a/Client/UserSettings/Layouts/default-6000.dwlt +++ b/Client/UserSettings/Layouts/default-6000.dwlt @@ -1,6 +1,30 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PixelRect: + serializedVersion: 2 + x: 2782 + y: 169 + width: 1050 + height: 527 + m_ShowMode: 0 + m_Title: Package Manager + m_RootView: {fileID: 4} + m_MinSize: {x: 748, y: 276} + m_MaxSize: {x: 4000, y: 4026} + m_Maximized: 0 +--- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -19,12 +43,63 @@ MonoBehaviour: width: 1920 height: 997 m_ShowMode: 4 - m_Title: Project - m_RootView: {fileID: 2} + m_Title: Console + m_RootView: {fileID: 5} m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} m_Maximized: 1 ---- !u!114 &2 +--- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PackageManagerWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1050 + height: 527 + m_MinSize: {x: 748, y: 276} + m_MaxSize: {x: 4000, y: 4026} + m_ActualView: {fileID: 15} + m_Panes: + - {fileID: 15} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &4 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 3} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1050 + height: 527 + m_MinSize: {x: 748, y: 276} + m_MaxSize: {x: 4000, y: 4026} + vertical: 0 + controlID: 282 + draggingID: 0 +--- !u!114 &5 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -37,9 +112,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 3} - - {fileID: 5} - - {fileID: 4} + - {fileID: 6} + - {fileID: 8} + - {fileID: 7} m_Position: serializedVersion: 2 x: 0 @@ -52,7 +127,7 @@ MonoBehaviour: m_TopViewHeight: 36 m_UseBottomView: 1 m_BottomViewHeight: 20 ---- !u!114 &3 +--- !u!114 &6 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -74,7 +149,7 @@ MonoBehaviour: m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} m_LastLoadedLayoutName: ---- !u!114 &4 +--- !u!114 &7 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -95,7 +170,7 @@ MonoBehaviour: height: 20 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} ---- !u!114 &5 +--- !u!114 &8 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -108,10 +183,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 6} - - {fileID: 7} + - {fileID: 9} - {fileID: 10} - - {fileID: 11} + - {fileID: 13} + - {fileID: 14} m_Position: serializedVersion: 2 x: 0 @@ -121,9 +196,9 @@ MonoBehaviour: m_MinSize: {x: 400, y: 100} m_MaxSize: {x: 32384, y: 16192} vertical: 0 - controlID: 148 + controlID: 47 draggingID: 0 ---- !u!114 &6 +--- !u!114 &9 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -133,25 +208,25 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: GameView + m_Name: SceneView m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 x: 0 y: 0 - width: 529 + width: 281 height: 941 - m_MinSize: {x: 51, y: 76} + m_MinSize: {x: 201, y: 226} m_MaxSize: {x: 4001, y: 4026} - m_ActualView: {fileID: 12} + m_ActualView: {fileID: 18} m_Panes: - - {fileID: 13} - - {fileID: 14} - - {fileID: 12} - m_Selected: 2 - m_LastSelected: 1 ---- !u!114 &7 + - {fileID: 17} + - {fileID: 18} + - {fileID: 16} + m_Selected: 1 + m_LastSelected: 2 +--- !u!114 &10 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -164,20 +239,20 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 8} - - {fileID: 9} + - {fileID: 11} + - {fileID: 12} m_Position: serializedVersion: 2 - x: 529 + x: 281 y: 0 - width: 440 + width: 616 height: 941 m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 8096, y: 16192} vertical: 1 - controlID: 40 + controlID: 48 draggingID: 0 ---- !u!114 &8 +--- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -194,16 +269,16 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 440 - height: 456 + width: 616 + height: 265 m_MinSize: {x: 202, y: 226} m_MaxSize: {x: 4002, y: 4026} - m_ActualView: {fileID: 15} + m_ActualView: {fileID: 19} m_Panes: - - {fileID: 15} + - {fileID: 19} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &9 +--- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -219,17 +294,17 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 456 - width: 440 - height: 485 + y: 265 + width: 616 + height: 676 m_MinSize: {x: 102, y: 126} m_MaxSize: {x: 4002, y: 4026} - m_ActualView: {fileID: 16} + m_ActualView: {fileID: 20} m_Panes: - - {fileID: 16} + - {fileID: 20} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &10 +--- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -244,18 +319,18 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 969 + x: 897 y: 0 - width: 284 + width: 457 height: 941 m_MinSize: {x: 232, y: 276} m_MaxSize: {x: 10002, y: 10026} - m_ActualView: {fileID: 17} + m_ActualView: {fileID: 21} m_Panes: - - {fileID: 17} + - {fileID: 21} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &11 +--- !u!114 &14 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -270,18 +345,54 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 1253 + x: 1354 y: 0 - width: 667 + width: 566 height: 941 m_MinSize: {x: 276, y: 76} m_MaxSize: {x: 4001, y: 4026} - m_ActualView: {fileID: 18} + m_ActualView: {fileID: 22} m_Panes: - - {fileID: 18} + - {fileID: 22} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &12 +--- !u!114 &15 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13953, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 748, y: 250} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Package Manager + m_Image: {fileID: -2824328813065806953, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_TextWithWhitespace: "Package Manager\u200B" + m_Pos: + serializedVersion: 2 + x: 0 + y: 26 + width: 1050 + height: 501 + m_SerializedDataModeController: + m_DataMode: 0 + m_PreferredDataMode: 0 + m_SupportedDataModes: + isAutomatic: 1 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_ContainerData: [] + m_OverlaysVisible: 1 +--- !u!114 &16 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -302,9 +413,9 @@ MonoBehaviour: m_TextWithWhitespace: "Game\u200B" m_Pos: serializedVersion: 2 - x: 0 - y: 24 - width: 528 + x: 1920 + y: 84 + width: 280 height: 915 m_SerializedDataModeController: m_DataMode: 0 @@ -350,7 +461,7 @@ MonoBehaviour: m_HSlider: 0 m_VSlider: 0 m_IgnoreScrollWheelUntilClicked: 0 - m_EnableMouseInput: 1 + m_EnableMouseInput: 0 m_EnableSliderZoomHorizontal: 0 m_EnableSliderZoomVertical: 0 m_UniformScale: 1 @@ -359,29 +470,29 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 528 + width: 280 height: 894 - m_Scale: {x: 0.275, y: 0.275} - m_Translation: {x: 264, y: 447} + m_Scale: {x: 0.14583333, y: 0.14583333} + m_Translation: {x: 140, y: 447.00003} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -960 - y: -1625.4545 - width: 1920 - height: 3250.909 + x: -960.00006 + y: -3065.143 + width: 1920.0001 + height: 6130.286 m_MinimalGUI: 1 - m_defaultScale: 0.275 - m_LastWindowPixelSize: {x: 528, y: 915} + m_defaultScale: 0.14583333 + m_LastWindowPixelSize: {x: 280, y: 915} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 00000000000000000000 m_XRRenderMode: 0 m_RenderTexture: {fileID: 0} ---- !u!114 &13 +--- !u!114 &17 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -453,7 +564,7 @@ MonoBehaviour: m_CurrentEditor: 1 m_LayerEditor: m_SelectedLayerIndex: 0 ---- !u!114 &14 +--- !u!114 &18 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -475,8 +586,8 @@ MonoBehaviour: m_Pos: serializedVersion: 2 x: 0 - y: 79 - width: 898 + y: 24 + width: 280 height: 915 m_SerializedDataModeController: m_DataMode: 0 @@ -548,10 +659,10 @@ MonoBehaviour: displayed: 1 id: unity-transform-toolbar index: 0 - contents: '{"m_Layout":2,"m_Collapsed":false,"m_Floating":false,"m_FloatingSnapOffset":{"x":-374.9990234375,"y":-238.0},"m_SnapOffsetDelta":{"x":0.0,"y":0.0},"m_FloatingSnapCorner":3,"m_Size":{"x":0.0,"y":0.0},"m_SizeOverridden":false}' + contents: '{"m_Layout":2,"m_Collapsed":false,"m_Floating":false,"m_FloatingSnapOffset":{"x":-258.9990234375,"y":-238.0},"m_SnapOffsetDelta":{"x":0.0,"y":0.0},"m_FloatingSnapCorner":3,"m_Size":{"x":0.0,"y":0.0},"m_SizeOverridden":false}' floating: 0 collapsed: 0 - snapOffset: {x: -374.99902, y: -238} + snapOffset: {x: -258.99902, y: -238} snapOffsetDelta: {x: 0, y: 0} snapCorner: 3 layout: 2 @@ -940,12 +1051,12 @@ MonoBehaviour: displayed: 1 id: Overlays/OverlayMenu index: 1 - contents: '{"m_Layout":1,"m_Collapsed":false,"m_Floating":false,"m_FloatingSnapOffset":{"x":-47.0,"y":-56.0},"m_SnapOffsetDelta":{"x":0.0,"y":0.0},"m_FloatingSnapCorner":2,"m_Size":{"x":0.0,"y":0.0},"m_SizeOverridden":false}' + contents: '{"m_Layout":1,"m_Collapsed":false,"m_Floating":false,"m_FloatingSnapOffset":{"x":-327.0,"y":-56.0},"m_SnapOffsetDelta":{"x":0.0,"y":0.0},"m_FloatingSnapCorner":3,"m_Size":{"x":0.0,"y":0.0},"m_SizeOverridden":false}' floating: 0 collapsed: 0 - snapOffset: {x: -47, y: -56} + snapOffset: {x: -327, y: -56} snapOffsetDelta: {x: 0, y: 0} - snapCorner: 2 + snapCorner: 3 layout: 1 size: {x: 0, y: 0} sizeOverridden: 0 @@ -1121,7 +1232,7 @@ MonoBehaviour: m_LastSceneViewRotation: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} m_LastSceneViewOrtho: 0 m_Viewpoint: - m_SceneView: {fileID: 14} + m_SceneView: {fileID: 18} m_CameraOverscanSettings: m_Opacity: 50 m_Scale: 1 @@ -1131,7 +1242,7 @@ MonoBehaviour: m_LastLockedObject: {fileID: 0} m_LastDebugDrawMode: 35 m_ViewIsLockedToObject: 0 ---- !u!114 &15 +--- !u!114 &19 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1154,8 +1265,8 @@ MonoBehaviour: serializedVersion: 2 x: 1 y: 24 - width: 438 - height: 430 + width: 614 + height: 239 m_SerializedDataModeController: m_DataMode: 0 m_PreferredDataMode: 0 @@ -1172,7 +1283,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: b06bffffca6bffffd66bffff7874ffffd475ffff5a79ffffa285fffffe86ffffea89ffff0092ffff5c93ffff5c96ffffc298ffffbaa0ffff16a2ffff02a5ffff1eaeffff7aafffff08b3fffff4fafffff6faffff + m_ExpandedIDs: 72faffff m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1189,7 +1300,7 @@ MonoBehaviour: m_OriginalEventType: 11 m_IsRenamingFilename: 0 m_TrimLeadingAndTrailingWhitespace: 0 - m_ClientGUIView: {fileID: 8} + m_ClientGUIView: {fileID: 9} m_SearchString: m_ExpandedScenes: [] m_CurrenRootInstanceID: 0 @@ -1197,7 +1308,7 @@ MonoBehaviour: m_IsLocked: 0 m_CurrentSortingName: TransformSorting m_WindowGUID: 85728a346145f5041b41bc3ce2f945c6 ---- !u!114 &16 +--- !u!114 &20 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1219,9 +1330,9 @@ MonoBehaviour: m_Pos: serializedVersion: 2 x: 1 - y: 480 - width: 438 - height: 459 + y: 289 + width: 614 + height: 650 m_SerializedDataModeController: m_DataMode: 0 m_PreferredDataMode: 0 @@ -1233,7 +1344,7 @@ MonoBehaviour: m_SaveData: [] m_ContainerData: [] m_OverlaysVisible: 1 ---- !u!114 &17 +--- !u!114 &21 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1254,9 +1365,9 @@ MonoBehaviour: m_TextWithWhitespace: "Project\u200B" m_Pos: serializedVersion: 2 - x: 970 + x: 898 y: 24 - width: 282 + width: 455 height: 915 m_SerializedDataModeController: m_DataMode: 0 @@ -1278,8 +1389,9 @@ MonoBehaviour: m_SceneHandles: m_ShowAllHits: 0 m_SkipHidden: 0 - m_SearchArea: 1 - m_Folders: [] + m_SearchArea: 0 + m_Folders: + - Packages/com.alicizax.unity.timer m_Globs: [] m_ProductIds: m_AnyWithAssetOrigin: 0 @@ -1290,14 +1402,14 @@ MonoBehaviour: m_StartGridSize: 96 m_LastFolders: [] m_LastFoldersGridSize: 16 - m_LastProjectPath: F:\Web\Aliciza\Client + m_LastProjectPath: G:\UnityProject\Aliciza\Client m_LockTracker: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 0} m_SelectedIDs: e48c0000 m_LastClickedID: 36068 - m_ExpandedIDs: + m_ExpandedIDs: 000000007abf00003ac100003cc100003ec1000040c1000042c1000044c1000046c1000048c100004ac100004cc100004ec10000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1326,7 +1438,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: + m_ExpandedIDs: 000000007abf00003ac100003cc100003ec1000040c1000042c1000044c1000046c1000048c100004ac100004cc100004ec10000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1343,7 +1455,7 @@ MonoBehaviour: m_OriginalEventType: 11 m_IsRenamingFilename: 1 m_TrimLeadingAndTrailingWhitespace: 0 - m_ClientGUIView: {fileID: 10} + m_ClientGUIView: {fileID: 13} m_SearchString: m_CreateAssetUtility: m_EndAction: {fileID: 0} @@ -1354,7 +1466,7 @@ MonoBehaviour: m_ListAreaState: m_SelectedInstanceIDs: m_LastClickedInstanceID: 0 - m_HadKeyboardFocusLastEvent: 0 + m_HadKeyboardFocusLastEvent: 1 m_ExpandedInstanceIDs: 0c750000f2d60000 m_RenameOverlay: m_UserAcceptedRename: 0 @@ -1372,7 +1484,7 @@ MonoBehaviour: m_OriginalEventType: 11 m_IsRenamingFilename: 1 m_TrimLeadingAndTrailingWhitespace: 0 - m_ClientGUIView: {fileID: 10} + m_ClientGUIView: {fileID: 13} m_CreateAssetUtility: m_EndAction: {fileID: 0} m_InstanceID: 0 @@ -1384,7 +1496,7 @@ MonoBehaviour: m_GridSize: 96 m_SkipHiddenPackages: 0 m_DirectoriesAreaWidth: 115 ---- !u!114 &18 +--- !u!114 &22 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1405,9 +1517,9 @@ MonoBehaviour: m_TextWithWhitespace: "Inspector\u200B" m_Pos: serializedVersion: 2 - x: 1254 + x: 1355 y: 24 - width: 666 + width: 565 height: 915 m_SerializedDataModeController: m_DataMode: 0