From a116f2449931c097ee3ca899beda1363435f8460 Mon Sep 17 00:00:00 2001 From: Nam Tae Gun Date: Mon, 11 Nov 2024 11:02:24 +0900 Subject: [PATCH] =?UTF-8?q?0.3.3.10=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/01.Scenes/01.Tycoon.unity | 710 +++-- .../Npc/Customer/Action/EatCocktail.cs | 2 +- .../Action/MoveMoneyCounterPosition.cs | 26 + .../Action/MoveMoneyCounterPosition.cs.meta | 2 + .../Npc/Customer/Action/PayMoney.cs | 32 + .../Npc/Customer/Action/PayMoney.cs.meta | 2 + .../BehaviorTree/Npc/Customer/Action/Vomit.cs | 16 - .../Npc/Customer/Conditional/CanVomit.cs | 41 + .../Npc/Customer/Conditional/CanVomit.cs.meta | 2 + .../Npc/Customer/Conditional/PayMoney.cs | 97 - .../Npc/Customer/Conditional/PayMoney.cs.meta | 2 - .../Npc/Crew/Bartender/BartenderCrew.cs | 36 +- .../Character/Npc/Customer/Customer.cs | 56 +- .../Player/Tycoon/TycoonPickupHandler.cs | 8 + .../Character/Player/Tycoon/TycoonPlayer.cs | 24 + Assets/02.Scripts/EventManager.cs | 36 + Assets/02.Scripts/LocalizationManager.cs | 62 + Assets/02.Scripts/LocalizationManager.cs.meta | 2 + Assets/02.Scripts/Prop/Tycoon/Barrel.cs | 2 +- .../Prop/Tycoon/InteractionFuniture.cs | 35 +- Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs | 165 + .../Prop/Tycoon/MoneyCounter.cs.meta | 2 + Assets/02.Scripts/Prop/Tycoon/ServingTable.cs | 10 +- Assets/02.Scripts/Prop/Tycoon/TableSeat.cs | 5 + Assets/02.Scripts/Prop/Tycoon/TrashCan.cs | 117 +- .../ScriptableObject/CardDataTable.asset | 138 +- .../ScriptableObject/SpriteData.asset | 1 + Assets/02.Scripts/SpriteDataSo.cs | 3 + Assets/02.Scripts/Tycoon/Liquid.cs | 14 +- Assets/02.Scripts/Tycoon/LiquidController.cs | 20 +- Assets/02.Scripts/Tycoon/LiquidIngredient.cs | 8 +- Assets/02.Scripts/Tycoon/StageDataSo.cs | 18 + .../Tycoon/TycoonStageController.cs | 37 +- Assets/02.Scripts/Tycoon/TycoonStatus.cs | 6 +- Assets/02.Scripts/Ui/Tycoon/BalloonUi.cs | 6 +- Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs | 46 +- .../02.Scripts/Ui/Tycoon/TycoonSelectCard.cs | 17 +- Assets/02.Scripts/Ui/Tycoon/Upgrade_Popup.cs | 13 +- Assets/02.Scripts/Utility/Utils.cs | 13 + .../Props/Furniture/MoneyCounter01.png | Bin 0 -> 124720 bytes .../Props/Furniture/MoneyCounter01.png.meta | 143 + .../Props/Furniture/MoneyCounter02.png | Bin 0 -> 155130 bytes .../Props/Furniture/MoneyCounter02.png.meta | 143 + .../Props/Furniture/MoneyCounter03.png | Bin 0 -> 199177 bytes .../Props/Furniture/MoneyCounter03.png.meta | 143 + .../Props/Furniture/MoneyCounterEmpty.png | Bin 0 -> 94301 bytes .../Furniture/MoneyCounterEmpty.png.meta | 143 + .../Characters/Npcs/Customer.prefab | 41 + .../Characters/Players/TycoonPlayer.prefab | 2 + .../Managers/LocalizationManager.prefab | 47 + .../LocalizationManager.prefab.meta} | 2 +- .../Maps/Tycoon/NewTycoonMap.prefab | 119 + .../05.Prefabs/Maps/Tycoon/TycoonMap 2.prefab | 111 +- .../05.Prefabs/Maps/Tycoon/TycoonMap 3.prefab | 119 +- .../Maps/Tycoon/TycoonMapUpsideDown.prefab | 115 +- .../Particles/PayMoneyParticle.prefab | 2 +- .../Interactions/BartenderTable02.prefab | 44 + .../Interactions/CustomerTable3.prefab | 87 +- .../Interactions/LiquidBarrel01.prefab | 68 +- .../Interactions/LiquidStatue.prefab | 72 +- .../Interactions/MoneyCounter.prefab | 267 ++ .../Interactions/MoneyCounter.prefab.meta} | 2 +- .../Furniture/Interactions/Mushroom.prefab | 53 +- .../Props/Furniture/Interactions/Pump.prefab | 45 +- .../Interactions/RandomChangeTrashCan.prefab | 204 ++ .../RandomChangeTrashCan.prefab.meta} | 2 +- .../Interactions/ServingTable02.prefab | 46 +- .../Furniture/Interactions/TrashCan.prefab | 88 +- .../Furniture/Interactions/Vomiting.prefab | 45 +- Assets/05.Prefabs/Props/Mini/Barrel.prefab | 71 - Assets/05.Prefabs/Props/Mini/Column 1.prefab | 67 - Assets/05.Prefabs/Props/Mini/Column.prefab | 75 - Assets/05.Prefabs/Props/Mini/NPCTable.prefab | 67 - Assets/05.Prefabs/Props/Mini/TrashCan.prefab | 67 - .../Props/Mini/TrashCan.prefab.meta | 7 - Assets/05.Prefabs/Props/Mini/WallBar.prefab | 67 - .../05.Prefabs/Props/Mini/WallBar.prefab.meta | 7 - .../Props/Mini/WoodenBeerMug.prefab | 67 - .../Props/Mini/WoodenBeerMug.prefab.meta | 7 - .../05.Prefabs/Uis/InteractionCanvas.prefab | 2 +- Assets/05.Prefabs/Uis/Tycoons/Card.prefab | 2 +- Assets/11.BehaviorTree/Customer.asset | 9 +- Assets/13.Localization.meta | 8 + Assets/13.Localization/English (en).asset | 25 + .../13.Localization/English (en).asset.meta | 8 + .../Global Variables Group Asset.asset | 67 + .../Global Variables Group Asset.asset.meta | 8 + Assets/13.Localization/Korean (ko).asset | 25 + Assets/13.Localization/Korean (ko).asset.meta | 8 + .../Localization Settings.asset | 213 ++ .../Localization Settings.asset.meta | 8 + Assets/13.Localization/StringDataTable.csv | 51 + .../StringDataTable.csv.meta} | 4 +- Assets/13.Localization/Tables.meta | 8 + .../Tables/StringDataTable Shared Data.asset | 232 ++ .../StringDataTable Shared Data.asset.meta | 8 + .../Tables/StringDataTable.asset | 57 + .../Tables/StringDataTable.asset.meta | 8 + .../Tables/StringDataTable_en.asset | 247 ++ .../Tables/StringDataTable_en.asset.meta | 8 + .../Tables/StringDataTable_ko.asset | 260 ++ .../Tables/StringDataTable_ko.asset.meta | 8 + Assets/AddressableAssetsData.meta | 8 + .../AddressableAssetSettings.asset | 122 + .../AddressableAssetSettings.asset.meta | 8 + .../AssetGroupTemplates.meta | 8 + .../AssetGroupTemplates/Packed Assets.asset | 78 + .../Packed Assets.asset.meta | 8 + Assets/AddressableAssetsData/AssetGroups.meta | 8 + .../AssetGroups/Default Local Group.asset | 23 + .../Default Local Group.asset.meta | 8 + .../Localization-Assets-Shared.asset | 28 + .../Localization-Assets-Shared.asset.meta | 8 + .../AssetGroups/Localization-Locales.asset | 35 + .../Localization-Locales.asset.meta | 8 + ...alization-String-Tables-English (en).asset | 29 + ...tion-String-Tables-English (en).asset.meta | 8 + ...calization-String-Tables-Korean (ko).asset | 29 + ...ation-String-Tables-Korean (ko).asset.meta | 8 + .../AssetGroups/Schemas.meta | 8 + ... Local Group_BundledAssetGroupSchema.asset | 47 + ...l Group_BundledAssetGroupSchema.asset.meta | 8 + ...Local Group_ContentUpdateGroupSchema.asset | 16 + ... Group_ContentUpdateGroupSchema.asset.meta | 8 + ...ssets-Shared_BundledAssetGroupSchema.asset | 47 + ...-Shared_BundledAssetGroupSchema.asset.meta | 8 + ...sets-Shared_ContentUpdateGroupSchema.asset | 16 + ...Shared_ContentUpdateGroupSchema.asset.meta | 8 + ...tion-Locales_BundledAssetGroupSchema.asset | 47 + ...Locales_BundledAssetGroupSchema.asset.meta | 8 + ...ion-Locales_ContentUpdateGroupSchema.asset | 16 + ...ocales_ContentUpdateGroupSchema.asset.meta | 8 + ...English (en)_BundledAssetGroupSchema.asset | 47 + ...sh (en)_BundledAssetGroupSchema.asset.meta | 8 + ...nglish (en)_ContentUpdateGroupSchema.asset | 16 + ...h (en)_ContentUpdateGroupSchema.asset.meta | 8 + ...-Korean (ko)_BundledAssetGroupSchema.asset | 47 + ...an (ko)_BundledAssetGroupSchema.asset.meta | 8 + ...Korean (ko)_ContentUpdateGroupSchema.asset | 16 + ...n (ko)_ContentUpdateGroupSchema.asset.meta | 8 + .../AddressableAssetsData/DataBuilders.meta | 8 + .../DataBuilders/BuildScriptFastMode.asset | 20 + .../BuildScriptFastMode.asset.meta | 8 + .../DataBuilders/BuildScriptPackedMode.asset | 20 + .../BuildScriptPackedMode.asset.meta | 8 + .../BuildScriptPackedPlayMode.asset | 20 + .../BuildScriptPackedPlayMode.asset.meta | 8 + .../AddressableAssetsData/DefaultObject.asset | 15 + .../DefaultObject.asset.meta | 8 + .../Resources/ES3/ES3Defaults.asset | 2 + .../Config/Editor/OdinModuleConfig.asset | 4 + .../Modules/Unity.Addressables.meta | 8 + .../AddressablesInspectors.cs | 1276 ++++++++ .../AddressablesInspectors.cs.meta | 11 + ...nspector.Modules.Unity.Addressables.asmdef | 29 + ...tor.Modules.Unity.Addressables.asmdef.meta | 7 + .../Unity.Addressables/Validators.meta | 8 + .../AssetLabelReferenceValidator.cs | 94 + .../AssetLabelReferenceValidator.cs.meta | 11 + .../Validators/AssetReferenceValidator.cs | 280 ++ .../AssetReferenceValidator.cs.meta | 11 + ...eckDuplicateBundleDependenciesValidator.cs | 201 ++ ...plicateBundleDependenciesValidator.cs.meta | 11 + ...dressableDuplicateDependenciesValidator.cs | 171 ++ ...ableDuplicateDependenciesValidator.cs.meta | 11 + ...ressableSubAssetFieldAttributeValidator.cs | 34 + ...bleSubAssetFieldAttributeValidator.cs.meta | 11 + ...ssingAddressableGroupReferenceValidator.cs | 55 + ...AddressableGroupReferenceValidator.cs.meta | 11 + .../Modules/Unity.Addressables/manifest.txt | 21 + .../Unity.Addressables/manifest.txt.meta | 7 + .../Modules/Unity.Localization.meta | 8 + .../Modules/Unity.Localization/Editor.meta | 8 + .../Unity.Localization/Editor/Configs.meta | 3 + .../Configs/OdinLocalizationConfig.asset | 29 + .../Configs/OdinLocalizationConfig.asset.meta | 8 + .../Editor/Configs/OdinLocalizationConfig.cs | 173 ++ .../Configs/OdinLocalizationConfig.cs.meta | 3 + .../Unity.Localization/Editor/GUI.meta | 3 + .../Editor/GUI/LocalizationMetadata.cs | 993 ++++++ .../Editor/GUI/LocalizationMetadata.cs.meta | 11 + .../GUI/OdinAssetTableCollectionEditor.cs | 986 ++++++ .../OdinAssetTableCollectionEditor.cs.meta | 3 + .../Editor/GUI/OdinGUITable.cs | 196 ++ .../Editor/GUI/OdinGUITable.cs.meta | 3 + .../Editor/GUI/OdinGUITableCollection.cs | 483 +++ .../Editor/GUI/OdinGUITableCollection.cs.meta | 3 + .../Editor/GUI/OdinSharedEntryCollection.cs | 441 +++ .../GUI/OdinSharedEntryCollection.cs.meta | 3 + .../GUI/OdinStringTableCollectionEditor.cs | 440 +++ .../OdinStringTableCollectionEditor.cs.meta | 3 + .../Editor/GUI/OdinTableCollectionEditor.cs | 2719 +++++++++++++++++ .../GUI/OdinTableCollectionEditor.cs.meta | 3 + .../Editor/GUI/OdinTemplateMetadata.cs | 23 + .../Editor/GUI/OdinTemplateMetadata.cs.meta | 3 + .../Unity.Localization/Editor/GUI/Toggle.cs | 38 + .../Editor/GUI/Toggle.cs.meta | 11 + .../Unity.Localization/Editor/Internal.meta | 3 + .../Internal/OdinLocalizationAssetCache.cs | 68 + .../OdinLocalizationAssetCache.cs.meta | 3 + .../OdinLocalizationEditorSettings.cs | 68 + .../OdinLocalizationEditorSettings.cs.meta | 3 + .../Editor/Internal/OdinLocalizationEvents.cs | 50 + .../Internal/OdinLocalizationEvents.cs.meta | 3 + .../Editor/Internal/OdinLocalizationGUI.cs | 438 +++ .../Internal/OdinLocalizationGUI.cs.meta | 3 + .../Internal/OdinLocalizationGUITextures.cs | 310 ++ .../OdinLocalizationGUITextures.cs.meta | 3 + .../OdinLocalizationMetadataRegistry.cs | 55 + .../OdinLocalizationMetadataRegistry.cs.meta | 3 + .../OdinLocalizationReflectionValidator.cs | 43 + ...dinLocalizationReflectionValidator.cs.meta | 3 + .../OdinLocalizationReflectionValues.cs | 174 ++ .../OdinLocalizationReflectionValues.cs.meta | 3 + .../OdinLocalizationSyntaxHighlighter.cs | 196 ++ .../OdinLocalizationSyntaxHighlighter.cs.meta | 3 + .../Editor/LocalizationSupport.cs | 39 + .../Editor/LocalizationSupport.cs.meta | 11 + .../Editor/OdinLocalizationConstants.cs | 25 + .../Editor/OdinLocalizationConstants.cs.meta | 3 + ...or.Modules.UnityLocalization.Editor.asmdef | 29 + ...dules.UnityLocalization.Editor.asmdef.meta | 7 + .../Unity.Localization/Editor/Windows.meta | 3 + .../Windows/OdinLocalizationEditorWindow.cs | 663 ++++ .../OdinLocalizationEditorWindow.cs.meta | 3 + .../Modules/Unity.Localization/Runtime.meta | 8 + .../Runtime/LocalizedStringFormatter.cs | 58 + .../Runtime/LocalizedStringFormatter.cs.meta | 11 + ...Inspector.Modules.UnityLocalization.asmdef | 11 + ...ctor.Modules.UnityLocalization.asmdef.meta | 7 + .../Modules/Unity.Localization/manifest.txt | 62 + .../Unity.Localization/manifest.txt.meta | 7 + Assets/Resources/Excel/CardDataTable.xlsx | Bin 10811 -> 11053 bytes Assets/Resources/JSON/CardDataTable.json | 72 +- Packages/manifest.json | 1 + Packages/packages-lock.json | 39 + ProjectSettings/EditorBuildSettings.asset | 2 + 237 files changed, 16682 insertions(+), 1385 deletions(-) create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs.meta create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs.meta create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs create mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs.meta delete mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs delete mode 100644 Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs.meta create mode 100644 Assets/02.Scripts/LocalizationManager.cs create mode 100644 Assets/02.Scripts/LocalizationManager.cs.meta create mode 100644 Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs create mode 100644 Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs.meta create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter01.png create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter01.png.meta create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter02.png create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter02.png.meta create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter03.png create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounter03.png.meta create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounterEmpty.png create mode 100644 Assets/03.Images/Props/Furniture/MoneyCounterEmpty.png.meta create mode 100644 Assets/05.Prefabs/Managers/LocalizationManager.prefab rename Assets/05.Prefabs/{Props/Mini/Column 1.prefab.meta => Managers/LocalizationManager.prefab.meta} (74%) create mode 100644 Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab rename Assets/05.Prefabs/Props/{Mini/Column.prefab.meta => Furniture/Interactions/MoneyCounter.prefab.meta} (74%) create mode 100644 Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab rename Assets/05.Prefabs/Props/{Mini/NPCTable.prefab.meta => Furniture/Interactions/RandomChangeTrashCan.prefab.meta} (74%) delete mode 100644 Assets/05.Prefabs/Props/Mini/Barrel.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/Column 1.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/Column.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/NPCTable.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/TrashCan.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/TrashCan.prefab.meta delete mode 100644 Assets/05.Prefabs/Props/Mini/WallBar.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/WallBar.prefab.meta delete mode 100644 Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab delete mode 100644 Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab.meta create mode 100644 Assets/13.Localization.meta create mode 100644 Assets/13.Localization/English (en).asset create mode 100644 Assets/13.Localization/English (en).asset.meta create mode 100644 Assets/13.Localization/Global Variables Group Asset.asset create mode 100644 Assets/13.Localization/Global Variables Group Asset.asset.meta create mode 100644 Assets/13.Localization/Korean (ko).asset create mode 100644 Assets/13.Localization/Korean (ko).asset.meta create mode 100644 Assets/13.Localization/Localization Settings.asset create mode 100644 Assets/13.Localization/Localization Settings.asset.meta create mode 100644 Assets/13.Localization/StringDataTable.csv rename Assets/{05.Prefabs/Props/Mini/Barrel.prefab.meta => 13.Localization/StringDataTable.csv.meta} (62%) create mode 100644 Assets/13.Localization/Tables.meta create mode 100644 Assets/13.Localization/Tables/StringDataTable Shared Data.asset create mode 100644 Assets/13.Localization/Tables/StringDataTable Shared Data.asset.meta create mode 100644 Assets/13.Localization/Tables/StringDataTable.asset create mode 100644 Assets/13.Localization/Tables/StringDataTable.asset.meta create mode 100644 Assets/13.Localization/Tables/StringDataTable_en.asset create mode 100644 Assets/13.Localization/Tables/StringDataTable_en.asset.meta create mode 100644 Assets/13.Localization/Tables/StringDataTable_ko.asset create mode 100644 Assets/13.Localization/Tables/StringDataTable_ko.asset.meta create mode 100644 Assets/AddressableAssetsData.meta create mode 100644 Assets/AddressableAssetsData/AddressableAssetSettings.asset create mode 100644 Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroupTemplates.meta create mode 100644 Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset create mode 100644 Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset create mode 100644 Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset.meta create mode 100644 Assets/AddressableAssetsData/DataBuilders.meta create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset create mode 100644 Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta create mode 100644 Assets/AddressableAssetsData/DefaultObject.asset create mode 100644 Assets/AddressableAssetsData/DefaultObject.asset.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef.meta create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt create mode 100644 Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt.meta diff --git a/Assets/01.Scenes/01.Tycoon.unity b/Assets/01.Scenes/01.Tycoon.unity index b6ac20ca2..7137cfd5a 100644 --- a/Assets/01.Scenes/01.Tycoon.unity +++ b/Assets/01.Scenes/01.Tycoon.unity @@ -1658,6 +1658,81 @@ MonoBehaviour: SwitchMapsClosed: 1 _rectTransform: {fileID: 102499728} k__BackingField: {fileID: 139042448} +--- !u!1 &104342230 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 104342231} + - component: {fileID: 104342233} + - component: {fileID: 104342232} + m_Layer: 5 + m_Name: Liqueur + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &104342231 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104342230} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 936772049} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -250, y: 0} + m_SizeDelta: {x: 200, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &104342232 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104342230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: a8c45767f0a3ec245a47087c7ada2b50, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &104342233 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104342230} + m_CullTransparentMesh: 1 --- !u!1 &106186566 GameObject: m_ObjectHideFlags: 0 @@ -3048,6 +3123,7 @@ MonoBehaviour: shakeLimit: 10 fallSpeed: 200 shakeInterval: 0.01 + ResultUi: {fileID: 0} --- !u!1 &177060249 GameObject: m_ObjectHideFlags: 0 @@ -3175,7 +3251,7 @@ MonoBehaviour: card01: {fileID: 5785355462301107295, guid: 2116ffd228314c745b8615652b11d19e, type: 3} card02: {fileID: 5785355462301107295, guid: 2116ffd228314c745b8615652b11d19e, type: 3} card03: {fileID: 5785355462301107295, guid: 2116ffd228314c745b8615652b11d19e, type: 3} - _upgradePopup: {fileID: 272053700} + _upgradePopup: {fileID: 454484352} --- !u!1 &194818728 GameObject: m_ObjectHideFlags: 0 @@ -4035,58 +4111,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 270061732} m_CullTransparentMesh: 1 ---- !u!1 &272053700 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 272053701} - - component: {fileID: 272053702} - m_Layer: 5 - m_Name: Upgrade_Popup - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &272053701 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 272053700} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1444408144} - m_Father: {fileID: 1049919592} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &272053702 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 272053700} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 53190759a9125774885ff29574bb98c0, type: 3} - m_Name: - m_EditorClassIdentifier: - _panel: {fileID: 1444408143} - _animationController: {fileID: 547484574} - information: {fileID: 1827455912} --- !u!1 &272969422 GameObject: m_ObjectHideFlags: 0 @@ -4608,6 +4632,118 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 327744319} m_CullTransparentMesh: 1 +--- !u!1 &332294395 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 332294396} + - component: {fileID: 332294400} + - component: {fileID: 332294399} + - component: {fileID: 332294398} + - component: {fileID: 332294397} + m_Layer: 5 + m_Name: BackgroundPaper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &332294396 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 332294395} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1560233564} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &332294397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 332294395} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 17488a2bea6f4126a7877ce5d934f865, type: 3} + m_Name: + m_EditorClassIdentifier: + _animator: {fileID: 332294398} +--- !u!95 &332294398 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 332294395} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 321b6014bde8a4d44aa6a3c1200a26cc, type: 2} + m_CullingMode: 0 + m_UpdateMode: 2 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &332294399 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 332294395} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &332294400 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 332294395} + m_CullTransparentMesh: 1 --- !u!1 &338206470 GameObject: m_ObjectHideFlags: 0 @@ -6182,6 +6318,59 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 450220854} m_CullTransparentMesh: 1 +--- !u!1 &454484352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 454484353} + - component: {fileID: 454484354} + m_Layer: 5 + m_Name: Upgrade_Ui + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &454484353 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 454484352} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 1560233564} + m_Father: {fileID: 1049919592} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &454484354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 454484352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 53190759a9125774885ff29574bb98c0, type: 3} + m_Name: + m_EditorClassIdentifier: + _panel: {fileID: 1560233563} + _animationController: {fileID: 332294397} + information: {fileID: 936772050} + liqueurImage: {fileID: 104342232} --- !u!1 &473619455 GameObject: m_ObjectHideFlags: 0 @@ -6841,118 +7030,6 @@ MonoBehaviour: m_EditorClassIdentifier: BoundingVolume: {fileID: 1589932377} SlowingDistance: 100 ---- !u!1 &547484572 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 547484573} - - component: {fileID: 547484577} - - component: {fileID: 547484576} - - component: {fileID: 547484575} - - component: {fileID: 547484574} - m_Layer: 5 - m_Name: BackgroundPaper - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &547484573 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 547484572} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1444408144} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1000, y: 600} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &547484574 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 547484572} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 17488a2bea6f4126a7877ce5d934f865, type: 3} - m_Name: - m_EditorClassIdentifier: - _animator: {fileID: 547484575} ---- !u!95 &547484575 -Animator: - serializedVersion: 7 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 547484572} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: 321b6014bde8a4d44aa6a3c1200a26cc, type: 2} - m_CullingMode: 0 - m_UpdateMode: 2 - m_ApplyRootMotion: 0 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_AnimatePhysics: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 ---- !u!114 &547484576 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 547484572} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &547484577 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 547484572} - m_CullTransparentMesh: 1 --- !u!1 &562911823 GameObject: m_ObjectHideFlags: 0 @@ -11707,6 +11784,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 912229365} m_CullTransparentMesh: 1 +--- !u!1 &936772048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 936772049} + - component: {fileID: 936772051} + - component: {fileID: 936772050} + m_Layer: 5 + m_Name: Information + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &936772049 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936772048} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 104342231} + m_Father: {fileID: 1560233564} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 1000} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &936772050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936772048} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ea9a47744b51f7b46958a79a03d0cca6, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &936772051 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 936772048} + m_CullTransparentMesh: 1 --- !u!1001 &947672648 PrefabInstance: m_ObjectHideFlags: 0 @@ -13186,7 +13339,7 @@ RectTransform: - {fileID: 2032162537} - {fileID: 1701833860} - {fileID: 186139408} - - {fileID: 272053701} + - {fileID: 454484353} - {fileID: 175652153} - {fileID: 2055805161} m_Father: {fileID: 0} @@ -18494,7 +18647,7 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1434161266} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 0, z: -0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: @@ -18503,7 +18656,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -51, y: 21} + m_AnchoredPosition: {x: 60, y: 70} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1434161268 @@ -18826,43 +18979,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 5685570007726524012, guid: 7e6ba4001b3b92a4d8fdd586f6d0f731, type: 3} m_PrefabInstance: {fileID: 1438594026} m_PrefabAsset: {fileID: 0} ---- !u!1 &1444408143 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1444408144} - m_Layer: 5 - m_Name: Panel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1444408144 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1444408143} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 547484573} - - {fileID: 1827455911} - m_Father: {fileID: 272053701} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1445223406 GameObject: m_ObjectHideFlags: 0 @@ -20551,6 +20667,43 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1559580035} m_CullTransparentMesh: 1 +--- !u!1 &1560233563 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1560233564} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1560233564 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560233563} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 332294396} + - {fileID: 936772049} + m_Father: {fileID: 454484353} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1001 &1562271984 PrefabInstance: m_ObjectHideFlags: 0 @@ -22672,6 +22825,8 @@ MonoBehaviour: m_EditorClassIdentifier: k__BackingField: {fileID: 11400000, guid: 5fd0220da8e388e4c872a9fcc80d2c76, type: 2} _mushroomObject: {fileID: 9017181398980009727, guid: 6ae3ef0fd03a4f14bb60802eb4fc0fa8, type: 3} + PlayerServingCount: 0 + PlayerCleaningCount: 0 --- !u!114 &1665075873 MonoBehaviour: m_ObjectHideFlags: 0 @@ -25832,81 +25987,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1821459830} m_CullTransparentMesh: 1 ---- !u!1 &1827455910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1827455911} - - component: {fileID: 1827455913} - - component: {fileID: 1827455912} - m_Layer: 5 - m_Name: Information - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1827455911 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1827455910} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1444408144} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1000, y: 1000} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1827455912 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1827455910} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: ea9a47744b51f7b46958a79a03d0cca6, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1827455913 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1827455910} - m_CullTransparentMesh: 1 --- !u!1 &1834176991 GameObject: m_ObjectHideFlags: 0 @@ -26220,24 +26300,24 @@ MonoBehaviour: m_EditorClassIdentifier: _billPrefab: {fileID: 3359733629073227380, guid: 8e1b25c375bfe2748993aba6d9af3fb5, type: 3} _chain: {fileID: 1434161268} - _spawnPosition: {x: 400, y: -120, z: 0} + _spawnPosition: {x: 400, y: -65, z: 0} _spawnLocation: {fileID: 128638924} _billInfos: - IsEmpty: 1 IsMoving: 0 - k__BackingField: {x: -290, y: -120, z: 0} + k__BackingField: {x: -220, y: -65, z: 0} - IsEmpty: 1 IsMoving: 0 - k__BackingField: {x: -170, y: -120, z: 0} + k__BackingField: {x: -110, y: -65, z: 0} - IsEmpty: 1 IsMoving: 0 - k__BackingField: {x: -50, y: -120, z: 0} + k__BackingField: {x: 0, y: -65, z: 0} - IsEmpty: 1 IsMoving: 0 - k__BackingField: {x: 70, y: -120, z: 0} + k__BackingField: {x: 110, y: -65, z: 0} - IsEmpty: 1 IsMoving: 0 - k__BackingField: {x: 190, y: -120, z: 0} + k__BackingField: {x: 220, y: -65, z: 0} --- !u!1 &1858488034 GameObject: m_ObjectHideFlags: 0 @@ -29923,6 +30003,63 @@ MonoBehaviour: _healthPointPrefab: {fileID: 4356182340925070836, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} _maxHeartCount: 5 _healthPoints: [] +--- !u!1001 &1232916638049353559 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8379768038421875437, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_Name + value: LocalizationManager + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9131977339796530822, guid: 1614514235215fe4b877ab0945881d27, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 1614514235215fe4b877ab0945881d27, type: 3} --- !u!1001 &5626406452199475265 PrefabInstance: m_ObjectHideFlags: 0 @@ -32061,6 +32198,7 @@ SceneRoots: - {fileID: 1628404463} - {fileID: 91463582} - {fileID: 1472541870} + - {fileID: 1232916638049353559} - {fileID: 1665075868} - {fileID: 338206472} - {fileID: 141729588} diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/EatCocktail.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/EatCocktail.cs index ec7473163..3cc21ad60 100644 --- a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/EatCocktail.cs +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/EatCocktail.cs @@ -31,7 +31,7 @@ namespace BlueWater.BehaviorTrees.Actions return TaskStatus.Running; } - _customer.PayMoney(); + _customer.FinishFood(); return TaskStatus.Success; } } diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs new file mode 100644 index 000000000..d803e5b3f --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs @@ -0,0 +1,26 @@ +using System; +using BehaviorDesigner.Runtime.Tasks; +using BlueWater.Npcs.Customers; +using Action = BehaviorDesigner.Runtime.Tasks.Action; + +namespace BlueWater.BehaviorTrees.Actions +{ + [TaskCategory("Custom/Npc/Customer")] + [Serializable] + public class MoveMoneyCounterPosition : Action + { + private Customer _customer; + + public override void OnAwake() + { + _customer = GetComponent(); + } + + public override TaskStatus OnUpdate() + { + _customer.MoveMoneyCounter(); + + return TaskStatus.Success; + } + } +} \ No newline at end of file diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs.meta b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs.meta new file mode 100644 index 000000000..e8affe0d8 --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/MoveMoneyCounterPosition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 17c5828cdf648f44a9783d1495a16150 diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs new file mode 100644 index 000000000..5e941cd7b --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs @@ -0,0 +1,32 @@ +using System; +using BehaviorDesigner.Runtime.Tasks; +using BlueWater.Npcs.Customers; +using Action = BehaviorDesigner.Runtime.Tasks.Action; + +namespace BlueWater.BehaviorTrees.Actions +{ + [TaskCategory("Custom/Npc/Customer")] + [Serializable] + public class PayMoney : Action + { + private Customer _customer; + + public override void OnAwake() + { + _customer = GetComponent(); + } + + public override void OnStart() + { + _customer.MoveMoneyCounter(); + } + + public override TaskStatus OnUpdate() + { + if (!_customer.CanMoneyCounterInteractionPosition()) return TaskStatus.Running; + + _customer.PayMoney(); + return TaskStatus.Success; + } + } +} \ No newline at end of file diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs.meta b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs.meta new file mode 100644 index 000000000..7cc53deb2 --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/PayMoney.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c2d5880b15c2a2f49bf07a3e5743cb3a diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/Vomit.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/Vomit.cs index e425606e1..f6a4676f4 100644 --- a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/Vomit.cs +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Action/Vomit.cs @@ -1,10 +1,8 @@ using System; using BehaviorDesigner.Runtime.Tasks; using BlueWater.Npcs.Customers; -using BlueWater.Tycoons; using UnityEngine; using Action = BehaviorDesigner.Runtime.Tasks.Action; -using Random = UnityEngine.Random; namespace BlueWater.BehaviorTrees.Actions { @@ -13,7 +11,6 @@ namespace BlueWater.BehaviorTrees.Actions public class Vomit : Action { private Customer _customer; - private bool _canVomit; private bool _isVomiting; private Vector3 _vomitingPosition; @@ -22,21 +19,8 @@ namespace BlueWater.BehaviorTrees.Actions _customer = GetComponent(); } - public override void OnStart() - { - var random = Random.Range(0f, 100f); - if (random <= TycoonManager.Instance.TycoonStageController.StageDataSo.VomitingPercent) - { - _canVomit = true; - _vomitingPosition = _customer.AIMovement.SetRandomPoint(); - _customer.AIMovement.Move(_vomitingPosition); - } - } - public override TaskStatus OnUpdate() { - if (!_canVomit) return TaskStatus.Success; - if (!_customer.AIMovement.HasReachedDestination()) return TaskStatus.Running; if (!_isVomiting) diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs new file mode 100644 index 000000000..0e8785dae --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs @@ -0,0 +1,41 @@ +using System; +using BehaviorDesigner.Runtime.Tasks; +using BlueWater.Npcs.Customers; +using BlueWater.Tycoons; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace BlueWater.BehaviorTrees.Actions +{ + [TaskCategory("Custom/Npc/Customer")] + [Serializable] + public class CanVomit : Conditional + { + private Customer _customer; + private bool _canVomit; + private bool _isVomiting; + private Vector3 _vomitingPosition; + + public override void OnAwake() + { + _customer = GetComponent(); + } + + public override void OnStart() + { + _customer.MoveMoneyCounter(); + var random = Random.Range(0f, 100f); + if (random <= TycoonManager.Instance.TycoonStageController.StageDataSo.VomitingPercent) + { + _canVomit = true; + _vomitingPosition = _customer.AIMovement.SetRandomPoint(); + _customer.AIMovement.Move(_vomitingPosition); + } + } + + public override TaskStatus OnUpdate() + { + return _canVomit ? TaskStatus.Success : TaskStatus.Failure; + } + } +} \ No newline at end of file diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs.meta b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs.meta new file mode 100644 index 000000000..c25a91bc2 --- /dev/null +++ b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/CanVomit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2d82bbde851a23b42835bd04ca3d3d25 diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs deleted file mode 100644 index 823171d4b..000000000 --- a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using BehaviorDesigner.Runtime.Tasks; -using BlueWater.Npcs.Customers; -using BlueWater.Uis; -using PixelCrushers.DialogueSystem; - -namespace BlueWater.BehaviorTrees.Actions -{ - [TaskCategory("Custom/Npc/Customer")] - [Serializable] - public class PayMoney : Conditional - { - // private Customer _customer; - // private CustomerData _customerData; - // private BalloonUi _balloonUi; - // private int _goldIdx; - // private bool _isPaidMoney; - // - // public override void OnAwake() - // { - // _customer = GetComponent(); - // _customerData = _customer.CustomerData; - // } - // - // public override void OnStart() - // { - // _balloonUi = _customer.BalloonUi; - // _balloonUi.PayMoney(_customerData.WaitTime, _customerData.HurryTime); - // _customer.OnInteraction += HandlePayMoneyInteraction; - // _customer.RegisterPlayerInteraction(); - // } - // - // public override TaskStatus OnUpdate() - // { - // if (_isPaidMoney) - // { - // return TaskStatus.Success; - // } - // - // if (_balloonUi.IsWaitTimeOver()) - // { - // _customer.OnInteraction -= HandlePayMoneyInteraction; - // _customer.UnregisterPlayerInteraction(); - // _balloonUi.CancelOrder(); - // _balloonUi.HideUi(); - // // _customer.AddHappyPoint(-3); - // // if (_customer.HappyPoint <= 0) - // // { - // // _foodBalloonUi.CancelOrder(); - // // _customer.Bark("CancelOrder"); - // // } - // return TaskStatus.Failure; - // } - // - // return TaskStatus.Running; - // } - // - // private void HandlePayMoneyInteraction() - // { - // var tycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; - // var foodPrice = _customer.ItemData.Price; - // float tipCoefficient; - // string barkName; - // switch (_customer.HappyPoint) - // { - // case >= 3: - // tipCoefficient = 2f; - // barkName = "SatisfactoryEvaluation"; - // break; - // case >= 2: - // tipCoefficient = 1.5f; - // barkName = "MediocreEvaluation"; - // break; - // case >= 1: - // tipCoefficient = 1.1f; - // barkName = "MediocreEvaluation"; - // break; - // default: - // tipCoefficient = 1f; - // barkName = "UnsatisfactoryEvaluation"; - // break; - // } - // - // var tipAmount = foodPrice * (int)tipCoefficient; - // var paidAmount = foodPrice + tipAmount; - // tycoonPlayer.GetMoney(paidAmount); - // _customer.PayMoney(foodPrice, tipAmount); - // _balloonUi.HideUi(); - // _customer.OnInteraction -= HandlePayMoneyInteraction; - // _customer.Bark(barkName, BarkOrder.FirstValid); - // _customer.UnregisterPlayerInteraction(); - // _balloonUi.CancelOrder(); - // - // _isPaidMoney = true; - // } - } -} \ No newline at end of file diff --git a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs.meta b/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs.meta deleted file mode 100644 index 35061a393..000000000 --- a/Assets/02.Scripts/BehaviorTree/Npc/Customer/Conditional/PayMoney.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b9c5679271731774f908d8d3119761c9 diff --git a/Assets/02.Scripts/Character/Npc/Crew/Bartender/BartenderCrew.cs b/Assets/02.Scripts/Character/Npc/Crew/Bartender/BartenderCrew.cs index 28aa54f94..048acc210 100644 --- a/Assets/02.Scripts/Character/Npc/Crew/Bartender/BartenderCrew.cs +++ b/Assets/02.Scripts/Character/Npc/Crew/Bartender/BartenderCrew.cs @@ -1,3 +1,4 @@ +using System; using BlueWater.Interfaces; using BlueWater.Items; using BlueWater.Npcs.Customers; @@ -20,15 +21,34 @@ namespace BlueWater.Npcs.Crews.Bartender public IStateMachine MakingCocktailState { get; private set; } private CocktailData _makingCocktailData; + private bool _isFeverTime; + private float _feverTime; + private float _feverMultiply = 1f; protected override void Update() { StateMachineController.UpdateState(this); base.Update(); + + if (_isFeverTime) + { + if (_feverTime > 0f) + { + _feverTime -= Time.deltaTime; + } + else + { + _feverTime = 0f; + _feverMultiply = 1f; + _isFeverTime = false; + } + } } public override void Initialize() { + EventManager.OnCleaningBonus += FeverTime; + IdleState = new IdleState(); MakingCocktailState = new MakingCocktailState(); @@ -36,7 +56,12 @@ namespace BlueWater.Npcs.Crews.Bartender base.Initialize(); } - + + private void OnDestroy() + { + EventManager.OnCleaningBonus -= FeverTime; + } + public override void ResetMission() { CrewInteraction = null; @@ -69,7 +94,7 @@ namespace BlueWater.Npcs.Crews.Bartender OrderedCustomer.CurrentBill.BartenderMakingCocktail(); } - var makingTime = _makingCocktailTime - TycoonManager.Instance.TycoonStatus.BartenderMakingReduction; + var makingTime = (_makingCocktailTime - TycoonManager.Instance.TycoonStatus.BartenderMakingReduction) / _feverMultiply; BalloonUi.OrderItem(_makingCocktailData.Idx, 0, makingTime); IsMakingCocktail = true; @@ -86,5 +111,12 @@ namespace BlueWater.Npcs.Crews.Bartender EventManager.InvokeCocktailCompleted(_makingCocktailData, false); ResetMission(); } + + public void FeverTime(int feverTime, float multiply) + { + _feverTime += feverTime; + _feverMultiply = multiply; + _isFeverTime = true; + } } } \ No newline at end of file diff --git a/Assets/02.Scripts/Character/Npc/Customer/Customer.cs b/Assets/02.Scripts/Character/Npc/Customer/Customer.cs index d2d31aa6d..fbce3fce3 100644 --- a/Assets/02.Scripts/Character/Npc/Customer/Customer.cs +++ b/Assets/02.Scripts/Character/Npc/Customer/Customer.cs @@ -90,7 +90,7 @@ namespace BlueWater.Npcs.Customers public float InteractionRadius { get; private set; } = 2f; [field: SerializeField] - public string InteractionMessage { get; private set; } + public string InteractionMessage { get; set; } [SerializeField] private Vomiting _vomiting; @@ -140,6 +140,7 @@ namespace BlueWater.Npcs.Customers private IAstarAI _astarAi; private Transform _spawnTransform; + private MoneyCounter _moneyCounter; private int _paidAmount; private int _foodPrice; private int _tipAmount; @@ -212,6 +213,7 @@ namespace BlueWater.Npcs.Customers public void Initialize(LevelData levelData, Transform spawnTransform) { + _moneyCounter = FindAnyObjectByType(); CurrentLevelData = levelData; _spawnTransform = spawnTransform; @@ -279,9 +281,14 @@ namespace BlueWater.Npcs.Customers CurrentTableSeat.SetFood(); StateMachineController.TransitionToState(HappyState, this); - var tip = 0; + int tip; if (IsServedPlayer) { + if (TycoonManager.Instance.TycoonStatus.CurrentPassiveCard == PassiveCard.ServingBonus) + { + TycoonManager.Instance.TycoonStageController.ServingBonus(); + } + tip = (int)(CurrentLevelData.Gold * TycoonManager.Instance.TycoonStatus.TipMultiplier); } else @@ -366,6 +373,7 @@ namespace BlueWater.Npcs.Customers { SpineController.EnableCustomMaterial(); EventManager.InvokeShowInteractionUi(InteractionMessage); + EventManager.InvokeHoldInteracting(0f); } public virtual void HideInteractionUi() @@ -412,7 +420,7 @@ namespace BlueWater.Npcs.Customers return isWaitTimeOver; } - public void PayMoney() + public void FinishFood() { var random = Random.Range(0f, 100f); if (random <= TycoonManager.Instance.TycoonStageController.StageDataSo.DirtyTablePercent) @@ -424,11 +432,23 @@ namespace BlueWater.Npcs.Customers CurrentTableSeat.CleanTable(); } + GainExp(); + } + + private void GainExp() + { var exp = (int)(CurrentLevelData.Exp * TycoonManager.Instance.TycoonStatus.ExpMultiplier); EventManager.InvokeChangeExp(exp); } + public void PayMoney() + { + var gold = (int)(CurrentLevelData.Gold * TycoonManager.Instance.TycoonStatus.GoldMultiplier); + + _moneyCounter.AddCurrentMoney(gold); + } + public void Vomit() { AIMovement.StopMove(); @@ -472,7 +492,6 @@ namespace BlueWater.Npcs.Customers { IsReceivedItem = false; IsOrderedSucceed = false; - InteractionMessage = "칵테일 전달"; OrderedCocktailData = TycoonManager.Instance.TycoonIngredientController.GetRandomCocktailData(); var hurryTime = CurrentLevelData.HurryTime + TycoonManager.Instance.TycoonStatus.CustomerHurryTimeIncrease; BalloonUi.OrderItem(OrderedCocktailData.Idx, CurrentLevelData.WaitTime, hurryTime); @@ -482,15 +501,40 @@ namespace BlueWater.Npcs.Customers EventManager.InvokeOrderedCocktail(this); } + public void MovePosition(Vector3 targetPosition) + { + AIMovement.Move(targetPosition); + StateMachineController.TransitionToState(WalkingState, this); + } + + public bool CanMoneyCounterInteractionPosition() + { + if (_moneyCounter.CenterTransform == null) return false; + + return AIMovement.HasReachedDestination() || + Vector3.Distance(_moneyCounter.CenterTransform.position, transform.position) <= + _moneyCounter.InteractionRadius; + } + + public void MoveMoneyCounter() + { + VacateTable(); + MovePosition(_moneyCounter.transform.position); + } + public void MoveSpawnPosition() + { + VacateTable(); + MovePosition(_spawnTransform.position); + } + + public void VacateTable() { if (CurrentTableSeat) { CurrentTableSeat.VacateSeat(); CurrentTableSeat = null; } - AIMovement.Move(_spawnTransform.position); - StateMachineController.TransitionToState(WalkingState, this); } public void ResetGauge() diff --git a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPickupHandler.cs b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPickupHandler.cs index b956871c7..5b6f460e9 100644 --- a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPickupHandler.cs +++ b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPickupHandler.cs @@ -89,6 +89,14 @@ namespace BlueWater.Players.Tycoons IsPickedUpItem = false; } + public void ChangeItem(IPickup item) + { + IsUnfinishedCocktailPickedUp = false; + _currentPickupItem = item; + _itemRenderer.enabled = false; + IsPickedUpItem = true; + } + public IPickup GetCurrentPickupItem() => _currentPickupItem; public bool IsServablePickupItem() => IsPickedUpItem && _currentPickupItem.Idx != "Cocktail000"; diff --git a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs index 3f7a290f4..c9a5b4bc1 100644 --- a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs +++ b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs @@ -61,6 +61,12 @@ namespace BlueWater.Players.Tycoons [field: SerializeField] public TycoonPickupHandler TycoonPickupHandler { get; private set; } + [SerializeField] + private PayMoneyUi _payMoneyUiObject; + + [SerializeField] + private Vector3 _offset = new(0f, 1.5f, 0f); + public bool IsCleaningFloor { get; set; } public bool IsCleaningTable { get; set; } public bool IsMakingCocktail { get; set; } @@ -100,6 +106,7 @@ namespace BlueWater.Players.Tycoons EventManager.OnMakeCocktailCompleted += MakeCocktailCompleted; EventManager.OnCocktailDiscarded += DiscardCocktail; EventManager.OnCocktailServedToCustomer += ServedCocktail; + EventManager.OnChangedRandomCocktail += ChangeCocktail; IdleState = new IdleState(); WalkingState = new WalkingState(); @@ -127,6 +134,7 @@ namespace BlueWater.Players.Tycoons EventManager.OnMakeCocktailCompleted -= MakeCocktailCompleted; EventManager.OnCocktailDiscarded -= DiscardCocktail; EventManager.OnCocktailServedToCustomer -= ServedCocktail; + EventManager.OnChangedRandomCocktail -= ChangeCocktail; } #endregion @@ -172,6 +180,16 @@ namespace BlueWater.Players.Tycoons if (!isMadePlayer) return; InteractionCanvas.BalloonUi.SetItemImage(cocktailData); + + if (TycoonManager.Instance.TycoonStatus.CurrentPassiveCard != PassiveCard.MakingBonus || cocktailData.Idx == "Cocktail000") return; + + var tip = (int)(TycoonManager.Instance.GetCurrentLevelData().Gold * TycoonManager.Instance.TycoonStatus.TipMultiplier); + if (tip > 0) + { + var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, + Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); + payMoneyUi.Initialize(tip); + } } public void DiscardCocktail(CocktailData cocktailData, bool isDiscardedPlayer) @@ -190,6 +208,12 @@ namespace BlueWater.Players.Tycoons InteractionCanvas.BalloonUi.DiscardItem(); } + public void ChangeCocktail(CocktailData cocktailData) + { + InteractionCanvas.BalloonUi.SetItemImage(cocktailData); + TycoonPickupHandler.ChangeItem(cocktailData); + } + private void Dash() { if (!TycoonMovement.CanDash()) return; diff --git a/Assets/02.Scripts/EventManager.cs b/Assets/02.Scripts/EventManager.cs index 8f50d42b6..dee2a5cbe 100644 --- a/Assets/02.Scripts/EventManager.cs +++ b/Assets/02.Scripts/EventManager.cs @@ -202,6 +202,13 @@ namespace BlueWater OnOrderResult?.Invoke(orderedCustomer, orderedSucceed); } + // 손님이 나갈 때, 계산대에 돈을 두고 가는 이벤트 + public static Action OnAddedMoneyCounter; + public static void InvokeAddedMoneyCounter(int money) + { + OnAddedMoneyCounter?.Invoke(money); + } + // 손님의 기다림 게이지를 초기화 시키는 이벤트 public static Action OnGaugeResetCustomers; public static void InvokeGaugeResetCustomers() @@ -228,11 +235,19 @@ namespace BlueWater OnCreateBartenderCrew?.Invoke(); } + // 인게임 UI 최신화 이벤트 public static Action OnUpdateCrewUi; public static void InvokeUpdateCrewUi(int bartenderCount, int serverCount, int cleanerCount) { OnUpdateCrewUi?.Invoke(bartenderCount, serverCount, cleanerCount); } + + // 패시브 카드 (청소 보너스)로 바텐더 제작 속도 증가 이벤트 + public static Action OnCleaningBonus; + public static void InvokeCleaningBonus(int feverTime, float multiply) + { + OnCleaningBonus?.Invoke(feverTime, multiply); + } // Props // 레스토랑을 전부 청소 이벤트 @@ -269,6 +284,27 @@ namespace BlueWater { OnCreateMold?.Invoke(); } + + // 계산대 골드 자동 회수 이벤트 + public static Action OnGainAutoMoneyCounter; + public static void InvokeGainAutoMoneyCounter(int gainWaitTime) + { + OnGainAutoMoneyCounter?.Invoke(gainWaitTime); + } + + // 휴지통이 랜덤한 칵테일로 변하는 패시브 카드 이벤트 + public static Action OnSelectedRandomChangeCard; + public static void InvokeChangeRandomCard() + { + OnSelectedRandomChangeCard?.Invoke(); + } + + // 휴지통이 랜덤한 칵테일로 변하는 패시브 카드 이벤트 + public static Action OnChangedRandomCocktail; + public static void InvokeChangedRandomCocktail(CocktailData changedCocktailData) + { + OnChangedRandomCocktail?.Invoke(changedCocktailData); + } #endregion } diff --git a/Assets/02.Scripts/LocalizationManager.cs b/Assets/02.Scripts/LocalizationManager.cs new file mode 100644 index 000000000..a061c72ea --- /dev/null +++ b/Assets/02.Scripts/LocalizationManager.cs @@ -0,0 +1,62 @@ +using System.Collections; +using Sirenix.OdinInspector; +using UnityEngine.Localization.Settings; + +namespace BlueWater +{ + public enum LocaleType + { + 한국어 = 0, + English = 1 + } + + public class LocalizationManager : Singleton + { + private bool _isChanging; + + private void Start() + { + var index = ES3.Load("Locale", GetCurrentLocaleIndex()); + ChangeLocale((LocaleType)index); + } + + /// + /// 0 - 한국어 + /// 1 - 영어 + /// + /// + [Button("언어 변경")] + public void ChangeLocale(LocaleType localeType) + { + if (_isChanging) return; + + StartCoroutine(ChangeLocaleCoroutine(localeType)); + } + + private IEnumerator ChangeLocaleCoroutine(LocaleType localeType) + { + _isChanging = true; + + yield return LocalizationSettings.InitializationOperation; + LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[(int)localeType]; + ES3.Save("Locale", (int)localeType); + + _isChanging = false; + } + + private int GetCurrentLocaleIndex() + { + var selectedLocale = LocalizationSettings.SelectedLocale; + var locales = LocalizationSettings.AvailableLocales.Locales; + + for (var i = 0; i < locales.Count; i++) + { + if (locales[i] == selectedLocale) + { + return i; + } + } + return -1; + } + } +} diff --git a/Assets/02.Scripts/LocalizationManager.cs.meta b/Assets/02.Scripts/LocalizationManager.cs.meta new file mode 100644 index 000000000..a1b7e3e57 --- /dev/null +++ b/Assets/02.Scripts/LocalizationManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 34c314af086484147ab3b78d4da361a6 \ No newline at end of file diff --git a/Assets/02.Scripts/Prop/Tycoon/Barrel.cs b/Assets/02.Scripts/Prop/Tycoon/Barrel.cs index aa7f9ff71..cfbdb625b 100644 --- a/Assets/02.Scripts/Prop/Tycoon/Barrel.cs +++ b/Assets/02.Scripts/Prop/Tycoon/Barrel.cs @@ -1,5 +1,6 @@ using System; using BlueWater.Items; +using BlueWater.Uis; using Sirenix.OdinInspector; using UnityEngine; @@ -59,7 +60,6 @@ namespace BlueWater.Tycoons EventManager.OnAutoSupplyBarrels += AutoSupply; _liquidImage.sprite = IsActivated ? _liquidData.Sprite : DataManager.Instance.SpriteDataSo.BarrelLock; - InteractionMessage = $"{_liquidData.Name} 따르기"; _instanceMaterial.SetColor(LiquidColorHash, _liquidData.Color * _colorIntensity); } diff --git a/Assets/02.Scripts/Prop/Tycoon/InteractionFuniture.cs b/Assets/02.Scripts/Prop/Tycoon/InteractionFuniture.cs index c07ed1c96..379491b67 100644 --- a/Assets/02.Scripts/Prop/Tycoon/InteractionFuniture.cs +++ b/Assets/02.Scripts/Prop/Tycoon/InteractionFuniture.cs @@ -1,8 +1,10 @@ +using System.Collections; using BlueWater.Interfaces; using BlueWater.Players.Tycoons; using BlueWater.Uis; using Sirenix.OdinInspector; using UnityEngine; +using UnityEngine.Localization.Components; namespace BlueWater.Tycoons { @@ -21,6 +23,9 @@ namespace BlueWater.Tycoons [field: SerializeField, Required, BoxGroup("컴포넌트")] public Material OutlineMaterial { get; private set; } + [field: SerializeField, BoxGroup("컴포넌트")] + public LocalizeStringEvent LocalizeStringEvent { get; protected set; } + [BoxGroup("변수")] [field: SerializeField, BoxGroup("변수")] public bool EnableInteraction { get; private set; } = true; @@ -29,7 +34,7 @@ namespace BlueWater.Tycoons public float InteractionRadius { get; private set; } = 2f; [field: SerializeField, BoxGroup("변수")] - public string InteractionMessage { get; protected set; } + public string InteractionMessage { get; set; } [Title("실시간 데이터")] [SerializeField] @@ -92,7 +97,8 @@ namespace BlueWater.Tycoons } VisualLook = transform.Find("VisualLook").GetComponent(); - InteractionCanvas = transform.GetComponentInChildren(); + InteractionCanvas = transform.Find("InteractionCanvas").GetComponent(); + LocalizeStringEvent = transform.GetComponent(); CurrentTycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; } @@ -146,5 +152,30 @@ namespace BlueWater.Tycoons { IsOpened = false; } + + protected void UpdateLocalizedString(string entryName) + { + if (!LocalizeStringEvent) return; + + LocalizeStringEvent.StringReference.TableReference = "StringDataTable"; + LocalizeStringEvent.StringReference.TableEntryReference = entryName; + + StartCoroutine(LoadLocalizedString()); + } + + protected IEnumerator LoadLocalizedString() + { + var getLocalizedStringOperation = LocalizeStringEvent.StringReference.GetLocalizedStringAsync(); + yield return getLocalizedStringOperation; + + if (getLocalizedStringOperation.IsDone) + { + InteractionMessage = getLocalizedStringOperation.Result; + } + else + { + Debug.LogError("Failed to load localized string."); + } + } } } \ No newline at end of file diff --git a/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs b/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs new file mode 100644 index 000000000..8de595bb8 --- /dev/null +++ b/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs @@ -0,0 +1,165 @@ + +using System; +using System.Collections; +using BlueWater.Uis; +using BlueWater.Utility; +using Sirenix.OdinInspector; +using UnityEngine; + +namespace BlueWater.Tycoons +{ + [Serializable] + public class MoneyCounter : InteractionFurniture + { + [SerializeField] + private float _playerHoldingTime = 3f; + + [SerializeField] + private PayMoneyUi _payMoneyUiObject; + + [SerializeField] + private Vector3 _offset = new(0f, 1.5f, 0f); + + [SerializeField] + private Sprite _empty; + + [SerializeField] + private Sprite _level1; + + [SerializeField] + private Sprite _level2; + + [SerializeField] + private Sprite _level3; + + [field: Title("실시간 데이터")] + [field: SerializeField] + public int CurrentMoney { get; private set; } + + private SpriteRenderer _spriteRenderer; + private Coroutine _gainAutoInstance; + private bool _isPlayerInteracting; + + protected override void Awake() + { + base.Awake(); + + EventManager.OnAddedMoneyCounter += AddCurrentMoney; + EventManager.OnGainAutoMoneyCounter += GainAuto; + } + + protected override void OnEnable() + { + base.OnEnable(); + + Initialize(); + } + + private void Update() + { + if (IsShowing) + { + EventManager.InvokeHoldInteracting(HoldingElapsedTime); + } + + if (HoldingElapsedTime >= 1f) + { + GainMoney(); + } + + if (_isPlayerInteracting) + { + HoldingElapsedTime += Time.deltaTime / _playerHoldingTime; + } + else + { + if (HoldingElapsedTime > 0f) + { + HoldingElapsedTime -= Time.deltaTime; + } + } + } + + private void OnDestroy() + { + if (_gainAutoInstance != null) + { + StopCoroutine(_gainAutoInstance); + _gainAutoInstance = null; + } + + EventManager.OnAddedMoneyCounter -= AddCurrentMoney; + EventManager.OnGainAutoMoneyCounter -= GainAuto; + } + + public void Initialize() + { + _spriteRenderer = VisualLook.GetComponent(); + } + + public override void Interaction() + { + _isPlayerInteracting = true; + } + + public override void CancelInteraction() + { + _isPlayerInteracting = false; + } + + public override bool CanInteraction() + { + return CurrentMoney > 0 && !GameManager.Instance.CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything(); + } + + public void AddCurrentMoney(int money) + { + CurrentMoney += money; + + ChangeSprite(); + } + + private void ChangeSprite() + { + var sprite = CurrentMoney switch + { + > 1000 => _level3, + > 500 => _level2, + > 0 => _level1, + _ => _empty + }; + + _spriteRenderer.sprite = sprite; + } + + public void GainMoney() + { + _isPlayerInteracting = false; + HoldingElapsedTime = 0f; + + var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, + Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); + payMoneyUi.Initialize(CurrentMoney); + CurrentMoney = 0; + ChangeSprite(); + } + + public void GainAuto(int waitTime) + { + Utils.StartUniqueCoroutine(this, ref _gainAutoInstance, GainAutoCoroutine(waitTime)); + } + + private IEnumerator GainAutoCoroutine(int waitTime) + { + while (true) + { + yield return new WaitForSeconds(waitTime); + + if (CurrentMoney > 0) + { + GainMoney(); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs.meta b/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs.meta new file mode 100644 index 000000000..5af1619bc --- /dev/null +++ b/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9750cc69bc8edf74da6603280ffbb977 diff --git a/Assets/02.Scripts/Prop/Tycoon/ServingTable.cs b/Assets/02.Scripts/Prop/Tycoon/ServingTable.cs index 58e2cef3e..76b9788a1 100644 --- a/Assets/02.Scripts/Prop/Tycoon/ServingTable.cs +++ b/Assets/02.Scripts/Prop/Tycoon/ServingTable.cs @@ -93,7 +93,15 @@ namespace BlueWater.Tycoons public override void ShowInteractionUi() { - InteractionMessage = CurrentPickupItem != null ? "음료 들기" : "음료 내려놓기"; + if (CurrentPickupItem != null) + { + UpdateLocalizedString("InteractionServingTablePickUp"); + } + else + { + UpdateLocalizedString("InteractionServingTablePutDown"); + } + base.ShowInteractionUi(); CocktailGlassImage.material = OutlineMaterial; diff --git a/Assets/02.Scripts/Prop/Tycoon/TableSeat.cs b/Assets/02.Scripts/Prop/Tycoon/TableSeat.cs index 544d69906..99bf567f9 100644 --- a/Assets/02.Scripts/Prop/Tycoon/TableSeat.cs +++ b/Assets/02.Scripts/Prop/Tycoon/TableSeat.cs @@ -90,6 +90,11 @@ namespace BlueWater.Tycoons { if (_isPlayerInteracting) { + if (TycoonManager.Instance.TycoonStatus.CurrentPassiveCard == PassiveCard.CleaningBonus) + { + TycoonManager.Instance.TycoonStageController.CleaningBonus(); + } + var tip = (int)(_currentLevelData.Gold * TycoonManager.Instance.TycoonStatus.TipMultiplier); if (tip > 0) { diff --git a/Assets/02.Scripts/Prop/Tycoon/TrashCan.cs b/Assets/02.Scripts/Prop/Tycoon/TrashCan.cs index be8204ff1..31a84870e 100644 --- a/Assets/02.Scripts/Prop/Tycoon/TrashCan.cs +++ b/Assets/02.Scripts/Prop/Tycoon/TrashCan.cs @@ -1,10 +1,104 @@ using BlueWater.Items; +using UnityEngine; namespace BlueWater.Tycoons { public class TrashCan : InteractionFurniture { + [SerializeField] + private float _playerHoldingTime = 1f; + + [SerializeField] + private bool _canRandomChange; + + private SpriteRenderer _spriteRenderer; + private bool _isPlayerInteracting; + private bool _isRandomChange; + private bool _canInteraction = true; + + protected override void Awake() + { + base.Awake(); + + EventManager.OnSelectedRandomChangeCard += SetRandomChange; + } + + private void Update() + { + if (_isRandomChange) + { + if (InteractionCanvas.BalloonUi.IsWaitTimeOver()) + { + _canInteraction = true; + } + } + + if (IsShowing) + { + EventManager.InvokeHoldInteracting(HoldingElapsedTime); + } + + if (HoldingElapsedTime >= 1f) + { + if (_isRandomChange) + { + ChangeRandomCocktail(); + } + else + { + DiscardItem(); + } + } + + if (_isPlayerInteracting) + { + HoldingElapsedTime += Time.deltaTime / _playerHoldingTime; + } + else + { + if (HoldingElapsedTime > 0f) + { + HoldingElapsedTime -= Time.deltaTime; + } + } + } + + private void OnDestroy() + { + EventManager.OnSelectedRandomChangeCard -= SetRandomChange; + } + public override void Interaction() + { + _isPlayerInteracting = true; + } + + public override void CancelInteraction() + { + _isPlayerInteracting = false; + } + + public override bool CanInteraction() + { + return CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything() && + (_isRandomChange && _canInteraction || !_isRandomChange); + } + + public override void ShowInteractionUi() + { + if (_isRandomChange) + { + UpdateLocalizedString("InteractionTrashCanChange"); + } + else + { + UpdateLocalizedString("InteractionTrashCanDiscard"); + } + + base.ShowInteractionUi(); + } + + private void DiscardItem() { CocktailData discardCocktailData = null; if (!CurrentTycoonPlayer.TycoonPickupHandler.IsUnfinishedCocktailPickedUp) @@ -14,11 +108,28 @@ namespace BlueWater.Tycoons } EventManager.InvokeCocktailDiscarded(discardCocktailData, true); + + HoldingElapsedTime = 0f; + _isPlayerInteracting = false; } - - public override bool CanInteraction() + + private void ChangeRandomCocktail() { - return CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything(); + var randomCocktail = TycoonManager.Instance.TycoonIngredientController.GetRandomCocktailData(); + EventManager.InvokeChangedRandomCocktail(randomCocktail); + InteractionCanvas.BalloonUi.OrderItem(DataManager.Instance.SpriteDataSo.Waiting, 0, + TycoonManager.Instance.TycoonStageController.StageDataSo.RandomChangeWaitTime); + + HoldingElapsedTime = 0f; + _canInteraction = false; + _isPlayerInteracting = false; + } + + private void SetRandomChange() + { + if (!_canRandomChange) return; + + _isRandomChange = true; } } } \ No newline at end of file diff --git a/Assets/02.Scripts/ScriptableObject/CardDataTable.asset b/Assets/02.Scripts/ScriptableObject/CardDataTable.asset index 90a56ddba..75a6f2e70 100644 --- a/Assets/02.Scripts/ScriptableObject/CardDataTable.asset +++ b/Assets/02.Scripts/ScriptableObject/CardDataTable.asset @@ -16,7 +16,7 @@ MonoBehaviour: - k__BackingField: HeartSlotPlus k__BackingField: k__BackingField: HeartSlotPlus - k__BackingField: "\uD558\uD2B8 \uD55C\uCE78 \uCD94\uAC00" + k__BackingField: "\uD558\uD2B8 \uD55C\uCE78\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 3 k__BackingField: 5 k__BackingField: 0 @@ -26,7 +26,7 @@ MonoBehaviour: - k__BackingField: HeartRecovery k__BackingField: k__BackingField: HeartRecovery - k__BackingField: "\uD558\uD2B8 \uD55C\uCE78 \uD68C\uBCF5" + k__BackingField: "\uD558\uD2B8 \uD55C\uCE78\uC744 \uD68C\uBCF5\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 0 k__BackingField: 0 @@ -36,7 +36,7 @@ MonoBehaviour: - k__BackingField: FullHeartRecovery k__BackingField: k__BackingField: FullHeartRecovery - k__BackingField: "\uD558\uD2B8 \uC804\uCCB4 \uD68C\uBCF5" + k__BackingField: "\uD558\uD2B8 \uC804\uCCB4\uB97C \uD68C\uBCF5\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 5 k__BackingField: 0 @@ -46,7 +46,7 @@ MonoBehaviour: - k__BackingField: AddLiquidB k__BackingField: k__BackingField: AddLiquidB - k__BackingField: "B \uC220\uC744 4000ml \uCD94\uAC00" + k__BackingField: "B\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -56,7 +56,7 @@ MonoBehaviour: - k__BackingField: AddLiquidC k__BackingField: k__BackingField: AddLiquidC - k__BackingField: "C \uC220\uC744 4000ml \uCD94\uAC00" + k__BackingField: "C\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -66,7 +66,7 @@ MonoBehaviour: - k__BackingField: AddLiquidD k__BackingField: k__BackingField: AddLiquidD - k__BackingField: "D \uC220\uC744 4000ml \uCD94\uAC00" + k__BackingField: "D\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -76,7 +76,7 @@ MonoBehaviour: - k__BackingField: AddLiquidE k__BackingField: k__BackingField: AddLiquidE - k__BackingField: "E \uC220\uC744 4000ml \uCD94\uAC00" + k__BackingField: "E\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -86,7 +86,8 @@ MonoBehaviour: - k__BackingField: AddGarnish1 k__BackingField: k__BackingField: AddGarnish1 - k__BackingField: "1\uBC88 \uAC00\uB2C8\uC26C\uB97C 4000ml \uCD94\uAC00" + k__BackingField: "1\uBC88 \uAC00\uB2C8\uC26C \uC7AC\uB8CC\uB97C + 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -96,7 +97,8 @@ MonoBehaviour: - k__BackingField: AddGarnish2 k__BackingField: k__BackingField: AddGarnish2 - k__BackingField: "2\uBC88 \uAC00\uB2C8\uC26C\uB97C 4000ml \uCD94\uAC00" + k__BackingField: "2\uBC88 \uAC00\uB2C8\uC26C \uC7AC\uB8CC\uB97C + 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -106,7 +108,7 @@ MonoBehaviour: - k__BackingField: AllLiquidAdd k__BackingField: k__BackingField: AllLiquidAdd - k__BackingField: "\uC804\uCCB4 \uC7AC\uB8CC 1000ml \uCD94\uAC00" + k__BackingField: "\uBAA8\uB4E0 \uC220 \uC7AC\uB8CC 1000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 5 k__BackingField: 0 @@ -116,7 +118,7 @@ MonoBehaviour: - k__BackingField: ServerNpcAdd k__BackingField: k__BackingField: ServerNpcAdd - k__BackingField: "\uC11C\uBE59 \uC885\uC5C5\uC6D0 \uCD94\uAC00" + k__BackingField: "\uC11C\uBE59 \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 @@ -126,7 +128,7 @@ MonoBehaviour: - k__BackingField: CleanerNpcAdd k__BackingField: k__BackingField: CleanerNpcAdd - k__BackingField: "\uCCAD\uC18C \uC885\uC5C5\uC6D0 \uCD94\uAC00" + k__BackingField: "\uCCAD\uC18C \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 @@ -136,7 +138,7 @@ MonoBehaviour: - k__BackingField: BartenderNpcAdd k__BackingField: k__BackingField: BartenderNpcAdd - k__BackingField: "\uBC14\uD150\uD130 \uC885\uC5C5\uC6D0 \uCD94\uAC00" + k__BackingField: "\uBC14\uD150\uD130 \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 6 k__BackingField: 5 k__BackingField: 0 @@ -146,8 +148,8 @@ MonoBehaviour: - k__BackingField: SpeedBoost k__BackingField: k__BackingField: SpeedBoost - k__BackingField: "\uD50C\uB808\uC774\uC5B4 \uC774\uB3D9 \uC18D\uB3C4 - 10% \uC99D\uAC00" + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uC758 \uC774\uB3D9\uC18D\uB3C4\uAC00 + 10% \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 5 k__BackingField: 0 @@ -157,7 +159,8 @@ MonoBehaviour: - k__BackingField: ExpBoost k__BackingField: k__BackingField: ExpBoost - k__BackingField: "\uACBD\uD5D8\uCE58 \uD68D\uB4DD 20% \uC99D\uAC00" + k__BackingField: "\uACBD\uD5D8\uCE58 \uD68D\uB4DD\uB7C9\uC774 20% + \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 4 k__BackingField: 0 @@ -167,7 +170,7 @@ MonoBehaviour: - k__BackingField: GoldBoost k__BackingField: k__BackingField: GoldBoost - k__BackingField: "\uACE8\uB4DC \uD68D\uB4DD 20% \uC99D\uAC00" + k__BackingField: "\uACE8\uB4DC \uD68D\uB4DD 20%\uC774 \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 4 k__BackingField: 0 @@ -177,7 +180,7 @@ MonoBehaviour: - k__BackingField: AllCleanUp k__BackingField: k__BackingField: AllCleanUp - k__BackingField: "\uB808\uC2A4\uD1A0\uB791 \uD55C\uBC88\uC5D0 \uCCAD\uC18C" + k__BackingField: "\uB808\uC2A4\uD1A0\uB791\uC744 \uC804\uBD80 \uCCAD\uC18C\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 4 k__BackingField: 0 @@ -188,7 +191,7 @@ MonoBehaviour: k__BackingField: k__BackingField: GaugeReset k__BackingField: "\uBAA8\uB4E0 \uC190\uB2D8\uB4E4\uC758 \uAE30\uB2E4\uB9BC - \uCD08\uAE30\uD654" + \uAC8C\uC774\uC9C0\uB97C \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 0 k__BackingField: 0 @@ -198,7 +201,8 @@ MonoBehaviour: - k__BackingField: DashCooldownReduction k__BackingField: k__BackingField: DashCooldownReduction - k__BackingField: "\uB300\uC2DC \uCFE8\uD0C0\uC784 \uAC10\uC18C" + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uC758 \uB300\uC2DC \uCFE8\uD0C0\uC784\uC774 + 1\uCD08 \uAC10\uC18C\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 4 k__BackingField: 0 @@ -208,7 +212,7 @@ MonoBehaviour: - k__BackingField: TipBoost k__BackingField: k__BackingField: TipBoost - k__BackingField: "\uD301 \uD68D\uB4DD\uB7C9 20% \uC99D\uAC00" + k__BackingField: "\uD301 \uD68D\uB4DD\uB7C9\uC774 20% \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 4 k__BackingField: 0 @@ -218,8 +222,8 @@ MonoBehaviour: - k__BackingField: EndGoldBoost k__BackingField: k__BackingField: EndGoldBoost - k__BackingField: "\uAC8C\uC784 \uC624\uBC84 \uD6C4 \uD68D\uB4DD - \uACE8\uB4DC 10% \uC99D\uAC00" + k__BackingField: "\uAC8C\uC784\uC624\uBC84 \uD6C4 \uD68D\uB4DD + \uACE8\uB4DC\uB7C9\uC774 10% \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 4 k__BackingField: 0 @@ -229,7 +233,7 @@ MonoBehaviour: - k__BackingField: AllCustomerPurification k__BackingField: k__BackingField: AllCustomerPurification - k__BackingField: "\uC190\uB2D8\uB4E4 \uC804\uBD80 \uC815\uD654" + k__BackingField: "\uC190\uB2D8\uB4E4\uC744 \uC804\uBD80 \uC815\uD654\uC2DC\uD0B5\uB2C8\uB2E4." k__BackingField: 0 k__BackingField: 4 k__BackingField: 0 @@ -239,8 +243,8 @@ MonoBehaviour: - k__BackingField: GaugeTimeUp k__BackingField: k__BackingField: GaugeTimeUp - k__BackingField: "\uC190\uB2D8\uB4E4\uC758 \uAE30\uB2E4\uB9BC \uC2DC\uAC04 - 3\uCD08 \uC99D\uAC00" + k__BackingField: "\uC190\uB2D8\uB4E4\uC758 \uAE30\uB2E4\uB9BC \uC2DC\uAC04\uC774 + 3\uCD08 \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 @@ -250,8 +254,8 @@ MonoBehaviour: - k__BackingField: ServerNpcUpgrade k__BackingField: k__BackingField: ServerNpcUpgrade - k__BackingField: "\uC11C\uBE59 \uC885\uC5C5\uC6D0 \uC5C5\uADF8\uB808\uC774\uB4DC - (\uD301 \uD68D\uB4DD \uBE44\uC728 \uC99D\uAC00)" + k__BackingField: "\uC885\uC5C5\uC6D0\uC774 \uC11C\uBE59 \uC911 + \uD301 \uD68D\uB4DD\uB7C9\uC774 20% \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 @@ -261,8 +265,8 @@ MonoBehaviour: - k__BackingField: CleanerNpcUpgrade k__BackingField: k__BackingField: CleanerNpcUpgrade - k__BackingField: "\uCCAD\uC18C \uC885\uC5C5\uC6D0 \uC5C5\uADF8\uB808\uC774\uB4DC - (\uCCAD\uC18C \uC18D\uB3C4 \uC99D\uAC00)" + k__BackingField: "\uC885\uC5C5\uC6D0\uC758 \uCCAD\uC18C \uC2DC\uAC04\uC774 + 1\uCD08 \uAC10\uC18C\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 @@ -272,41 +276,20 @@ MonoBehaviour: - k__BackingField: BartenderNpcUpgrade k__BackingField: k__BackingField: BartenderNpcUpgrade - k__BackingField: "\uBC14\uD150\uD130 \uC885\uC5C5\uC6D0 \uC5C5\uADF8\uB808\uC774\uB4DC - (\uC220 \uC81C\uC870 \uC18D\uB3C4 \uC99D\uAC00)" + k__BackingField: "\uC885\uC5C5\uC6D0\uC758 \uC220 \uC81C\uC870 + \uC18D\uB3C4\uAC00 1\uCD08 \uAC10\uC18C\uD569\uB2C8\uB2E4." k__BackingField: 5 k__BackingField: 5 k__BackingField: 0 k__BackingField: 1 k__BackingField: 300 k__BackingField: {fileID: 0} - - k__BackingField: DoubleServing - k__BackingField: - k__BackingField: DoubleServing - k__BackingField: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC591\uC190\uC5D0 - \uC11C\uBE59 \uAC00\uB2A5" - k__BackingField: 1 - k__BackingField: 2 - k__BackingField: 1 - k__BackingField: 1 - k__BackingField: 1000 - k__BackingField: {fileID: 0} - - k__BackingField: RandomChange - k__BackingField: - k__BackingField: RandomChange - k__BackingField: "\uD734\uC9C0\uD1B5\uC744 \uB79C\uB364 \uC81C\uC870\uD1B5\uC73C\uB85C - \uBCC0\uACBD" - k__BackingField: 1 - k__BackingField: 2 - k__BackingField: 1 - k__BackingField: 1 - k__BackingField: 1000 - k__BackingField: {fileID: 0} - k__BackingField: PassiveMakingBonus k__BackingField: k__BackingField: PassiveMakingBonus - k__BackingField: "\uC220 \uC81C\uC870 \uC131\uACF5 \uC2DC \uACE8\uB4DC - \uCD94\uAC00 \uD68D\uB4DD" + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC220 \uC81C\uC870 + \uC131\uACF5 \uC2DC \uD301 \uD68D\uB4DD\uB7C9\uB9CC\uD07C \uCD94\uAC00\uB85C + \uACE8\uB4DC\uB97C \uD68D\uB4DD\uD569\uB2C8\uB2E4." k__BackingField: 1 k__BackingField: 2 k__BackingField: 1 @@ -316,8 +299,9 @@ MonoBehaviour: - k__BackingField: PassiveServingBonus k__BackingField: k__BackingField: PassiveServingBonus - k__BackingField: "\uC11C\uBE59 3\uBC88 \uC131\uACF5 \uC2DC \uD558\uD2B8 - \uBC18\uAC1C \uD68C\uBCF5" + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC11C\uBE59\uC744 + 3\uBC88 \uC131\uACF5\uD560 \uB54C\uB9C8\uB2E4 \uD558\uD2B8\uB97C \uBC18 \uAC1C + \uD68C\uBCF5\uD569\uB2C8\uB2E4." k__BackingField: 1 k__BackingField: 2 k__BackingField: 1 @@ -327,8 +311,10 @@ MonoBehaviour: - k__BackingField: PassiveCleaningBonus k__BackingField: k__BackingField: PassiveCleaningBonus - k__BackingField: "\uCCAD\uC18C 5\uBC88 \uC131\uACF5 \uC2DC \uBC14\uD150\uB354 - \uC81C\uC870 \uC18D\uB3C4 \uC99D\uAC00" + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uAC00 \uCCAD\uC18C\uB97C + 5\uBC88 \uC131\uACF5\uD560 \uB54C\uB9C8\uB2E4 \uC0C8\uB85C \uC81C\uC791\uB418\uB294 + \uC885\uC5C5\uC6D0\uC758 \uC220 \uC81C\uC870 \uC18D\uB3C4\uB97C 10\uCD08\uAC04 + 2\uBC30\uB85C \uC99D\uAC00\uD569\uB2C8\uB2E4." k__BackingField: 1 k__BackingField: 2 k__BackingField: 1 @@ -338,19 +324,41 @@ MonoBehaviour: - k__BackingField: BarrelAutoSupply k__BackingField: k__BackingField: BarrelAutoSupply - k__BackingField: "\uBAA8\uB4E0 \uC220 \uC7AC\uB8CC \uC790\uB3D9 - \uCDA9\uCC9C (1\uCD08\uC5D0 N\uB9AC\uD130)" + k__BackingField: "\uBAA8\uB4E0 \uC220 \uC7AC\uB8CC\uB97C \uCD08\uB2F9 + 2ml \uCD94\uAC00\uB85C \uC790\uB3D9 \uCDA9\uC804\uD569\uB2C8\uB2E4." k__BackingField: 10 k__BackingField: 5 k__BackingField: 0 k__BackingField: 1 k__BackingField: 1500 k__BackingField: {fileID: 0} - - k__BackingField: GoldAutoGain + - k__BackingField: PassiveDoubleServing k__BackingField: - k__BackingField: GoldAutoGain + k__BackingField: PassiveDoubleServing + k__BackingField: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC591\uC190\uC5D0 + \uC11C\uBE59\uC774 \uAC00\uB2A5\uD574\uC9D1\uB2C8\uB2E4." + k__BackingField: 1 + k__BackingField: 2 + k__BackingField: 1 + k__BackingField: 1 + k__BackingField: 1000 + k__BackingField: {fileID: 0} + - k__BackingField: PassiveRandomChange + k__BackingField: + k__BackingField: PassiveRandomChange + k__BackingField: "\uD2B9\uC815 \uD734\uC9C0\uD1B5\uC5D0\uC11C \uC644\uC131\uB41C + \uCE75\uD14C\uC77C \uC911 \uB79C\uB364\uC73C\uB85C \uBCC0\uACBD \uAC00\uB2A5\uD574\uC9D1\uB2C8\uB2E4." + k__BackingField: 1 + k__BackingField: 2 + k__BackingField: 1 + k__BackingField: 1 + k__BackingField: 1000 + k__BackingField: {fileID: 0} + - k__BackingField: PassiveGoldAutoGain + k__BackingField: + k__BackingField: PassiveGoldAutoGain k__BackingField: "\uC790\uB3D9\uC73C\uB85C 60\uCD08\uB9C8\uB2E4 - \uB3C8\uD1B5\uC758 \uACE8\uB4DC \uD68C\uC218" + \uACC4\uC0B0\uB300\uC758 \uACE8\uB4DC\uB97C \uD68C\uC218\uD569\uB2C8\uB2E4." k__BackingField: 1 k__BackingField: 2 k__BackingField: 1 diff --git a/Assets/02.Scripts/ScriptableObject/SpriteData.asset b/Assets/02.Scripts/ScriptableObject/SpriteData.asset index 5d6188320..9dc39c092 100644 --- a/Assets/02.Scripts/ScriptableObject/SpriteData.asset +++ b/Assets/02.Scripts/ScriptableObject/SpriteData.asset @@ -18,3 +18,4 @@ MonoBehaviour: k__BackingField: {fileID: 21300000, guid: c0cab5e7cc9fc5147b3f0aef86b2feab, type: 3} k__BackingField: {fileID: 21300000, guid: 9e508ffd6f8853c4c8b20b63ad90622d, type: 3} k__BackingField: {fileID: 21300000, guid: e9275315ca60c1f479efa8f9393c7627, type: 3} + k__BackingField: {fileID: 21300000, guid: 1d6e6fd96eb499f42b79f04f3510af87, type: 3} diff --git a/Assets/02.Scripts/SpriteDataSo.cs b/Assets/02.Scripts/SpriteDataSo.cs index bf018fecc..112aa150d 100644 --- a/Assets/02.Scripts/SpriteDataSo.cs +++ b/Assets/02.Scripts/SpriteDataSo.cs @@ -22,5 +22,8 @@ namespace BlueWater [field: SerializeField] public Sprite BartenderTable { get; private set; } + + [field: SerializeField] + public Sprite Waiting { get; private set; } } } \ No newline at end of file diff --git a/Assets/02.Scripts/Tycoon/Liquid.cs b/Assets/02.Scripts/Tycoon/Liquid.cs index a88c220fc..cf4407ab6 100644 --- a/Assets/02.Scripts/Tycoon/Liquid.cs +++ b/Assets/02.Scripts/Tycoon/Liquid.cs @@ -5,6 +5,9 @@ namespace BlueWater.Tycoons { public class Liquid : LiquidIngredient { + [SerializeField] + private float _autoDestroyTime = 2f; + private IObjectPool _managedPool; public void Initialize(Vector3 spawnPosition, Quaternion rotation, Collider2D targetCollider, Vector3 pushForce, Color color) @@ -18,13 +21,22 @@ namespace BlueWater.Tycoons CanInteraction = true; gameObject.SetActive(true); Rigidbody2D.AddForce(pushForce, ForceMode2D.Impulse); + + Invoke(nameof(ReachedObject), _autoDestroyTime); } public void SetManagedPool(IObjectPool pool) => _managedPool = pool; - public void Destroy() => _managedPool.Release(this); + + public void Destroy() + { + CancelInvoke(nameof(ReachedObject)); + _managedPool.Release(this); + } public override void ReachedObject() { + base.ReachedObject(); + CanInteraction = false; Destroy(); } diff --git a/Assets/02.Scripts/Tycoon/LiquidController.cs b/Assets/02.Scripts/Tycoon/LiquidController.cs index 61a5a45f4..b89318b14 100644 --- a/Assets/02.Scripts/Tycoon/LiquidController.cs +++ b/Assets/02.Scripts/Tycoon/LiquidController.cs @@ -154,6 +154,7 @@ namespace BlueWater EventManager.OnCocktailDiscarded += ReleaseAllObject; EventManager.OnPlaceOnServingTable += ReleaseAllObject; EventManager.OnCocktailServedToCustomer += ReleaseAllObject; + EventManager.OnChangedRandomCocktail += ReleaseAllObject; LiquidIngredient.OnReachedTarget += OnTargetReached; Barrel.OnBarrelInteracted += HandleBarrelInteraction; Barrel.OnBarrelCancelInteracted += HandleBarrelCancelInteraction; @@ -228,6 +229,7 @@ namespace BlueWater EventManager.OnCocktailDiscarded -= ReleaseAllObject; EventManager.OnPlaceOnServingTable -= ReleaseAllObject; EventManager.OnCocktailServedToCustomer -= ReleaseAllObject; + EventManager.OnChangedRandomCocktail -= ReleaseAllObject; LiquidIngredient.OnReachedTarget -= OnTargetReached; Barrel.OnBarrelInteracted -= HandleBarrelInteraction; Barrel.OnBarrelCancelInteracted -= HandleBarrelCancelInteraction; @@ -318,22 +320,16 @@ namespace BlueWater HidePanel(); } + public void ReleaseAllObject(CocktailData cocktailData) + { + ReleaseAllObject(); + } + public void ReleaseAllObject(CocktailData cocktailData, bool isServedPlayer) { if (!isServedPlayer) return; - // 리스트 삭제는 뒤에서부터 해야 오류가 없음 - for (var i = _activeLiquidDatas.Count - 1; i >= 0; i--) - { - _activeLiquidDatas[i].Destroy(); - } - - _liquidDataCounts.Clear(); - _isCompleted = false; - _instanceLiquidCount = 0; - _instanceMaterial.SetFloat(LiquidAmountHash, 0f); - SetCurrentAmount(0f); - HidePanel(); + ReleaseAllObject(); } public void HandleBarrelInteraction(Barrel barrel) diff --git a/Assets/02.Scripts/Tycoon/LiquidIngredient.cs b/Assets/02.Scripts/Tycoon/LiquidIngredient.cs index 92ce5d594..beb54bdd9 100644 --- a/Assets/02.Scripts/Tycoon/LiquidIngredient.cs +++ b/Assets/02.Scripts/Tycoon/LiquidIngredient.cs @@ -31,11 +31,13 @@ namespace BlueWater.Tycoons if (distance < _distanceThreshold) { - OnReachedTarget?.Invoke(); ReachedObject(); } } - - public abstract void ReachedObject(); + + public virtual void ReachedObject() + { + OnReachedTarget?.Invoke(); + } } } \ No newline at end of file diff --git a/Assets/02.Scripts/Tycoon/StageDataSo.cs b/Assets/02.Scripts/Tycoon/StageDataSo.cs index b9dff8497..7933a4163 100644 --- a/Assets/02.Scripts/Tycoon/StageDataSo.cs +++ b/Assets/02.Scripts/Tycoon/StageDataSo.cs @@ -22,5 +22,23 @@ namespace BlueWater.Tycoons [field: SerializeField] public int MushroomWaitTime { get; private set; } = 30; + + [field: SerializeField] + public int ServingBonusCount { get; private set; } = 3; + + [field: SerializeField] + public int CleaningBonusCount { get; private set; } = 5; + + [field: SerializeField] + public int CleaningBonusMakingSpeedUpTime { get; private set; } = 10; + + [field: SerializeField] + public float CleaningBonusMakingSpeedMultiply { get; private set; } = 2f; + + [field: SerializeField] + public int AutoGainWaitTime { get; private set; } = 60; + + [field: SerializeField] + public int RandomChangeWaitTime { get; private set; } = 5; } } \ No newline at end of file diff --git a/Assets/02.Scripts/Tycoon/TycoonStageController.cs b/Assets/02.Scripts/Tycoon/TycoonStageController.cs index 57c546f15..7cbd8e98a 100644 --- a/Assets/02.Scripts/Tycoon/TycoonStageController.cs +++ b/Assets/02.Scripts/Tycoon/TycoonStageController.cs @@ -19,16 +19,21 @@ namespace BlueWater.Tycoons public Dictionary InstanceCocktailDatas { get; private set; } = new(); public static int VomitCount; + public int PlayerServingCount; + public int PlayerCleaningCount; private bool _isClosedTime; private TycoonManager _tycoonManager; - private AstarPath _astarPath; private Coroutine _startStageCoroutineInstance; private TimeSpan _closedTime; private void Awake() { - _astarPath = FindAnyObjectByType(); + EventManager.OnInitializedPlayerInput += StartStage; + EventManager.OnMakeCocktailCompleted += AddInstanceCocktail; + EventManager.OnCocktailServedToCustomer += RemoveInstanceCocktail; + EventManager.OnCocktailDiscarded += RemoveInstanceCocktail; + EventManager.OnCreateMushroom += CreateMushroom; } private void Start() @@ -36,12 +41,8 @@ namespace BlueWater.Tycoons _tycoonManager = TycoonManager.Instance; VomitCount = 0; - - EventManager.OnInitializedPlayerInput += StartStage; - EventManager.OnMakeCocktailCompleted += AddInstanceCocktail; - EventManager.OnCocktailServedToCustomer += RemoveInstanceCocktail; - EventManager.OnCocktailDiscarded += RemoveInstanceCocktail; - EventManager.OnCreateMushroom += CreateMushroom; + PlayerServingCount = 0; + PlayerCleaningCount = 0; } private void OnDestroy() @@ -124,5 +125,25 @@ namespace BlueWater.Tycoons var mushroom = Instantiate(_mushroomObject, spawnPosition, _mushroomObject.transform.rotation); mushroom.Initialize(); } + + public void ServingBonus() + { + PlayerServingCount++; + + if (PlayerServingCount < StageDataSo.ServingBonusCount) return; + + PlayerServingCount = 0; + TycoonManager.Instance.TycoonStatus.CurrentPlayerHealth++; + } + + public void CleaningBonus() + { + PlayerCleaningCount++; + + if (PlayerCleaningCount < StageDataSo.CleaningBonusCount) return; + + PlayerCleaningCount = 0; + EventManager.InvokeCleaningBonus(StageDataSo.CleaningBonusMakingSpeedUpTime, StageDataSo.CleaningBonusMakingSpeedMultiply); + } } } \ No newline at end of file diff --git a/Assets/02.Scripts/Tycoon/TycoonStatus.cs b/Assets/02.Scripts/Tycoon/TycoonStatus.cs index b3ef3627f..f32f70bda 100644 --- a/Assets/02.Scripts/Tycoon/TycoonStatus.cs +++ b/Assets/02.Scripts/Tycoon/TycoonStatus.cs @@ -11,9 +11,9 @@ namespace BlueWater.Tycoons DoubleServing = 1, RandomChange = 2, GoldAutoGain = 3, - PassiveMakingBonus = 4, - PassiveServingBonus = 5, - PassiveCleaningBonus = 6 + MakingBonus = 4, + ServingBonus = 5, + CleaningBonus = 6 } [Serializable] diff --git a/Assets/02.Scripts/Ui/Tycoon/BalloonUi.cs b/Assets/02.Scripts/Ui/Tycoon/BalloonUi.cs index d66d28cba..268858ec5 100644 --- a/Assets/02.Scripts/Ui/Tycoon/BalloonUi.cs +++ b/Assets/02.Scripts/Ui/Tycoon/BalloonUi.cs @@ -89,7 +89,7 @@ namespace BlueWater.Uis SetEmpty(); } - public void OrderItem(string itemIdx, int waitTime, int hurryTime) + public void OrderItem(string itemIdx, float waitTime, float hurryTime) { _orderCocktailData = ItemManager.Instance.CocktailDataSo.GetDataByIdx(itemIdx); _isOrdered = true; @@ -100,7 +100,7 @@ namespace BlueWater.Uis SetTween(waitTime, hurryTime); } - public void OrderItem(Sprite sprite, int waitTime, int hurryTime) + public void OrderItem(Sprite sprite, float waitTime, float hurryTime) { _isOrdered = true; _isWaitTimeOver = false; @@ -111,7 +111,7 @@ namespace BlueWater.Uis SetTween(waitTime, hurryTime); } - public void SetTween(int waitTime, int hurryTime) + public void SetTween(float waitTime, float hurryTime) { _tween?.Kill(); _tween = _fillImage.DOFillAmount(1f, hurryTime) diff --git a/Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs b/Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs index 167b78a33..7d59ec363 100644 --- a/Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs +++ b/Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs @@ -3,10 +3,14 @@ using System.Collections; using BlueWater; using BlueWater.Tycoons; using BlueWater.Uis; +using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; using TMPro; using UnityEngine.EventSystems; +using UnityEngine.Localization; +using UnityEngine.Localization.Settings; +using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.Serialization; using UnityEngine.UI; using Object = UnityEngine.Object; @@ -14,9 +18,10 @@ using Object = UnityEngine.Object; public class TycoonCard : MonoBehaviour { private TycoonSelectCard _selectCardUi; - - [field: Title("카드 속성")] - + + [Title("카드 속성")] + [SerializeField] + private TMP_Text _informationText; internal CardData CardDataForIdx; //[field: SerializeField, CLabel("IDX"), ReadOnly] //private string _cardData = "AddAllLiquid"; @@ -49,6 +54,7 @@ public class TycoonCard : MonoBehaviour private RectTransform _rectTransform; private Transform _cardComTransform; private TycoonCardArea _cardArea; + private Coroutine _changedLocaleInstance; private void Awake() { @@ -59,9 +65,9 @@ public class TycoonCard : MonoBehaviour _cardArea = transform.Find("Area").GetComponent(); } - void Start() + private void Start() { - + LocalizationSettings.SelectedLocaleChanged += OnChangedLocale; } private void Update() @@ -70,15 +76,35 @@ public class TycoonCard : MonoBehaviour //카메라 기준 캐릭터의 위치를 가져옴 } + private void OnDestroy() + { + LocalizationSettings.SelectedLocaleChanged -= OnChangedLocale; + } + + private void OnChangedLocale(Locale locale) + { + Utils.StartUniqueCoroutine(this, ref _changedLocaleInstance, ChangeLocaleCoroutine(locale)); + StartCoroutine(ChangeLocaleCoroutine(locale)); + } + + private IEnumerator ChangeLocaleCoroutine(Locale locale) + { + var loadingOperation = Utils.GetTableAsync(); + yield return loadingOperation; + + if (loadingOperation.Status == AsyncOperationStatus.Succeeded) + { + var table = loadingOperation.Result; + var textValue = table.GetEntry(CardDataForIdx.Idx)?.GetLocalizedString(); + _informationText.text = textValue; + } + } + //지정된 IDX값으로 정보값 초기화 public void SetCard(string cardIdx) { CardDataForIdx = TycoonManager.Instance.CardDataSo.GetDataByIdx(cardIdx); - - Transform infoTransform = transform.Find("CardCom/Infomation"); - TextMeshProUGUI infotextComponent = infoTransform.GetComponent(); - infotextComponent.text = CardDataForIdx.ScriptText; - + _informationText.text = Utils.GetLocalizedString(cardIdx); _image.sprite = CardDataForIdx.Sprite; } diff --git a/Assets/02.Scripts/Ui/Tycoon/TycoonSelectCard.cs b/Assets/02.Scripts/Ui/Tycoon/TycoonSelectCard.cs index 1452563b7..87b0dd7f0 100644 --- a/Assets/02.Scripts/Ui/Tycoon/TycoonSelectCard.cs +++ b/Assets/02.Scripts/Ui/Tycoon/TycoonSelectCard.cs @@ -33,7 +33,6 @@ namespace BlueWater.Uis [field: SerializeField, CLabel("업그레이드_스크립트")] private GameObject _upgradePopup; - private void Awake() { EventManager.OnLevelUp += CreateCardEvent; @@ -254,7 +253,7 @@ namespace BlueWater.Uis { EventManager.InvokeAutoSupplyBarrels(); } - _tycoonStatus.BarrelAutoIncrease += 5; + _tycoonStatus.BarrelAutoIncrease += 2; break; case "ServerNpcUpgrade": _tycoonStatus.ServerTipMultiplier += 0.1f; @@ -265,23 +264,25 @@ namespace BlueWater.Uis case "BartenderNpcUpgrade": _tycoonStatus.BartenderMakingReduction += 1; break; - case "DoubleServing": + case "PassiveDoubleServing": _tycoonStatus.CurrentPassiveCard = PassiveCard.DoubleServing; break; - case "RandomChange": + case "PassiveRandomChange": _tycoonStatus.CurrentPassiveCard = PassiveCard.RandomChange; + EventManager.InvokeChangeRandomCard(); break; - case "GoldAutoGain": + case "PassiveGoldAutoGain": _tycoonStatus.CurrentPassiveCard = PassiveCard.GoldAutoGain; + EventManager.InvokeGainAutoMoneyCounter(_tycoonManager.TycoonStageController.StageDataSo.AutoGainWaitTime); break; case "PassiveMakingBonus": - _tycoonStatus.CurrentPassiveCard = PassiveCard.PassiveMakingBonus; + _tycoonStatus.CurrentPassiveCard = PassiveCard.MakingBonus; break; case "PassiveServingBonus": - _tycoonStatus.CurrentPassiveCard = PassiveCard.PassiveServingBonus; + _tycoonStatus.CurrentPassiveCard = PassiveCard.ServingBonus; break; case "PassiveCleaningBonus": - _tycoonStatus.CurrentPassiveCard = PassiveCard.PassiveCleaningBonus; + _tycoonStatus.CurrentPassiveCard = PassiveCard.CleaningBonus; break; default: Debug.Log("Not Found Card : IDX" + currTycoonCard.CardDataForIdx.Idx); return; } diff --git a/Assets/02.Scripts/Ui/Tycoon/Upgrade_Popup.cs b/Assets/02.Scripts/Ui/Tycoon/Upgrade_Popup.cs index 9ac75a3cf..1cdb54137 100644 --- a/Assets/02.Scripts/Ui/Tycoon/Upgrade_Popup.cs +++ b/Assets/02.Scripts/Ui/Tycoon/Upgrade_Popup.cs @@ -55,13 +55,12 @@ public class Upgrade_Popup : PopupUi { switch (int.Parse(currentLevelData.Idx)) { - case 5:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidA").Sprite; break; - case 10:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidB").Sprite; break; - case 15:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidC").Sprite; break; - case 20:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidD").Sprite; break; - case 25:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidE").Sprite; break; - case 30:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("Garnish1").Sprite; break; - case 35:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("Garnish2").Sprite; break; + case 5:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidB").Sprite; break; + case 10:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidC").Sprite; break; + case 15:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidD").Sprite; break; + case 20:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("LiquidE").Sprite; break; + case 25:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("Garnish1").Sprite; break; + case 30:liqueurImage.sprite = ItemManager.Instance.LiquidDataSo.GetDataByIdx("Garnish2").Sprite; break; } diff --git a/Assets/02.Scripts/Utility/Utils.cs b/Assets/02.Scripts/Utility/Utils.cs index 6a3479a91..065b3f358 100644 --- a/Assets/02.Scripts/Utility/Utils.cs +++ b/Assets/02.Scripts/Utility/Utils.cs @@ -3,6 +3,9 @@ using System.Collections; using System.Collections.Generic; using Pathfinding; using UnityEngine; +using UnityEngine.Localization.Settings; +using UnityEngine.Localization.Tables; +using UnityEngine.ResourceManagement.AsyncOperations; using Random = UnityEngine.Random; namespace BlueWater.Utility @@ -90,5 +93,15 @@ namespace BlueWater.Utility // 선택한 노드의 위치 반환 return (Vector3)randomNode.position; } + + public static string GetLocalizedString(string key) + { + return LocalizationSettings.StringDatabase.GetLocalizedString("StringDataTable", key, LocalizationSettings.SelectedLocale); + } + + public static AsyncOperationHandle GetTableAsync() + { + return LocalizationSettings.StringDatabase.GetTableAsync("StringDataTable"); + } } } \ No newline at end of file diff --git a/Assets/03.Images/Props/Furniture/MoneyCounter01.png b/Assets/03.Images/Props/Furniture/MoneyCounter01.png new file mode 100644 index 0000000000000000000000000000000000000000..c848044e961c7507001104d901e82028886a30ba GIT binary patch literal 124720 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 literal 0 HcmV?d00001 diff --git a/Assets/03.Images/Props/Furniture/MoneyCounter01.png.meta b/Assets/03.Images/Props/Furniture/MoneyCounter01.png.meta new file mode 100644 index 000000000..349ff0dde --- /dev/null +++ b/Assets/03.Images/Props/Furniture/MoneyCounter01.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 217c5c30fa315ab4c8e0fe76ef1d18f7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 7 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 512 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/03.Images/Props/Furniture/MoneyCounter02.png b/Assets/03.Images/Props/Furniture/MoneyCounter02.png new file mode 100644 index 0000000000000000000000000000000000000000..68a690dd4e53305636e775d1764be3dc988596e1 GIT binary patch literal 155130 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 z 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

2+QLs5ILSJhu#y& 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 TW8F>}a_(fbVRzhi(qG>yOV vf+7q5c&2dYM`edjfEzrLmgJgIW+{L%+z}-iXk5Mx(3EZdL7N|KJd*ZrY23To literal 0 HcmV?d00001 diff --git a/Assets/03.Images/Props/Furniture/MoneyCounter02.png.meta b/Assets/03.Images/Props/Furniture/MoneyCounter02.png.meta new file mode 100644 index 000000000..1f073b1be --- /dev/null +++ b/Assets/03.Images/Props/Furniture/MoneyCounter02.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: ffbde217e84dd754ab6e6d721618490b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 7 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 512 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/03.Images/Props/Furniture/MoneyCounter03.png b/Assets/03.Images/Props/Furniture/MoneyCounter03.png new file mode 100644 index 0000000000000000000000000000000000000000..c600e3313c08942ec30c915bfb3cbe5c107594a5 GIT binary patch literal 199177 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

oW`rZSy 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 z

2PKxQb1T>RW)4rJgfw@8ef=FdN;5vHH*Fglp`W% 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� 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

7U;-^#O4IHFN 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: 0 k__BackingField: 0 _customerInteractionType: 0 +--- !u!114 &2085349091043731492 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7260635347182713621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 52080177065984 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: -2302002259734456648} + m_TargetAssemblyTypeName: BlueWater.Npcs.Customers.Customer, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!1 &7812544424410854405 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab b/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab index 1dc43c314..e9cd695ed 100644 --- a/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab +++ b/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab @@ -617,6 +617,8 @@ MonoBehaviour: k__BackingField: {fileID: 1674052485383758547} k__BackingField: {fileID: 4836489897218844789} k__BackingField: {fileID: 909302231676134912} + _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} + _offset: {x: 0, y: 1.5, z: 0} --- !u!114 &6662554121718997272 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/05.Prefabs/Managers/LocalizationManager.prefab b/Assets/05.Prefabs/Managers/LocalizationManager.prefab new file mode 100644 index 000000000..a65ad05a7 --- /dev/null +++ b/Assets/05.Prefabs/Managers/LocalizationManager.prefab @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8379768038421875437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9131977339796530822} + - component: {fileID: 8665445414907968758} + m_Layer: 0 + m_Name: LocalizationManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9131977339796530822 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8379768038421875437} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8665445414907968758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8379768038421875437} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 34c314af086484147ab3b78d4da361a6, type: 3} + m_Name: + m_EditorClassIdentifier: + _persistent: 1 diff --git a/Assets/05.Prefabs/Props/Mini/Column 1.prefab.meta b/Assets/05.Prefabs/Managers/LocalizationManager.prefab.meta similarity index 74% rename from Assets/05.Prefabs/Props/Mini/Column 1.prefab.meta rename to Assets/05.Prefabs/Managers/LocalizationManager.prefab.meta index a2c582259..da4154ebd 100644 --- a/Assets/05.Prefabs/Props/Mini/Column 1.prefab.meta +++ b/Assets/05.Prefabs/Managers/LocalizationManager.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b23ca5f12ec57c34aa306900e3450fe1 +guid: 1614514235215fe4b877ab0945881d27 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/05.Prefabs/Maps/Tycoon/NewTycoonMap.prefab b/Assets/05.Prefabs/Maps/Tycoon/NewTycoonMap.prefab index ff4bfee53..a6d8b08b2 100644 --- a/Assets/05.Prefabs/Maps/Tycoon/NewTycoonMap.prefab +++ b/Assets/05.Prefabs/Maps/Tycoon/NewTycoonMap.prefab @@ -5203,6 +5203,7 @@ Transform: - {fileID: 4798925548635759970} - {fileID: 3032369304281183765} - {fileID: 334852209123821565} + - {fileID: 6993580701352060546} m_Father: {fileID: 4449232531499695111} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &8697754653569273504 @@ -6056,6 +6057,10 @@ PrefabInstance: propertyPath: _idx value: Garnish1 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "Garnish1 \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -1.3 @@ -6096,6 +6101,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41099917012992 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: Garnish1 @@ -6266,6 +6275,10 @@ PrefabInstance: propertyPath: _idx value: LiquidD objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidD \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -1.6 @@ -6310,6 +6323,10 @@ PrefabInstance: propertyPath: m_ConstrainProportionsScale value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41096481878016 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: LiquidD @@ -7587,6 +7604,10 @@ PrefabInstance: propertyPath: _idx value: LiquidA objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} propertyPath: m_LocalScale.x value: 5.5 @@ -8818,6 +8839,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 1829148020791446333} m_Modifications: + - target: {fileID: -8278684978296943735, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} + propertyPath: _canRandomChange + value: 1 + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: f0b7d93a3fd80be429e7fdac2a2cce39, type: 3} propertyPath: m_LocalScale.x value: 0.7 @@ -11809,6 +11834,10 @@ PrefabInstance: propertyPath: _idx value: LiquidC objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidC \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 4.5 @@ -11849,6 +11878,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41088755970048 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: LiquidC @@ -12743,6 +12776,10 @@ PrefabInstance: propertyPath: _idx value: LiquidB objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidB \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -2.4 @@ -12783,6 +12820,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41071488020480 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: LiquidB @@ -13317,6 +13358,10 @@ PrefabInstance: propertyPath: _idx value: LiquidE objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidE \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 3.8 @@ -13357,6 +13402,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41098067324928 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: LiquidE @@ -14000,6 +14049,68 @@ Transform: m_CorrespondingSourceObject: {fileID: 1061695247072719575, guid: 28c8f2cd9a2817345b5d1fe15e1bebd3, type: 3} m_PrefabInstance: {fileID: 7582115575141085924} m_PrefabAsset: {fileID: 0} +--- !u!1001 &7652502438688209504 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1402113424960589398} + m_Modifications: + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalPosition.x + value: 2.9500003 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalPosition.z + value: -11.95 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5897095096647521783, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + propertyPath: m_Name + value: MoneyCounter + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} +--- !u!4 &6993580701352060546 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 809828747251277026, guid: 9e5375e8c94af9f49a9661227294f024, type: 3} + m_PrefabInstance: {fileID: 7652502438688209504} + m_PrefabAsset: {fileID: 0} --- !u!1001 &7689873542727583674 PrefabInstance: m_ObjectHideFlags: 0 @@ -14361,6 +14472,10 @@ PrefabInstance: propertyPath: _idx value: Garnish2 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "Garnish2 \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 3.6 @@ -14401,6 +14516,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 1653087204473300138, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: m_StringReference.m_TableEntryReference.m_KeyId + value: 41100923645952 + objectReference: {fileID: 0} - target: {fileID: 5897095096647521783, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_Name value: Garnish2 diff --git a/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 2.prefab b/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 2.prefab index 1abee38bd..dc129f41c 100644 --- a/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 2.prefab +++ b/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 2.prefab @@ -5923,7 +5923,6 @@ Transform: - {fileID: 3965676124384496161} - {fileID: 7992502685712917166} - {fileID: 7326867266483086187} - - {fileID: 889899601421890047} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &9067969438214262816 @@ -6441,6 +6440,10 @@ PrefabInstance: propertyPath: _idx value: Garnish1 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -5.63 @@ -6853,6 +6856,10 @@ PrefabInstance: propertyPath: _idx value: LiquidD objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -4.48 @@ -8503,6 +8510,10 @@ PrefabInstance: propertyPath: _idx value: LiquidA objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -13267,6 +13278,10 @@ PrefabInstance: propertyPath: _idx value: LiquidC objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 3.19 @@ -13967,6 +13982,10 @@ PrefabInstance: propertyPath: _idx value: LiquidB objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -3.2 @@ -14581,88 +14600,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 6457232975130062969, guid: 76b794a931e63304f88a6cb498795c4c, type: 3} m_PrefabInstance: {fileID: 6358444859538525529} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6499337379013114210 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 2700294535905665279} - m_Modifications: - - target: {fileID: 652625962474261424, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: 'm_Materials.Array.data[0]' - value: - objectReference: {fileID: 2100000, guid: 470021da37a3b244ab004fb80b151574, type: 2} - - target: {fileID: 900825868516819336, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_Name - value: WallBar - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.y - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.x - value: -4.866 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -5.46 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -0.011 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ba2f04db324864e48936c27164f91e49, type: 3} ---- !u!4 &889899601421890047 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - m_PrefabInstance: {fileID: 6499337379013114210} - m_PrefabAsset: {fileID: 0} --- !u!1001 &6526153460580896826 PrefabInstance: m_ObjectHideFlags: 0 @@ -15091,6 +15028,10 @@ PrefabInstance: propertyPath: _idx value: LiquidE objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 4.54 @@ -16702,6 +16643,10 @@ PrefabInstance: propertyPath: _idx value: Garnish2 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 5.6 diff --git a/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 3.prefab b/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 3.prefab index b38a3eba0..6a7a4f724 100644 --- a/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 3.prefab +++ b/Assets/05.Prefabs/Maps/Tycoon/TycoonMap 3.prefab @@ -3924,7 +3924,6 @@ Transform: - {fileID: 9018991239389689224} - {fileID: 5417258537655965207} - {fileID: 6259194641275220530} - - {fileID: 889899601421890047} m_Father: {fileID: 4449232531499695111} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6100274519667895078 @@ -7241,6 +7240,10 @@ PrefabInstance: propertyPath: _idx value: LiquidD objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: -0.47000015 @@ -8541,6 +8544,10 @@ PrefabInstance: propertyPath: _idx value: LiquidA objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} propertyPath: m_LocalScale.x value: 5.5 @@ -13593,6 +13600,10 @@ PrefabInstance: propertyPath: _idx value: LiquidC objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 7.33 @@ -14449,6 +14460,10 @@ PrefabInstance: propertyPath: _idx value: LiquidB objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 1.8479998 @@ -14869,104 +14884,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 6457232975130062969, guid: 76b794a931e63304f88a6cb498795c4c, type: 3} m_PrefabInstance: {fileID: 6358444859538525529} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6499337379013114210 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 7906693004392999617} - m_Modifications: - - target: {fileID: 652625962474261424, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: 'm_Materials.Array.data[0]' - value: - objectReference: {fileID: 2100000, guid: 470021da37a3b244ab004fb80b151574, type: 2} - - target: {fileID: 900825868516819336, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_Name - value: WallBar - objectReference: {fileID: 0} - - target: {fileID: 900825868516819336, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.y - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.x - value: -5.57 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.y - value: -0.15 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -5.65 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -0.011 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.w - value: 0.9063079 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.x - value: 0.42261827 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 50 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ba2f04db324864e48936c27164f91e49, type: 3} ---- !u!4 &889899601421890047 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - m_PrefabInstance: {fileID: 6499337379013114210} - m_PrefabAsset: {fileID: 0} --- !u!1001 &6526153460580896826 PrefabInstance: m_ObjectHideFlags: 0 @@ -15419,6 +15336,10 @@ PrefabInstance: propertyPath: _idx value: LiquidE objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalPosition.x value: 9.32 diff --git a/Assets/05.Prefabs/Maps/Tycoon/TycoonMapUpsideDown.prefab b/Assets/05.Prefabs/Maps/Tycoon/TycoonMapUpsideDown.prefab index f3138df02..5a08a728d 100644 --- a/Assets/05.Prefabs/Maps/Tycoon/TycoonMapUpsideDown.prefab +++ b/Assets/05.Prefabs/Maps/Tycoon/TycoonMapUpsideDown.prefab @@ -3827,7 +3827,6 @@ Transform: - {fileID: 468591085198452646} - {fileID: 4430136714909607311} - {fileID: 6259194641275220530} - - {fileID: 889899601421890047} m_Father: {fileID: 4449232531499695111} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6100274519667895078 @@ -6205,6 +6204,10 @@ PrefabInstance: propertyPath: _idx value: Garnish1 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 @@ -6629,6 +6632,10 @@ PrefabInstance: propertyPath: _idx value: LiquidD objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 @@ -8073,6 +8080,10 @@ PrefabInstance: propertyPath: _idx value: LiquidA objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: a95c8459c64ddc0429e25ed5876f2120, type: 3} propertyPath: m_LocalScale.x value: 4.62114 @@ -12171,6 +12182,10 @@ PrefabInstance: propertyPath: _idx value: LiquidC objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 @@ -12887,6 +12902,10 @@ PrefabInstance: propertyPath: _idx value: LiquidB objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 @@ -13365,92 +13384,6 @@ Transform: m_CorrespondingSourceObject: {fileID: 6457232975130062969, guid: 76b794a931e63304f88a6cb498795c4c, type: 3} m_PrefabInstance: {fileID: 6358444859538525529} m_PrefabAsset: {fileID: 0} ---- !u!1001 &6499337379013114210 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 7906693004392999617} - m_Modifications: - - target: {fileID: 652625962474261424, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: 'm_Materials.Array.data[0]' - value: - objectReference: {fileID: 2100000, guid: 470021da37a3b244ab004fb80b151574, type: 2} - - target: {fileID: 900825868516819336, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_Name - value: WallBar - objectReference: {fileID: 0} - - target: {fileID: 900825868516819336, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.x - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.y - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalScale.z - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.x - value: -4.866 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -5.46 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.x - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.y - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalRotation.z - value: -0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6882913462236487221, guid: ba2f04db324864e48936c27164f91e49, type: 3} - propertyPath: m_LocalPosition.z - value: -0.011 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ba2f04db324864e48936c27164f91e49, type: 3} ---- !u!4 &889899601421890047 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 6227288689240557725, guid: ba2f04db324864e48936c27164f91e49, type: 3} - m_PrefabInstance: {fileID: 6499337379013114210} - m_PrefabAsset: {fileID: 0} --- !u!1001 &6526153460580896826 PrefabInstance: m_ObjectHideFlags: 0 @@ -13887,6 +13820,10 @@ PrefabInstance: propertyPath: _idx value: LiquidE objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 @@ -15370,6 +15307,10 @@ PrefabInstance: propertyPath: _idx value: Garnish2 objectReference: {fileID: 0} + - target: {fileID: 223172209862223209, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} + propertyPath: k__BackingField + value: "LiquidA \uB530\uB974\uAE30" + objectReference: {fileID: 0} - target: {fileID: 809828747251277026, guid: 224465767a13abb44b0d3adb16ca76c1, type: 3} propertyPath: m_LocalScale.x value: 2.31057 diff --git a/Assets/05.Prefabs/Particles/PayMoneyParticle.prefab b/Assets/05.Prefabs/Particles/PayMoneyParticle.prefab index 131fa0e49..288b2be9a 100644 --- a/Assets/05.Prefabs/Particles/PayMoneyParticle.prefab +++ b/Assets/05.Prefabs/Particles/PayMoneyParticle.prefab @@ -43,7 +43,7 @@ ParticleSystem: serializedVersion: 8 lengthInSec: 3 simulationSpeed: 1 - stopAction: 0 + stopAction: 2 cullingMode: 0 ringBufferMode: 0 ringBufferLoopRange: {x: 0, y: 1} diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/BartenderTable02.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/BartenderTable02.prefab index 22e61c8d4..69d874b7a 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/BartenderTable02.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/BartenderTable02.prefab @@ -263,6 +263,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 4366825669518001782} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 3330559944751018385} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!4 &203741387490724426 stripped Transform: @@ -295,11 +298,52 @@ MonoBehaviour: k__BackingField: {fileID: 6077686033771388879} k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 3330559944751018385} k__BackingField: 1 k__BackingField: 0.7 k__BackingField: IsOpened: 0 CocktailGlassImage: {fileID: 535721072425912087} +--- !u!114 &3330559944751018385 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 49661431001088 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4366825669518001782} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab index f6f0736b1..98378d929 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/CustomerTable3.prefab @@ -10,6 +10,7 @@ GameObject: m_Component: - component: {fileID: 7272068659984017056} - component: {fileID: 6277647266874368514} + - component: {fileID: 3964937737965122596} m_Layer: 8 m_Name: TableSeat02 m_TagString: Untagged @@ -54,7 +55,7 @@ MonoBehaviour: k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 k__BackingField: 0.6 - k__BackingField: Cleaning up table + k__BackingField: IsOpened: 0 _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} _offset: {x: 0, y: 1.5, z: 0} @@ -67,6 +68,46 @@ MonoBehaviour: TableNumber: 0 _playerHoldingTime: 3 _crewHoldingTime: 9 +--- !u!114 &3964937737965122596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 321954324799972663} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 42907288743936 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 6277647266874368514} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!1 &1352874222752200122 GameObject: m_ObjectHideFlags: 0 @@ -338,6 +379,7 @@ GameObject: m_Component: - component: {fileID: 1796875075399045521} - component: {fileID: 6383913593085221228} + - component: {fileID: 4593866383055317665} m_Layer: 8 m_Name: TableSeat01 m_TagString: Untagged @@ -382,7 +424,7 @@ MonoBehaviour: k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 k__BackingField: 0.6 - k__BackingField: Cleaning up table + k__BackingField: IsOpened: 0 _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} _offset: {x: 0, y: 1.5, z: 0} @@ -395,6 +437,46 @@ MonoBehaviour: TableNumber: 0 _playerHoldingTime: 3 _crewHoldingTime: 9 +--- !u!114 &4593866383055317665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5899113663160612507} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 42907288743936 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 6277647266874368514} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!1 &6493535781353555306 GameObject: m_ObjectHideFlags: 0 @@ -892,7 +974,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 353433a78f14e1b42bef6e12dd1f5700, type: 3} m_Name: m_EditorClassIdentifier: - _carpetObject: {fileID: 0} _tableSeats: - {fileID: 6383913593085221228} - {fileID: 6277647266874368514} diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidBarrel01.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidBarrel01.prefab index 846f79f19..755413d00 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidBarrel01.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidBarrel01.prefab @@ -533,6 +533,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 223172209862223209} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 1653087204473300138} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!4 &203741387490724426 stripped Transform: @@ -558,12 +561,15 @@ MonoBehaviour: m_EditorClassIdentifier: k__BackingField: {fileID: 5927803667513949971} k__BackingField: {fileID: 6077686033771388879} - k__BackingField: {fileID: 8975593228546502023} + k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 1653087204473300138} k__BackingField: 1 k__BackingField: 0.8 k__BackingField: IsOpened: 0 + _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} + _offset: {x: 0, y: 1.5, z: 0} _liquidImage: {fileID: 6817574259189873408} _fill: {fileID: 7052380446467937511} _colorIntensity: 2 @@ -577,6 +583,54 @@ MonoBehaviour: k__BackingField: {r: 0, g: 0, b: 0, a: 0} k__BackingField: 0 k__BackingField: 0 + k__BackingField: 0 +--- !u!114 &1653087204473300138 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 34976455471104 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: + - name: global + variable: + rid: 5889118636641091760 + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 223172209862223209} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 1 + references: + version: 2 + RefIds: + - rid: 5889118636641091760 + type: {class: NestedVariablesGroup, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: {fileID: 11400000, guid: f81887433cf7f6c4a991e214ea0eda59, type: 2} --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} @@ -587,8 +641,14 @@ SpriteRenderer: m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} ---- !u!223 &8975593228546502023 stripped -Canvas: - m_CorrespondingSourceObject: {fileID: 1830317875510668177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidStatue.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidStatue.prefab index c68da4844..2827123d4 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidStatue.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/LiquidStatue.prefab @@ -259,7 +259,7 @@ SpriteRenderer: m_Size: {x: 1, y: 1} m_AdaptiveModeThreshold: 0.5 m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 + m_WasSpriteAssigned: 0 m_MaskInteraction: 0 m_SpriteSortPoint: 0 --- !u!1001 &7343451337687172630 @@ -391,6 +391,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 223172209862223209} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 7967298876764243330} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!4 &203741387490724426 stripped Transform: @@ -416,12 +419,15 @@ MonoBehaviour: m_EditorClassIdentifier: k__BackingField: {fileID: 5927803667513949971} k__BackingField: {fileID: 6077686033771388879} - k__BackingField: {fileID: 8975593228546502023} + k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 7967298876764243330} k__BackingField: 1 k__BackingField: 0.8 k__BackingField: IsOpened: 0 + _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} + _offset: {x: 0, y: 1.5, z: 0} _liquidImage: {fileID: 6817574259189873408} _fill: {fileID: 7052380446467937511} _colorIntensity: 2 @@ -434,7 +440,55 @@ MonoBehaviour: k__BackingField: {fileID: 0} k__BackingField: {r: 0, g: 0, b: 0, a: 0} k__BackingField: 0 - _isActivated: 0 + k__BackingField: 0 + k__BackingField: 0 +--- !u!114 &7967298876764243330 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 34976455471104 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: + - name: global + variable: + rid: 5889118636641091760 + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 223172209862223209} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 1 + references: + version: 2 + RefIds: + - rid: 5889118636641091760 + type: {class: NestedVariablesGroup, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: {fileID: 11400000, guid: f81887433cf7f6c4a991e214ea0eda59, type: 2} --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} @@ -445,8 +499,14 @@ SpriteRenderer: m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} ---- !u!223 &8975593228546502023 stripped -Canvas: - m_CorrespondingSourceObject: {fileID: 1830317875510668177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab new file mode 100644 index 000000000..8c98060a0 --- /dev/null +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab @@ -0,0 +1,267 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7343451337687172630 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1180174675498993111, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 2106642157007834423, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.z + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_AnchoredPosition.y + value: 80 + objectReference: {fileID: 0} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 3da5d6eace330f04397ef9c546a69ced, type: 3} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_SortingOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_WasSpriteAssigned + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + - target: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Name + value: MoneyCounter + objectReference: {fileID: 0} + - target: {fileID: 5024482427928425524, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5953080908505751474, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: a327d1fc80d90bd438cfcd1ad2b219c7, type: 3} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.b + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.g + value: 0.026785713 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.r + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillAmount + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillMethod + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillOrigin + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7122983875714221022, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7438534416270888028, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8780093359852370517, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b93d1d9adc811a74fb4192ade70fd3cc, type: 3} + - target: {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 3da5d6eace330f04397ef9c546a69ced, type: 3} + - target: {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_WasSpriteAssigned + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 1580388353006505547} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 2621544615787308462} + m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!1 &5897095096647521783 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1580388353006505547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9750cc69bc8edf74da6603280ffbb977, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 5927803667513949971} + k__BackingField: {fileID: 6077686033771388879} + k__BackingField: {fileID: 6533109861150454071} + k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: 1 + k__BackingField: 0.8 + k__BackingField: + IsOpened: 0 + _playerHoldingTime: 3 + _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} + _offset: {x: 0, y: 1.5, z: 0} + _empty: {fileID: 21300000, guid: 3da5d6eace330f04397ef9c546a69ced, type: 3} + _level1: {fileID: 21300000, guid: 217c5c30fa315ab4c8e0fe76ef1d18f7, type: 3} + _level2: {fileID: 21300000, guid: ffbde217e84dd754ab6e6d721618490b, type: 3} + _level3: {fileID: 21300000, guid: 5c3538f8606c62847a8dfd21aa39a2fe, type: 3} + k__BackingField: 0 +--- !u!114 &2621544615787308462 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 43510928781312 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1580388353006505547} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] +--- !u!4 &5927803667513949971 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!212 &6077686033771388879 stripped +SpriteRenderer: + m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Mini/Column.prefab.meta b/Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab.meta similarity index 74% rename from Assets/05.Prefabs/Props/Mini/Column.prefab.meta rename to Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab.meta index bd524c8f9..34564fc5a 100644 --- a/Assets/05.Prefabs/Props/Mini/Column.prefab.meta +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/MoneyCounter.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dfa7ae42d29c44044a8bca8e68c9db21 +guid: 9e5375e8c94af9f49a9661227294f024 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/Mushroom.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/Mushroom.prefab index 7dd882106..8a0b3efb9 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/Mushroom.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/Mushroom.prefab @@ -12,10 +12,6 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.x value: 40 objectReference: {fileID: 0} - - target: {fileID: 1702261025824090784, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} - propertyPath: m_SortingOrder - value: 3 - objectReference: {fileID: 0} - target: {fileID: 2106642157007834423, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_IsActive value: 1 @@ -44,6 +40,10 @@ PrefabInstance: propertyPath: m_Sprite value: objectReference: {fileID: 21300000, guid: 9b1a96853ff579e448f90dd066ea0eb0, type: 3} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_SortingOrder + value: 5 + objectReference: {fileID: 0} - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_WasSpriteAssigned value: 1 @@ -171,6 +171,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 9017181398980009727} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 9176172352370892430} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!1 &5897095096647521783 stripped GameObject: @@ -195,9 +198,49 @@ MonoBehaviour: k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 k__BackingField: 0.6 - k__BackingField: Cleaning up mushroom + k__BackingField: IsOpened: 0 _playerHoldingTime: 3 +--- !u!114 &9176172352370892430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 43158066180096 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9017181398980009727} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/Pump.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/Pump.prefab index 629f76515..0064e254d 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/Pump.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/Pump.prefab @@ -176,6 +176,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 2713540284264789073} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 2898669091630925434} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!1 &5897095096647521783 stripped GameObject: @@ -198,15 +201,55 @@ MonoBehaviour: k__BackingField: {fileID: 6077686033771388879} k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 0} k__BackingField: 1 k__BackingField: 1 k__BackingField: "\uD38C\uD504 \uC791\uB3D9" IsOpened: 0 _interactionHoldingTime: 1 _pumpingMessageObject: {fileID: 7690724424382746193, guid: 206dfaa20a9d03d40a76e55ba01170c8, type: 3} - _instanceLocation: {fileID: 0} _offset: {x: 0, y: 1.5, z: 0} addedLiquid: 400 +--- !u!114 &2898669091630925434 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 53404088152064 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2713540284264789073} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab new file mode 100644 index 000000000..75d64423b --- /dev/null +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab @@ -0,0 +1,204 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7343451337687172630 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1180174675498993111, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 2106642157007834423, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.z + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_AnchoredPosition.y + value: 80 + objectReference: {fileID: 0} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} + - target: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_WasSpriteAssigned + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Name + value: RandomChangeTrashCan + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} + - target: {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_WasSpriteAssigned + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 2724648112398126851} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 5411673223561907087} + m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!1 &5897095096647521783 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2724648112398126851 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfafa6669b5fa8a48b8e610286e1a192, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: {fileID: 5927803667513949971} + k__BackingField: {fileID: 6077686033771388879} + k__BackingField: {fileID: 6533109861150454071} + k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 5411673223561907087} + k__BackingField: 1 + k__BackingField: 0.7 + k__BackingField: + IsOpened: 0 +--- !u!114 &5411673223561907087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] +--- !u!4 &5927803667513949971 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!212 &6077686033771388879 stripped +SpriteRenderer: + m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + m_PrefabInstance: {fileID: 7343451337687172630} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Mini/NPCTable.prefab.meta b/Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab.meta similarity index 74% rename from Assets/05.Prefabs/Props/Mini/NPCTable.prefab.meta rename to Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab.meta index 0637833e4..f25b18b5f 100644 --- a/Assets/05.Prefabs/Props/Mini/NPCTable.prefab.meta +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/RandomChangeTrashCan.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 094fc2c5e04bd7f4cafd9d08a9c5e15d +guid: eaa55356a4b11e047a47332f0d6a9d1a PrefabImporter: externalObjects: {} userData: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/ServingTable02.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/ServingTable02.prefab index aff595ff9..f7348406e 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/ServingTable02.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/ServingTable02.prefab @@ -225,6 +225,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 5584299599595477975} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 2690585816417773486} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!4 &203741387490724426 stripped Transform: @@ -250,13 +253,42 @@ MonoBehaviour: m_EditorClassIdentifier: k__BackingField: {fileID: 5927803667513949971} k__BackingField: {fileID: 6077686033771388879} - k__BackingField: {fileID: 8975593228546502023} + k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 2690585816417773486} k__BackingField: 1 k__BackingField: 0.7 k__BackingField: IsOpened: 0 CocktailGlassImage: {fileID: 535721072425912087} +--- !u!114 &2690585816417773486 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} @@ -267,8 +299,14 @@ SpriteRenderer: m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} ---- !u!223 &8975593228546502023 stripped -Canvas: - m_CorrespondingSourceObject: {fileID: 1830317875510668177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/TrashCan.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/TrashCan.prefab index 2753a390c..cb6b87ca7 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/TrashCan.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/TrashCan.prefab @@ -14,7 +14,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2106642157007834423, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_IsActive - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 2301048832536013177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_LocalScale.x @@ -44,6 +44,38 @@ PrefabInstance: propertyPath: m_Name value: TrashCan objectReference: {fileID: 0} + - target: {fileID: 5953080908505751474, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: a327d1fc80d90bd438cfcd1ad2b219c7, type: 3} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.b + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.g + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Color.r + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillAmount + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillMethod + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 6365458266480896368, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_FillOrigin + value: 2 + objectReference: {fileID: 0} - target: {fileID: 7986070582027999988, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_LocalScale.x value: 1 @@ -96,6 +128,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 8780093359852370517, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: b93d1d9adc811a74fb4192ade70fd3cc, type: 3} - target: {fileID: 9047629830516719732, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} propertyPath: m_Sprite value: @@ -111,6 +147,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: -8278684978296943735} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 5411673223561907087} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!1 &5897095096647521783 stripped GameObject: @@ -131,12 +170,43 @@ MonoBehaviour: m_EditorClassIdentifier: k__BackingField: {fileID: 5927803667513949971} k__BackingField: {fileID: 6077686033771388879} - k__BackingField: {fileID: 8975593228546502023} + k__BackingField: {fileID: 6533109861150454071} k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} + k__BackingField: {fileID: 5411673223561907087} k__BackingField: 1 k__BackingField: 0.7 - k__BackingField: "\uC4F0\uB808\uAE30 \uBC84\uB9AC\uAE30" + k__BackingField: IsOpened: 0 + _playerHoldingTime: 1 + _canRandomChange: 0 +--- !u!114 &5411673223561907087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: [] + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} @@ -147,8 +217,14 @@ SpriteRenderer: m_CorrespondingSourceObject: {fileID: 3580758810857167321, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} ---- !u!223 &8975593228546502023 stripped -Canvas: - m_CorrespondingSourceObject: {fileID: 1830317875510668177, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} +--- !u!114 &6533109861150454071 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4558604739080582945, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} m_PrefabInstance: {fileID: 7343451337687172630} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ebe6250da0dfa044937230037499988, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/05.Prefabs/Props/Furniture/Interactions/Vomiting.prefab b/Assets/05.Prefabs/Props/Furniture/Interactions/Vomiting.prefab index a1623f769..000d8ffd1 100644 --- a/Assets/05.Prefabs/Props/Furniture/Interactions/Vomiting.prefab +++ b/Assets/05.Prefabs/Props/Furniture/Interactions/Vomiting.prefab @@ -183,6 +183,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} insertIndex: -1 addedObject: {fileID: 7264946127367919962} + - targetCorrespondingSourceObject: {fileID: 3764902268943045601, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} + insertIndex: -1 + addedObject: {fileID: 1488784826241318952} m_SourcePrefab: {fileID: 100100000, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} --- !u!1 &5897095096647521783 stripped GameObject: @@ -207,12 +210,52 @@ MonoBehaviour: k__BackingField: {fileID: 2100000, guid: 9db92b3ac1f276e42ae7d7bcfbbca549, type: 2} k__BackingField: 1 k__BackingField: 0.5 - k__BackingField: Cleaning up vomiting + k__BackingField: IsOpened: 0 _payMoneyUiObject: {fileID: 1722793422445764049, guid: d89dc1946bb6ee448a113d28d6bf2dce, type: 3} _offset: {x: 0, y: 1.5, z: 0} _playerHoldingTime: 3 _crewHoldingTime: 9 +--- !u!114 &1488784826241318952 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897095096647521783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56eb0353ae6e5124bb35b17aff880f16, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StringReference: + m_TableReference: + m_TableCollectionName: GUID:0f00ef9cea8f57e4e952e1881becfed7 + m_TableEntryReference: + m_KeyId: 42020407357440 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_FormatArguments: [] + m_UpdateString: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7264946127367919962} + m_TargetAssemblyTypeName: BlueWater.Tycoons.InteractionFurniture, Assembly-CSharp + m_MethodName: set_InteractionMessage + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] --- !u!4 &5927803667513949971 stripped Transform: m_CorrespondingSourceObject: {fileID: 4011269187381704965, guid: 3f9f846a7f237924e97c9acf370d991d, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/Barrel.prefab b/Assets/05.Prefabs/Props/Mini/Barrel.prefab deleted file mode 100644 index e72077bd7..000000000 --- a/Assets/05.Prefabs/Props/Mini/Barrel.prefab +++ /dev/null @@ -1,71 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &8250971885031797383 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 652625962474261424, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 9f7d82fbc664fbb4d98842fc46db319d, type: 3} - - target: {fileID: 900825868516819336, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Name - value: Barrel - objectReference: {fileID: 0} - - target: {fileID: 4985587680422744605, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 9f7d82fbc664fbb4d98842fc46db319d, type: 3} - - target: {fileID: 5603748789724571281, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Size.x - value: 0.7 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/Column 1.prefab b/Assets/05.Prefabs/Props/Mini/Column 1.prefab deleted file mode 100644 index a9597c5e1..000000000 --- a/Assets/05.Prefabs/Props/Mini/Column 1.prefab +++ /dev/null @@ -1,67 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &3546911982502979613 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 652625962474261424, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: f4c17f53385195f4e98fdf1f0da515d3, type: 3} - - target: {fileID: 900825868516819336, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Name - value: Column 1 - objectReference: {fileID: 0} - - target: {fileID: 4985587680422744605, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: f4c17f53385195f4e98fdf1f0da515d3, type: 3} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/Column.prefab b/Assets/05.Prefabs/Props/Mini/Column.prefab deleted file mode 100644 index fb744c150..000000000 --- a/Assets/05.Prefabs/Props/Mini/Column.prefab +++ /dev/null @@ -1,75 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &2044797857068986449 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 652625962474261424, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 06a2c6aed62612e41ad12d29e64f669e, type: 3} - - target: {fileID: 652625962474261424, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 900825868516819336, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Name - value: Column - objectReference: {fileID: 0} - - target: {fileID: 4985587680422744605, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 06a2c6aed62612e41ad12d29e64f669e, type: 3} - - target: {fileID: 4985587680422744605, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/NPCTable.prefab b/Assets/05.Prefabs/Props/Mini/NPCTable.prefab deleted file mode 100644 index 8b4b8f910..000000000 --- a/Assets/05.Prefabs/Props/Mini/NPCTable.prefab +++ /dev/null @@ -1,67 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &8805598650455662079 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 652625962474261424, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 702bd7ea217003e47be28d81a79dd99c, type: 3} - - target: {fileID: 900825868516819336, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Name - value: NPCTable - objectReference: {fileID: 0} - - target: {fileID: 4985587680422744605, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 702bd7ea217003e47be28d81a79dd99c, type: 3} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6227288689240557725, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 1496e34f13636804a82b6e1c438a74e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/TrashCan.prefab b/Assets/05.Prefabs/Props/Mini/TrashCan.prefab deleted file mode 100644 index 608c0412b..000000000 --- a/Assets/05.Prefabs/Props/Mini/TrashCan.prefab +++ /dev/null @@ -1,67 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &4355904791066675117 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 2395388827384788821, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} - - target: {fileID: 2643849317649087853, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_Name - value: TrashCan - objectReference: {fileID: 0} - - target: {fileID: 7854536393926979320, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 3efc550bddc68a345b5400a832fb9a6a, type: 3} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9104995012213585016, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 7601c5b68d6bab142b581e0a63d4743c, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/TrashCan.prefab.meta b/Assets/05.Prefabs/Props/Mini/TrashCan.prefab.meta deleted file mode 100644 index 49ad3f0a2..000000000 --- a/Assets/05.Prefabs/Props/Mini/TrashCan.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b51ba0e08743f4947898c76771fa87e2 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/05.Prefabs/Props/Mini/WallBar.prefab b/Assets/05.Prefabs/Props/Mini/WallBar.prefab deleted file mode 100644 index 698a32ddd..000000000 --- a/Assets/05.Prefabs/Props/Mini/WallBar.prefab +++ /dev/null @@ -1,67 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &1460291065197099848 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1784444314929232576, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Name - value: WallBar - objectReference: {fileID: 0} - - target: {fileID: 2111459413474029816, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: e8b27b82f6af50849b71aa8fbabb80f4, type: 3} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5869214406492465493, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: e8b27b82f6af50849b71aa8fbabb80f4, type: 3} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/WallBar.prefab.meta b/Assets/05.Prefabs/Props/Mini/WallBar.prefab.meta deleted file mode 100644 index a644f3091..000000000 --- a/Assets/05.Prefabs/Props/Mini/WallBar.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ba2f04db324864e48936c27164f91e49 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab b/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab deleted file mode 100644 index 36f3a947a..000000000 --- a/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab +++ /dev/null @@ -1,67 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &1460291065197099848 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1784444314929232576, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Name - value: WoodenBeerMug - objectReference: {fileID: 0} - - target: {fileID: 2111459413474029816, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: cda1d961a563b6143a024170ed6f0f44, type: 3} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4767122796570620885, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5869214406492465493, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: cda1d961a563b6143a024170ed6f0f44, type: 3} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: b51ba0e08743f4947898c76771fa87e2, type: 3} diff --git a/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab.meta b/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab.meta deleted file mode 100644 index f70394abf..000000000 --- a/Assets/05.Prefabs/Props/Mini/WoodenBeerMug.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1496e34f13636804a82b6e1c438a74e2 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/05.Prefabs/Uis/InteractionCanvas.prefab b/Assets/05.Prefabs/Uis/InteractionCanvas.prefab index 7ec1f48cf..d01e582dd 100644 --- a/Assets/05.Prefabs/Uis/InteractionCanvas.prefab +++ b/Assets/05.Prefabs/Uis/InteractionCanvas.prefab @@ -85,7 +85,7 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 1 + m_PresetInfoIsWorld: 0 --- !u!114 &5028824454365225125 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/05.Prefabs/Uis/Tycoons/Card.prefab b/Assets/05.Prefabs/Uis/Tycoons/Card.prefab index 889800d40..6d5f59984 100644 --- a/Assets/05.Prefabs/Uis/Tycoons/Card.prefab +++ b/Assets/05.Prefabs/Uis/Tycoons/Card.prefab @@ -375,7 +375,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1e080f1606bf24d4cb31f55f7958812a, type: 3} m_Name: m_EditorClassIdentifier: - _cardData: AddAllLiquid + _informationText: {fileID: 6023757579985556140} cardName: cardText: rotationDurationCard: 1 diff --git a/Assets/11.BehaviorTree/Customer.asset b/Assets/11.BehaviorTree/Customer.asset index d222ed098..2f37116af 100644 --- a/Assets/11.BehaviorTree/Customer.asset +++ b/Assets/11.BehaviorTree/Customer.asset @@ -34,9 +34,12 @@ MonoBehaviour: Failure Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWater.BehaviorTrees.Actions.OrderFail","NodeData":{"Offset":"(-171.836426,139.17836)"},"ID":12,"Name":"Order Fail","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.MoveSpawnPosition","NodeData":{"Offset":"(-3.28204346,144.4049)"},"ID":13,"Name":"Move Spawn Position","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.CheckOut","NodeData":{"Offset":"(152.261658,140)"},"ID":14,"Name":"Check - Out","Instant":true}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(742.794,147.214279)","Comment":"\ud1f4\uc7a5\ud55c\ub2e4"},"ID":15,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWater.BehaviorTrees.Actions.MoveSpawnPosition","NodeData":{"Offset":"(-298.843353,152.3807)"},"ID":16,"Name":"Move - Spawn Position","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.Vomit","NodeData":{"Offset":"(-134.094391,154.430084)"},"ID":17,"Name":"Vomit","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(-2.775899,148.649414)"},"ID":18,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"BlueWater.BehaviorTrees.Actions.MoveSpawnPosition","NodeData":{"Offset":"(140.7489,148.095245)"},"ID":19,"Name":"Move - Spawn Position","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.CheckOut","NodeData":{"Offset":"(290.7482,150)"},"ID":20,"Name":"Check + Out","Instant":true}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(974.972046,147.214279)","Comment":"\ud1f4\uc7a5\ud55c\ub2e4"},"ID":15,"Name":"Check + Out Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.ReturnSuccess","NodeData":{"Offset":"(-242.7356,145.119171)"},"ID":16,"Name":"Return + Success","Instant":true,"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.ConditionalEvaluator","NodeData":{"Offset":"(0,150)"},"ID":17,"Name":"Conditional + Evaluator","Instant":true,"SharedBoolreevaluate":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"ConditionalconditionalTask":{"Type":"BlueWater.BehaviorTrees.Actions.CanVomit"},"BooleangraphLabel":false,"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-3.03159523,145.85321)"},"ID":18,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWater.BehaviorTrees.Actions.Vomit","NodeData":{"Offset":"(-97.7254639,151.771912)"},"ID":19,"Name":"Vomit","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(112.4491,153.061523)"},"ID":20,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}}]}]}]},{"Type":"BlueWater.BehaviorTrees.Actions.PayMoney","NodeData":{"Offset":"(-65.23828,147.618866)"},"ID":21,"Name":"Pay + Money","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.MoveSpawnPosition","NodeData":{"Offset":"(94.76172,147.618866)"},"ID":22,"Name":"Move + Spawn Position","Instant":true},{"Type":"BlueWater.BehaviorTrees.Actions.CheckOut","NodeData":{"Offset":"(264.761719,147.618866)"},"ID":23,"Name":"Check Out","Instant":true}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true}]}' fieldSerializationData: typeName: [] diff --git a/Assets/13.Localization.meta b/Assets/13.Localization.meta new file mode 100644 index 000000000..47bbe89b3 --- /dev/null +++ b/Assets/13.Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6a196bdf3967df4cb131430d151cd7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/English (en).asset b/Assets/13.Localization/English (en).asset new file mode 100644 index 000000000..75fa104b6 --- /dev/null +++ b/Assets/13.Localization/English (en).asset @@ -0,0 +1,25 @@ +%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: 1bb1838fe8befb0429646b938e757ff3, type: 3} + m_Name: English (en) + m_EditorClassIdentifier: + m_Identifier: + m_Code: en + m_Metadata: + m_Items: [] + m_LocaleName: English (en) + m_CustomFormatCultureCode: + m_UseCustomFormatter: 0 + m_SortOrder: 1 + references: + version: 2 + RefIds: [] diff --git a/Assets/13.Localization/English (en).asset.meta b/Assets/13.Localization/English (en).asset.meta new file mode 100644 index 000000000..8008a718b --- /dev/null +++ b/Assets/13.Localization/English (en).asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0ba2b82aba69b944e80ad1f44deaae84 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Global Variables Group Asset.asset b/Assets/13.Localization/Global Variables Group Asset.asset new file mode 100644 index 000000000..078d2146c --- /dev/null +++ b/Assets/13.Localization/Global Variables Group Asset.asset @@ -0,0 +1,67 @@ +%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: b1e3e22ff9634e441a479f01f905a2f7, type: 3} + m_Name: Global Variables Group Asset + m_EditorClassIdentifier: + m_Variables: + - name: liquidE + variable: + rid: 5889118636641091764 + - name: liquidD + variable: + rid: 5889118636641091763 + - name: liquidC + variable: + rid: 5889118636641091762 + - name: liquidB + variable: + rid: 5889118636641091761 + - name: liquidA + variable: + rid: 5889118636641091755 + - name: garnish1 + variable: + rid: 5889118636641091769 + - name: garnish2 + variable: + rid: 5889118636641091770 + references: + version: 2 + RefIds: + - rid: 5889118636641091755 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: LiquidA + - rid: 5889118636641091761 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: LiquidB + - rid: 5889118636641091762 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: LiquidC + - rid: 5889118636641091763 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: LiquidD + - rid: 5889118636641091764 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: LiquidE + - rid: 5889118636641091769 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: Garnish1 + - rid: 5889118636641091770 + type: {class: StringVariable, ns: UnityEngine.Localization.SmartFormat.PersistentVariables, asm: Unity.Localization} + data: + m_Value: Garnish2 diff --git a/Assets/13.Localization/Global Variables Group Asset.asset.meta b/Assets/13.Localization/Global Variables Group Asset.asset.meta new file mode 100644 index 000000000..bd20f0bb6 --- /dev/null +++ b/Assets/13.Localization/Global Variables Group Asset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f81887433cf7f6c4a991e214ea0eda59 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Korean (ko).asset b/Assets/13.Localization/Korean (ko).asset new file mode 100644 index 000000000..712c816ab --- /dev/null +++ b/Assets/13.Localization/Korean (ko).asset @@ -0,0 +1,25 @@ +%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: 1bb1838fe8befb0429646b938e757ff3, type: 3} + m_Name: Korean (ko) + m_EditorClassIdentifier: + m_Identifier: + m_Code: ko + m_Metadata: + m_Items: [] + m_LocaleName: Korean (ko) + m_CustomFormatCultureCode: + m_UseCustomFormatter: 0 + m_SortOrder: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/13.Localization/Korean (ko).asset.meta b/Assets/13.Localization/Korean (ko).asset.meta new file mode 100644 index 000000000..4750f5605 --- /dev/null +++ b/Assets/13.Localization/Korean (ko).asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e69cad9a5a67a1e4cb71c511420ca0c9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Localization Settings.asset b/Assets/13.Localization/Localization Settings.asset new file mode 100644 index 000000000..bc4bbdcfe --- /dev/null +++ b/Assets/13.Localization/Localization Settings.asset @@ -0,0 +1,213 @@ +%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: a07b5cd0b1b829245bc8c4b6978793e8, type: 3} + m_Name: Localization Settings + m_EditorClassIdentifier: + m_StartupSelectors: + - rid: 5889118636641091584 + - rid: 5889118636641091585 + - rid: 5889118636641091586 + - rid: 5889118636641091608 + m_AvailableLocales: + rid: 5889118636641091587 + m_AssetDatabase: + rid: 5889118636641091588 + m_StringDatabase: + rid: 5889118636641091589 + m_Metadata: + m_Items: [] + m_ProjectLocaleIdentifier: + m_Code: ko + m_PreloadBehavior: 1 + m_InitializeSynchronously: 0 + references: + version: 2 + RefIds: + - rid: -2 + type: {class: , ns: , asm: } + - rid: 5889118636641091584 + type: {class: CommandLineLocaleSelector, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + m_CommandLineArgument: -language= + - rid: 5889118636641091585 + type: {class: SystemLocaleSelector, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + - rid: 5889118636641091586 + type: {class: SpecificLocaleSelector, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + m_LocaleId: + m_Code: ko + - rid: 5889118636641091587 + type: {class: LocalesProvider, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + - rid: 5889118636641091588 + type: {class: LocalizedAssetDatabase, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + m_DefaultTableReference: + m_TableCollectionName: + m_CustomTableProvider: + rid: -2 + m_CustomTablePostprocessor: + rid: -2 + m_AsynchronousBehaviour: 0 + m_UseFallback: 0 + - rid: 5889118636641091589 + type: {class: LocalizedStringDatabase, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + m_DefaultTableReference: + m_TableCollectionName: + m_CustomTableProvider: + rid: -2 + m_CustomTablePostprocessor: + rid: -2 + m_AsynchronousBehaviour: 0 + m_UseFallback: 0 + m_MissingTranslationState: 1 + m_NoTranslationFoundMessage: No translation found for '{key}' in {table.TableCollectionName} + m_SmartFormat: + rid: 5889118636641091590 + - rid: 5889118636641091590 + type: {class: SmartFormatter, ns: UnityEngine.Localization.SmartFormat, asm: Unity.Localization} + data: + m_Settings: + rid: 5889118636641091591 + m_Parser: + rid: 5889118636641091592 + m_Sources: + - rid: 5889118636641091593 + - rid: 5889118636641091594 + - rid: 5889118636641091595 + - rid: 5889118636641091596 + - rid: 5889118636641091597 + - rid: 5889118636641091598 + - rid: 5889118636641091599 + m_Formatters: + - rid: 5889118636641091593 + - rid: 5889118636641091600 + - rid: 5889118636641091601 + - rid: 5889118636641091602 + - rid: 5889118636641091603 + - rid: 5889118636641091604 + - rid: 5889118636641091605 + - rid: 5889118636641091606 + - rid: 5889118636641091607 + - rid: 5889118636641091591 + type: {class: SmartSettings, ns: UnityEngine.Localization.SmartFormat.Core.Settings, asm: Unity.Localization} + data: + m_FormatErrorAction: 0 + m_ParseErrorAction: 0 + m_CaseSensitivity: 0 + m_ConvertCharacterStringLiterals: 1 + - rid: 5889118636641091592 + type: {class: Parser, ns: UnityEngine.Localization.SmartFormat.Core.Parsing, asm: Unity.Localization} + data: + m_OpeningBrace: 123 + m_ClosingBrace: 125 + m_Settings: + rid: 5889118636641091591 + m_AlphanumericSelectors: 1 + m_AllowedSelectorChars: _- + m_Operators: '[]().,' + m_AlternativeEscaping: 0 + m_AlternativeEscapeChar: 92 + - rid: 5889118636641091593 + type: {class: ListFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - list + - l + - + m_SmartSettings: + rid: 5889118636641091591 + - rid: 5889118636641091594 + type: {class: PersistentVariablesSource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Groups: [] + - rid: 5889118636641091595 + type: {class: DictionarySource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + - rid: 5889118636641091596 + type: {class: ValueTupleSource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + - rid: 5889118636641091597 + type: {class: XmlSource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + - rid: 5889118636641091598 + type: {class: ReflectionSource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + - rid: 5889118636641091599 + type: {class: DefaultSource, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + - rid: 5889118636641091600 + type: {class: PluralLocalizationFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - plural + - p + - + m_DefaultTwoLetterISOLanguageName: en + - rid: 5889118636641091601 + type: {class: ConditionalFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - conditional + - cond + - + - rid: 5889118636641091602 + type: {class: TimeFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - timespan + - time + - t + - + m_DefaultFormatOptions: 4646 + - rid: 5889118636641091603 + type: {class: XElementFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - xelement + - xml + - x + - + - rid: 5889118636641091604 + type: {class: ChooseFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - choose + - c + m_SplitChar: 124 + - rid: 5889118636641091605 + type: {class: SubStringFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - substr + m_ParameterDelimiter: 44 + m_NullDisplayString: (null) + m_OutOfRangeBehavior: 0 + - rid: 5889118636641091606 + type: {class: IsMatchFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - ismatch + - rid: 5889118636641091607 + type: {class: DefaultFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions, asm: Unity.Localization} + data: + m_Names: + - default + - d + - + - rid: 5889118636641091608 + type: {class: SpecificLocaleSelector, ns: UnityEngine.Localization.Settings, asm: Unity.Localization} + data: + m_LocaleId: + m_Code: en diff --git a/Assets/13.Localization/Localization Settings.asset.meta b/Assets/13.Localization/Localization Settings.asset.meta new file mode 100644 index 000000000..b5ba412d7 --- /dev/null +++ b/Assets/13.Localization/Localization Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 112e4950c7d9b7a429feb9bb058a93a7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/StringDataTable.csv b/Assets/13.Localization/StringDataTable.csv new file mode 100644 index 000000000..a91bc95b3 --- /dev/null +++ b/Assets/13.Localization/StringDataTable.csv @@ -0,0 +1,51 @@ +Key,Korean(ko),English(en) +"HeartSlotPlus","하트 한칸을 추가합니다.","Add one heart slot." +"HeartRecovery","하트 한칸을 회복합니다.","Recover one heart." +"FullHeartRecovery","하트 전체를 회복합니다.","Recover all hearts." +"AddLiquidB","B술 재료를 4000ml 추가합니다.","Add 4000ml of LiquidB." +"AddLiquidC","C술 재료를 4000ml 추가합니다.","Add 4000ml of LiquidC." +"AddLiquidD","D술 재료를 4000ml 추가합니다.","Add 4000ml of LiquidD." +"AddLiquidE","E술 재료를 4000ml 추가합니다.","Add 4000ml of LiquidE." +"AddGarnish1","1번 가니쉬 재료를 4000ml 추가합니다.","Add 4000ml of Garnish1." +"AddGarnish2","2번 가니쉬 재료를 4000ml 추가합니다.","Add 4000ml of Garnish2." +"AllLiquidAdd","모든 술 재료 1000ml 추가합니다.","Add all ingredients." +"ServerNpcAdd","서빙 종업원을 추가합니다.","Add a server NPC." +"CleanerNpcAdd","청소 종업원을 추가합니다.","Add a cleaner NPC." +"BartenderNpcAdd","바텐터 종업원을 추가합니다.","Add a bartender NPC." +"SpeedBoost","플레이어의 이동속도가 10% 증가합니다.","Increase movement speed by 10%." +"ExpBoost","경험치 획득량이 20% 증가합니다.","Increase EXP gain by 20%." +"GoldBoost","골드 획득 20%이 증가합니다.","Increase gold gain by 20%." +"AllCleanUp","레스토랑을 전부 청소합니다.","Clean up the restaurant." +"GaugeReset","모든 손님들의 기다림 게이지를 초기화합니다.","Reset all customer waiting gauges." +"DashCooldownReduction","플레이어의 대시 쿨타임이 1초 감소합니다.","Reduce dash cooldown time by half." +"TipBoost","팁 획득량이 20% 증가합니다.","Increase tip gain by 20%." +"EndGoldBoost","게임오버 후 획득 골드량이 10% 증가합니다.","Increase gold gain after the game by 10%." +"AllCustomerPurification","손님들을 전부 정화시킵니다.","Purify all customers." +"GaugeTimeUp","손님들의 기다림 시간이 3초 증가합니다.","Increase customer waiting time by 3 seconds." +"BarrelAutoSupply","모든 술 재료를 초당 2ml 추가로 자동 충전합니다.","Automatically refill ingredient barrels every 2 minutes." +"ServerNpcUpgrade","종업원이 서빙 중 팁 획득량이 20% 증가합니다.","Increase server NPC's tip gain by 20%." +"CleanerNpcUpgrade","종업원의 청소 시간이 1초 감소합니다.","Decrease cleaner NPC’s cleaning time by 1 second." +"BartenderNpcUpgrade","종업원의 술 제조 속도가 1초 감소합니다.","Decrease bartender NPC’s drink crafting speed by 1 second." +"PassiveDoubleServing","플레이어가 양손에 서빙이 가능해집니다.","Allow the player to serve two customers simultaneously." +"PassiveRandomChange","특정 휴지통에서 완성된 칵테일 중 랜덤으로 변경 가능해집니다.","Allow changing one completed cocktail in the inventory to a random one." +"PassiveGoldAutoGain","자동으로 60초마다 계산대의 골드를 회수합니다.","Automatically gain a set amount of gold every 60 seconds." +"PassiveMakingBonus","플레이어가 술 제조 성공 시 팁 획득량만큼 추가로 골드를 획득합니다.","Gain additional gold equal to the tip amount each time the player successfully makes a drink." +"PassiveServingBonus","플레이어가 서빙을 3번 성공할 때마다 하트를 반 개 회복합니다.","Recover half a heart each time the player successfully serves three drinks." +"PassiveCleaningBonus","플레이어가 청소를 5번 성공할 때마다 새로 제작되는 종업원의 술 제조 속도를 10초간 2배로 증가합니다.","Double the crafting speed of the cleaner NPC’s drinks for 10 seconds every time the player cleans five times successfully." +"InteractionLiquidBarrelA","{global.liquidA} 따르기","Pour {global.liquidA}" +"InteractionLiquidBarrelB","{global.liquidB} 따르기","Pour {global.liquidB}" +"InteractionLiquidBarrelC","{global.liquidC} 따르기","Pour {global.liquidC}" +"InteractionLiquidBarrelD","{global.liquidD} 따르기","Pour {global.liquidD}" +"InteractionLiquidBarrelE","{global.liquidE} 따르기","Pour {global.liquidE}" +"InteractionGarnishBarrel1","{global.garnish1} 따르기","Pour {global.garnish1}" +"InteractionGarnishBarrel2","{global.garnish2} 따르기","Pour {global.garnish2}" +"InteractionVomiting","구토 치우기","Cleaning up vomiting" +"InteractionTableSeat","책상 치우기","Cleaning up table" +"InteractionMushroom","버섯 치우기","Cleaning up mushroom" +"InteractionMoneyCounter","골드 회수하기","Money collected" +"InteractionServingTablePickUp","칵테일 들기","Pick up cocktail" +"InteractionServingTablePutDown","칵테일 내려놓기","Put down cocktail" +"InteractionCustomer","칵테일 서빙하기","Serve cocktail" +"InteractionPump","펌프 작동하기","Operate pump" +"InteractionTrashCanDiscard","칵테일 버리기","Discard cocktail" +"InteractionTrashCanChange","무작위 칵테일 변경","Change random cocktail" diff --git a/Assets/05.Prefabs/Props/Mini/Barrel.prefab.meta b/Assets/13.Localization/StringDataTable.csv.meta similarity index 62% rename from Assets/05.Prefabs/Props/Mini/Barrel.prefab.meta rename to Assets/13.Localization/StringDataTable.csv.meta index c8d391bab..875bade61 100644 --- a/Assets/05.Prefabs/Props/Mini/Barrel.prefab.meta +++ b/Assets/13.Localization/StringDataTable.csv.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 80d491129e76216469e1484503d636e4 -PrefabImporter: +guid: 06c6d0977a544f64baf3f66b9a41087c +TextScriptImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/13.Localization/Tables.meta b/Assets/13.Localization/Tables.meta new file mode 100644 index 000000000..e6cd6ec36 --- /dev/null +++ b/Assets/13.Localization/Tables.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6d3c1a912b19444c8df56917dfc3bd8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Tables/StringDataTable Shared Data.asset b/Assets/13.Localization/Tables/StringDataTable Shared Data.asset new file mode 100644 index 000000000..b9ce75566 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable Shared Data.asset @@ -0,0 +1,232 @@ +%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: 5b11a58205ec3474ca216360e9fa74a8, type: 3} + m_Name: StringDataTable Shared Data + m_EditorClassIdentifier: + m_TableCollectionName: StringDataTable + m_TableCollectionNameGuidString: 0f00ef9cea8f57e4e952e1881becfed7 + m_Entries: + - m_Id: 12185710637056 + m_Key: HeartSlotPlus + m_Metadata: + m_Items: [] + - m_Id: 12185765163008 + m_Key: HeartRecovery + m_Metadata: + m_Items: [] + - m_Id: 12185765163009 + m_Key: FullHeartRecovery + m_Metadata: + m_Items: [] + - m_Id: 12185765163010 + m_Key: AddLiquidB + m_Metadata: + m_Items: [] + - m_Id: 12185765163011 + m_Key: AddLiquidC + m_Metadata: + m_Items: [] + - m_Id: 12185765163012 + m_Key: AddLiquidD + m_Metadata: + m_Items: [] + - m_Id: 12185765163013 + m_Key: AddLiquidE + m_Metadata: + m_Items: [] + - m_Id: 12185765163014 + m_Key: AddGarnish1 + m_Metadata: + m_Items: [] + - m_Id: 12185765163015 + m_Key: AddGarnish2 + m_Metadata: + m_Items: [] + - m_Id: 12185765163016 + m_Key: AllLiquidAdd + m_Metadata: + m_Items: [] + - m_Id: 12185765163017 + m_Key: ServerNpcAdd + m_Metadata: + m_Items: [] + - m_Id: 12185765163018 + m_Key: CleanerNpcAdd + m_Metadata: + m_Items: [] + - m_Id: 12185765163019 + m_Key: BartenderNpcAdd + m_Metadata: + m_Items: [] + - m_Id: 12185765163020 + m_Key: SpeedBoost + m_Metadata: + m_Items: [] + - m_Id: 12185765163021 + m_Key: ExpBoost + m_Metadata: + m_Items: [] + - m_Id: 12185765163022 + m_Key: GoldBoost + m_Metadata: + m_Items: [] + - m_Id: 12185765163023 + m_Key: AllCleanUp + m_Metadata: + m_Items: [] + - m_Id: 12185765163024 + m_Key: GaugeReset + m_Metadata: + m_Items: [] + - m_Id: 12185765163025 + m_Key: DashCooldownReduction + m_Metadata: + m_Items: [] + - m_Id: 12185765163026 + m_Key: TipBoost + m_Metadata: + m_Items: [] + - m_Id: 12185765163027 + m_Key: EndGoldBoost + m_Metadata: + m_Items: [] + - m_Id: 12185765163028 + m_Key: AllCustomerPurification + m_Metadata: + m_Items: [] + - m_Id: 12185765163029 + m_Key: GaugeTimeUp + m_Metadata: + m_Items: [] + - m_Id: 12185765163030 + m_Key: BarrelAutoSupply + m_Metadata: + m_Items: [] + - m_Id: 12185765163031 + m_Key: ServerNpcUpgrade + m_Metadata: + m_Items: [] + - m_Id: 12185765163032 + m_Key: CleanerNpcUpgrade + m_Metadata: + m_Items: [] + - m_Id: 12185765163033 + m_Key: BartenderNpcUpgrade + m_Metadata: + m_Items: [] + - m_Id: 12185765163034 + m_Key: PassiveDoubleServing + m_Metadata: + m_Items: [] + - m_Id: 12185765163035 + m_Key: PassiveRandomChange + m_Metadata: + m_Items: [] + - m_Id: 12185765163036 + m_Key: PassiveGoldAutoGain + m_Metadata: + m_Items: [] + - m_Id: 12185765163037 + m_Key: PassiveMakingBonus + m_Metadata: + m_Items: [] + - m_Id: 12185765163038 + m_Key: PassiveServingBonus + m_Metadata: + m_Items: [] + - m_Id: 12185765163039 + m_Key: PassiveCleaningBonus + m_Metadata: + m_Items: [] + - m_Id: 34976455471104 + m_Key: InteractionLiquidBarrelA + m_Metadata: + m_Items: [] + - m_Id: 41071488020480 + m_Key: InteractionLiquidBarrelB + m_Metadata: + m_Items: [] + - m_Id: 41088755970048 + m_Key: InteractionLiquidBarrelC + m_Metadata: + m_Items: [] + - m_Id: 41096481878016 + m_Key: InteractionLiquidBarrelD + m_Metadata: + m_Items: [] + - m_Id: 41098067324928 + m_Key: InteractionLiquidBarrelE + m_Metadata: + m_Items: [] + - m_Id: 41099917012992 + m_Key: InteractionGarnishBarrel1 + m_Metadata: + m_Items: [] + - m_Id: 41100923645952 + m_Key: InteractionGarnishBarrel2 + m_Metadata: + m_Items: [] + - m_Id: 42020407357440 + m_Key: InteractionVomiting + m_Metadata: + m_Items: [] + - m_Id: 42907288743936 + m_Key: InteractionTableSeat + m_Metadata: + m_Items: [] + - m_Id: 43158066180096 + m_Key: InteractionMushroom + m_Metadata: + m_Items: [] + - m_Id: 43510928781312 + m_Key: InteractionMoneyCounter + m_Metadata: + m_Items: [] + - m_Id: 49661431001088 + m_Key: InteractionServingTablePickUp + m_Metadata: + m_Items: [] + - m_Id: 49720453246976 + m_Key: InteractionServingTablePutDown + m_Metadata: + m_Items: [] + - m_Id: 52080177065984 + m_Key: InteractionCustomer + m_Metadata: + m_Items: [] + - m_Id: 53404088152064 + m_Key: InteractionPump + m_Metadata: + m_Items: [] + - m_Id: 53796133941248 + m_Key: InteractionTrashCanDiscard + m_Metadata: + m_Items: [] + - m_Id: 53858801037312 + m_Key: InteractionTrashCanChange + m_Metadata: + m_Items: [] + - m_Id: 55332822069248 + m_Key: + m_Metadata: + m_Items: [] + m_Metadata: + m_Items: [] + m_KeyGenerator: + rid: 5889118636641091609 + references: + version: 2 + RefIds: + - rid: 5889118636641091609 + type: {class: DistributedUIDGenerator, ns: UnityEngine.Localization.Tables, asm: Unity.Localization} + data: + m_CustomEpoch: 1731164889532 diff --git a/Assets/13.Localization/Tables/StringDataTable Shared Data.asset.meta b/Assets/13.Localization/Tables/StringDataTable Shared Data.asset.meta new file mode 100644 index 000000000..3f9e9a66e --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable Shared Data.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f00ef9cea8f57e4e952e1881becfed7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Tables/StringDataTable.asset b/Assets/13.Localization/Tables/StringDataTable.asset new file mode 100644 index 000000000..174de71f6 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable.asset @@ -0,0 +1,57 @@ +%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: 5be51871efa6c3e4eae1703925c8f5ac, type: 3} + m_Name: StringDataTable + m_EditorClassIdentifier: + m_SharedTableData: {fileID: 11400000, guid: 0f00ef9cea8f57e4e952e1881becfed7, type: 2} + m_Tables: + - {fileID: 11400000, guid: 27df9b52b15cda44296fb4f13854d384, type: 2} + - {fileID: 11400000, guid: 0803abc25fa424f45975b00068d199fd, type: 2} + m_Extensions: + - rid: 5889118636641091611 + m_Group: String Table + references: + version: 2 + RefIds: + - rid: 5889118636641091611 + type: {class: CsvExtension, ns: UnityEditor.Localization.Plugins.CSV, asm: Unity.Localization.Editor} + data: + m_Collection: {fileID: 11400000} + m_ColumnsList: + - rid: 5889118636641091612 + - rid: 5889118636641091613 + - rid: 5889118636641091614 + m_ConnectedFile: Assets/13.Localization/StringDataTable.csv + - rid: 5889118636641091612 + type: {class: KeyIdColumns, ns: UnityEditor.Localization.Plugins.CSV.Columns, asm: Unity.Localization.Editor} + data: + m_IncludeId: 0 + m_IncludeSharedComments: 0 + m_KeyFieldName: Key + m_IdFieldName: Id + m_CommentFieldName: Shared Comments + - rid: 5889118636641091613 + type: {class: LocaleColumns, ns: UnityEditor.Localization.Plugins.CSV.Columns, asm: Unity.Localization.Editor} + data: + m_LocaleIdentifier: + m_Code: ko + m_FieldName: Korean(ko) + m_CommentFieldName: Korean(ko) Comments + m_IncludeComments: 0 + - rid: 5889118636641091614 + type: {class: LocaleColumns, ns: UnityEditor.Localization.Plugins.CSV.Columns, asm: Unity.Localization.Editor} + data: + m_LocaleIdentifier: + m_Code: en + m_FieldName: English(en) + m_CommentFieldName: English(en) Comments + m_IncludeComments: 0 diff --git a/Assets/13.Localization/Tables/StringDataTable.asset.meta b/Assets/13.Localization/Tables/StringDataTable.asset.meta new file mode 100644 index 000000000..14dd30314 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eab0e1c16e753ea4abb32219a4917b06 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Tables/StringDataTable_en.asset b/Assets/13.Localization/Tables/StringDataTable_en.asset new file mode 100644 index 000000000..6e8449fd1 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable_en.asset @@ -0,0 +1,247 @@ +%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: e9620f8c34305754d8cc9a7e49e852d9, type: 3} + m_Name: StringDataTable_en + m_EditorClassIdentifier: + m_LocaleId: + m_Code: en + m_SharedData: {fileID: 11400000, guid: 0f00ef9cea8f57e4e952e1881becfed7, type: 2} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + m_TableData: + - m_Id: 12185710637056 + m_Localized: Add one heart slot. + m_Metadata: + m_Items: [] + - m_Id: 12185765163008 + m_Localized: Recover one heart. + m_Metadata: + m_Items: [] + - m_Id: 12185765163009 + m_Localized: Recover all hearts. + m_Metadata: + m_Items: [] + - m_Id: 12185765163010 + m_Localized: Add 4000ml of LiquidB. + m_Metadata: + m_Items: [] + - m_Id: 12185765163011 + m_Localized: Add 4000ml of LiquidC. + m_Metadata: + m_Items: [] + - m_Id: 12185765163012 + m_Localized: Add 4000ml of LiquidD. + m_Metadata: + m_Items: [] + - m_Id: 12185765163013 + m_Localized: Add 4000ml of LiquidE. + m_Metadata: + m_Items: [] + - m_Id: 12185765163014 + m_Localized: Add 4000ml of Garnish1. + m_Metadata: + m_Items: [] + - m_Id: 12185765163015 + m_Localized: Add 4000ml of Garnish2. + m_Metadata: + m_Items: [] + - m_Id: 12185765163016 + m_Localized: Add all ingredients. + m_Metadata: + m_Items: [] + - m_Id: 12185765163017 + m_Localized: Add a server NPC. + m_Metadata: + m_Items: [] + - m_Id: 12185765163018 + m_Localized: Add a cleaner NPC. + m_Metadata: + m_Items: [] + - m_Id: 12185765163019 + m_Localized: Add a bartender NPC. + m_Metadata: + m_Items: [] + - m_Id: 12185765163020 + m_Localized: Increase movement speed by 10%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163021 + m_Localized: Increase EXP gain by 20%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163022 + m_Localized: Increase gold gain by 20%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163023 + m_Localized: Clean up the restaurant. + m_Metadata: + m_Items: [] + - m_Id: 12185765163024 + m_Localized: Reset all customer waiting gauges. + m_Metadata: + m_Items: [] + - m_Id: 12185765163025 + m_Localized: Reduce dash cooldown time by half. + m_Metadata: + m_Items: [] + - m_Id: 12185765163026 + m_Localized: Increase tip gain by 20%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163027 + m_Localized: Increase gold gain after the game by 10%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163028 + m_Localized: Purify all customers. + m_Metadata: + m_Items: [] + - m_Id: 12185765163029 + m_Localized: Increase customer waiting time by 3 seconds. + m_Metadata: + m_Items: [] + - m_Id: 12185765163030 + m_Localized: Automatically refill ingredient barrels every 2 minutes. + m_Metadata: + m_Items: [] + - m_Id: 12185765163031 + m_Localized: Increase server NPC's tip gain by 20%. + m_Metadata: + m_Items: [] + - m_Id: 12185765163032 + m_Localized: "Decrease cleaner NPC\u2019s cleaning time by 1 second." + m_Metadata: + m_Items: [] + - m_Id: 12185765163033 + m_Localized: "Decrease bartender NPC\u2019s drink crafting speed by 1 second." + m_Metadata: + m_Items: [] + - m_Id: 12185765163034 + m_Localized: Allow the player to serve two customers simultaneously. + m_Metadata: + m_Items: [] + - m_Id: 12185765163035 + m_Localized: Allow changing one completed cocktail in the inventory to a random + one. + m_Metadata: + m_Items: [] + - m_Id: 12185765163036 + m_Localized: Automatically gain a set amount of gold every 60 seconds. + m_Metadata: + m_Items: [] + - m_Id: 12185765163037 + m_Localized: Gain additional gold equal to the tip amount each time the player + successfully makes a drink. + m_Metadata: + m_Items: [] + - m_Id: 12185765163038 + m_Localized: Recover half a heart each time the player successfully serves three + drinks. + m_Metadata: + m_Items: [] + - m_Id: 12185765163039 + m_Localized: "Double the crafting speed of the cleaner NPC\u2019s drinks for + 10 seconds every time the player cleans five times successfully." + m_Metadata: + m_Items: [] + - m_Id: 34976455471104 + m_Localized: Pour {global.liquidA} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41071488020480 + m_Localized: Pour {global.liquidB} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41088755970048 + m_Localized: Pour {global.liquidC} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41096481878016 + m_Localized: Pour {global.liquidD} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41098067324928 + m_Localized: Pour {global.liquidE} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41099917012992 + m_Localized: Pour {global.garnish1} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 41100923645952 + m_Localized: Pour {global.garnish2} + m_Metadata: + m_Items: + - rid: 5889118636641091753 + - m_Id: 42020407357440 + m_Localized: Cleaning up vomiting + m_Metadata: + m_Items: [] + - m_Id: 42907288743936 + m_Localized: Cleaning up table + m_Metadata: + m_Items: [] + - m_Id: 43158066180096 + m_Localized: Cleaning up mushroom + m_Metadata: + m_Items: [] + - m_Id: 43510928781312 + m_Localized: Money collected + m_Metadata: + m_Items: [] + - m_Id: 49661431001088 + m_Localized: Pick up cocktail + m_Metadata: + m_Items: [] + - m_Id: 49720453246976 + m_Localized: Put down cocktail + m_Metadata: + m_Items: [] + - m_Id: 52080177065984 + m_Localized: Serve cocktail + m_Metadata: + m_Items: [] + - m_Id: 53404088152064 + m_Localized: Operate pump + m_Metadata: + m_Items: [] + - m_Id: 53858801037312 + m_Localized: Change random cocktail + m_Metadata: + m_Items: [] + - m_Id: 53796133941248 + m_Localized: Discard cocktail + m_Metadata: + m_Items: [] + references: + version: 2 + RefIds: + - rid: 5889118636641091753 + type: {class: SmartFormatTag, ns: UnityEngine.Localization.Metadata, asm: Unity.Localization} + data: + m_Entries: + m_SharedEntries: + - id: 34976455471104 + - id: 41071488020480 + - id: 41088755970048 + - id: 41096481878016 + - id: 41098067324928 + - id: 41099917012992 + - id: 41100923645952 diff --git a/Assets/13.Localization/Tables/StringDataTable_en.asset.meta b/Assets/13.Localization/Tables/StringDataTable_en.asset.meta new file mode 100644 index 000000000..e15db4b48 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable_en.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0803abc25fa424f45975b00068d199fd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13.Localization/Tables/StringDataTable_ko.asset b/Assets/13.Localization/Tables/StringDataTable_ko.asset new file mode 100644 index 000000000..22270c339 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable_ko.asset @@ -0,0 +1,260 @@ +%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: e9620f8c34305754d8cc9a7e49e852d9, type: 3} + m_Name: StringDataTable_ko + m_EditorClassIdentifier: + m_LocaleId: + m_Code: ko + m_SharedData: {fileID: 11400000, guid: 0f00ef9cea8f57e4e952e1881becfed7, type: 2} + m_Metadata: + m_Items: + - rid: 5889118636641091754 + m_TableData: + - m_Id: 12185710637056 + m_Localized: "\uD558\uD2B8 \uD55C\uCE78\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163008 + m_Localized: "\uD558\uD2B8 \uD55C\uCE78\uC744 \uD68C\uBCF5\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163009 + m_Localized: "\uD558\uD2B8 \uC804\uCCB4\uB97C \uD68C\uBCF5\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163010 + m_Localized: "B\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163011 + m_Localized: "C\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163012 + m_Localized: "D\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163013 + m_Localized: "E\uC220 \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163014 + m_Localized: "1\uBC88 \uAC00\uB2C8\uC26C \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163015 + m_Localized: "2\uBC88 \uAC00\uB2C8\uC26C \uC7AC\uB8CC\uB97C 4000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163016 + m_Localized: "\uBAA8\uB4E0 \uC220 \uC7AC\uB8CC 1000ml \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163017 + m_Localized: "\uC11C\uBE59 \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163018 + m_Localized: "\uCCAD\uC18C \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163019 + m_Localized: "\uBC14\uD150\uD130 \uC885\uC5C5\uC6D0\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163020 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uC758 \uC774\uB3D9\uC18D\uB3C4\uAC00 10% + \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163021 + m_Localized: "\uACBD\uD5D8\uCE58 \uD68D\uB4DD\uB7C9\uC774 20% \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163022 + m_Localized: "\uACE8\uB4DC \uD68D\uB4DD 20%\uC774 \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163023 + m_Localized: "\uB808\uC2A4\uD1A0\uB791\uC744 \uC804\uBD80 \uCCAD\uC18C\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163024 + m_Localized: "\uBAA8\uB4E0 \uC190\uB2D8\uB4E4\uC758 \uAE30\uB2E4\uB9BC \uAC8C\uC774\uC9C0\uB97C + \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163025 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uC758 \uB300\uC2DC \uCFE8\uD0C0\uC784\uC774 + 1\uCD08 \uAC10\uC18C\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163026 + m_Localized: "\uD301 \uD68D\uB4DD\uB7C9\uC774 20% \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163027 + m_Localized: "\uAC8C\uC784\uC624\uBC84 \uD6C4 \uD68D\uB4DD \uACE8\uB4DC\uB7C9\uC774 + 10% \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163028 + m_Localized: "\uC190\uB2D8\uB4E4\uC744 \uC804\uBD80 \uC815\uD654\uC2DC\uD0B5\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163029 + m_Localized: "\uC190\uB2D8\uB4E4\uC758 \uAE30\uB2E4\uB9BC \uC2DC\uAC04\uC774 + 3\uCD08 \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163030 + m_Localized: "\uBAA8\uB4E0 \uC220 \uC7AC\uB8CC\uB97C \uCD08\uB2F9 2ml \uCD94\uAC00\uB85C + \uC790\uB3D9 \uCDA9\uC804\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163031 + m_Localized: "\uC885\uC5C5\uC6D0\uC774 \uC11C\uBE59 \uC911 \uD301 \uD68D\uB4DD\uB7C9\uC774 + 20% \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163032 + m_Localized: "\uC885\uC5C5\uC6D0\uC758 \uCCAD\uC18C \uC2DC\uAC04\uC774 1\uCD08 + \uAC10\uC18C\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163033 + m_Localized: "\uC885\uC5C5\uC6D0\uC758 \uC220 \uC81C\uC870 \uC18D\uB3C4\uAC00 + 1\uCD08 \uAC10\uC18C\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163034 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC591\uC190\uC5D0 \uC11C\uBE59\uC774 + \uAC00\uB2A5\uD574\uC9D1\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163035 + m_Localized: "\uD2B9\uC815 \uD734\uC9C0\uD1B5\uC5D0\uC11C \uC644\uC131\uB41C + \uCE75\uD14C\uC77C \uC911 \uB79C\uB364\uC73C\uB85C \uBCC0\uACBD \uAC00\uB2A5\uD574\uC9D1\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163036 + m_Localized: "\uC790\uB3D9\uC73C\uB85C 60\uCD08\uB9C8\uB2E4 \uACC4\uC0B0\uB300\uC758 + \uACE8\uB4DC\uB97C \uD68C\uC218\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163037 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC220 \uC81C\uC870 \uC131\uACF5 + \uC2DC \uD301 \uD68D\uB4DD\uB7C9\uB9CC\uD07C \uCD94\uAC00\uB85C \uACE8\uB4DC\uB97C + \uD68D\uB4DD\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163038 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uAC00 \uC11C\uBE59\uC744 3\uBC88 \uC131\uACF5\uD560 + \uB54C\uB9C8\uB2E4 \uD558\uD2B8\uB97C \uBC18 \uAC1C \uD68C\uBCF5\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 12185765163039 + m_Localized: "\uD50C\uB808\uC774\uC5B4\uAC00 \uCCAD\uC18C\uB97C 5\uBC88 \uC131\uACF5\uD560 + \uB54C\uB9C8\uB2E4 \uC0C8\uB85C \uC81C\uC791\uB418\uB294 \uC885\uC5C5\uC6D0\uC758 + \uC220 \uC81C\uC870 \uC18D\uB3C4\uB97C 10\uCD08\uAC04 2\uBC30\uB85C \uC99D\uAC00\uD569\uB2C8\uB2E4." + m_Metadata: + m_Items: [] + - m_Id: 34976455471104 + m_Localized: "{global.liquidA} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41071488020480 + m_Localized: "{global.liquidB} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41088755970048 + m_Localized: "{global.liquidC} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41096481878016 + m_Localized: "{global.liquidD} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41098067324928 + m_Localized: "{global.liquidE} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41099917012992 + m_Localized: "{global.garnish1} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 41100923645952 + m_Localized: "{global.garnish2} \uB530\uB974\uAE30" + m_Metadata: + m_Items: + - rid: 5889118636641091754 + - m_Id: 42020407357440 + m_Localized: "\uAD6C\uD1A0 \uCE58\uC6B0\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 42907288743936 + m_Localized: "\uCC45\uC0C1 \uCE58\uC6B0\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 43158066180096 + m_Localized: "\uBC84\uC12F \uCE58\uC6B0\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 43510928781312 + m_Localized: "\uACE8\uB4DC \uD68C\uC218\uD558\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 49661431001088 + m_Localized: "\uCE75\uD14C\uC77C \uB4E4\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 49720453246976 + m_Localized: "\uCE75\uD14C\uC77C \uB0B4\uB824\uB193\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 52080177065984 + m_Localized: "\uCE75\uD14C\uC77C \uC11C\uBE59\uD558\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 53404088152064 + m_Localized: "\uD38C\uD504 \uC791\uB3D9\uD558\uAE30" + m_Metadata: + m_Items: [] + - m_Id: 53858801037312 + m_Localized: "\uBB34\uC791\uC704 \uCE75\uD14C\uC77C \uBCC0\uACBD" + m_Metadata: + m_Items: [] + - m_Id: 53796133941248 + m_Localized: "\uCE75\uD14C\uC77C \uBC84\uB9AC\uAE30" + m_Metadata: + m_Items: [] + references: + version: 2 + RefIds: + - rid: 5889118636641091754 + type: {class: SmartFormatTag, ns: UnityEngine.Localization.Metadata, asm: Unity.Localization} + data: + m_Entries: + m_SharedEntries: + - id: 34976455471104 + - id: 41071488020480 + - id: 41088755970048 + - id: 41096481878016 + - id: 41098067324928 + - id: 41099917012992 + - id: 41100923645952 diff --git a/Assets/13.Localization/Tables/StringDataTable_ko.asset.meta b/Assets/13.Localization/Tables/StringDataTable_ko.asset.meta new file mode 100644 index 000000000..8f3b6f705 --- /dev/null +++ b/Assets/13.Localization/Tables/StringDataTable_ko.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27df9b52b15cda44296fb4f13854d384 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData.meta b/Assets/AddressableAssetsData.meta new file mode 100644 index 000000000..9c25355e7 --- /dev/null +++ b/Assets/AddressableAssetsData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae245060d824aa3458426704cfc7fd8e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset new file mode 100644 index 000000000..eccb45593 --- /dev/null +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -0,0 +1,122 @@ +%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: 468a46d0ae32c3544b7d98094e6448a9, type: 3} + m_Name: AddressableAssetSettings + m_EditorClassIdentifier: + m_DefaultGroup: 8e0a3b4ef79b6b240a41c854861466bc + m_currentHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_OptimizeCatalogSize: 0 + m_BuildRemoteCatalog: 0 + m_CatalogRequestsTimeout: 0 + m_DisableCatalogUpdateOnStart: 0 + m_InternalIdNamingMode: 0 + m_InternalBundleIdMode: 1 + m_AssetLoadMode: 0 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_IgnoreUnsupportedFilesInBuild: 0 + m_UniqueBundleIds: 0 + m_EnableJsonCatalog: 0 + m_NonRecursiveBuilding: 1 + m_CCDEnabled: 0 + m_maxConcurrentWebRequests: 3 + m_UseUWRForLocalBundles: 0 + m_BundleTimeout: 0 + m_BundleRetryCount: 0 + m_BundleRedirectLimit: -1 + m_SharedBundleSettings: 0 + m_SharedBundleSettingsCustomGroupIndex: 0 + m_ContiguousBundles: 1 + m_StripUnityVersionFromBundleBuild: 0 + m_DisableVisibleSubAssetRepresentations: 0 + m_BuiltInBundleNaming: 0 + mBuiltInBundleCustomNaming: + m_MonoScriptBundleNaming: 0 + m_CheckForContentUpdateRestrictionsOption: 0 + m_MonoScriptBundleCustomNaming: + m_RemoteCatalogBuildPath: + m_Id: + m_RemoteCatalogLoadPath: + m_Id: + m_ContentStateBuildPathProfileVariableName: + m_CustomContentStateBuildPath: + m_ContentStateBuildPath: + m_BuildAddressablesWithPlayerBuild: 0 + m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]' + m_GroupAssets: + - {fileID: 11400000, guid: ea10f5b03a2014b4a94a0a10d897bd88, type: 2} + - {fileID: 11400000, guid: e55b17f01dde1704983640efbd276646, type: 2} + - {fileID: 11400000, guid: 837bf01a180409d45b303bf687c55305, type: 2} + - {fileID: 11400000, guid: c6ddc027d3bf41a408deea0e1863ebc4, type: 2} + - {fileID: 11400000, guid: efd3d847c7762ee45835e0b07b6669cb, type: 2} + m_BuildSettings: + m_LogResourceManagerExceptions: 1 + m_BundleBuildPath: Temp/com.unity.addressables/AssetBundles + m_ProfileSettings: + m_Profiles: + - m_InheritedParent: + m_Id: 306c47bf6b73999489e18f8c592475a4 + m_ProfileName: Default + m_Values: + - m_Id: 2ed562802d107df46a3918a946d34456 + m_Value: 'ServerData/[BuildTarget]' + - m_Id: 7a053b69a31ef4f47b402de21446bc4e + m_Value: + - m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]' + - m_Id: e6ccf7e43bdacf746b63f0047aa8b893 + m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]' + m_ProfileEntryNames: + - m_Id: 2ed562802d107df46a3918a946d34456 + m_Name: Remote.BuildPath + m_InlineUsage: 0 + - m_Id: 7a053b69a31ef4f47b402de21446bc4e + m_Name: Remote.LoadPath + m_InlineUsage: 0 + - m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_Name: Local.BuildPath + m_InlineUsage: 0 + - m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_Name: Local.LoadPath + m_InlineUsage: 0 + - m_Id: e6ccf7e43bdacf746b63f0047aa8b893 + m_Name: BuildTarget + m_InlineUsage: 0 + m_ProfileVersion: 1 + m_LabelTable: + m_LabelNames: + - default + - Locale + - Locale-ko + - Locale-en + - Preload + m_SchemaTemplates: [] + m_GroupTemplateObjects: + - {fileID: 11400000, guid: c2adc330eb3f0f847b6472910cdf00a9, type: 2} + m_InitializationObjects: [] + m_CertificateHandlerType: + m_AssemblyName: + m_ClassName: + m_ActivePlayerDataBuilderIndex: 2 + m_DataBuilders: + - {fileID: 11400000, guid: 9a857241caf51864ea979ff7a1b17183, type: 2} + - {fileID: 11400000, guid: 4225e246575e36a49bb918fbfe647cb1, type: 2} + - {fileID: 11400000, guid: 7dd6b34ed361b004ba11cd6ce55c9ca5, type: 2} + m_ActiveProfileId: 306c47bf6b73999489e18f8c592475a4 diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta b/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta new file mode 100644 index 000000000..e6e1d3279 --- /dev/null +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d834588a5565d647a28b3027ed7f255 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroupTemplates.meta b/Assets/AddressableAssetsData/AssetGroupTemplates.meta new file mode 100644 index 000000000..ef23ddcb2 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroupTemplates.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7def03c098c8bcd43bd06991261ad1ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset b/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset new file mode 100644 index 000000000..2a27b84a8 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6798178080249994015 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 0} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: + m_ClassName: + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: + m_LoadPath: + m_Id: + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: + m_ClassName: + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 0 + m_AssetLoadMode: 0 +--- !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: 1a3c5d64ac83548c09dd1678b9f6f1cd, type: 3} + m_Name: Packed Assets + m_EditorClassIdentifier: + m_SchemaObjects: + - {fileID: -6798178080249994015} + - {fileID: 4813275286716781557} + m_Description: Pack assets into asset bundles. + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} +--- !u!114 &4813275286716781557 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 0} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta b/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta new file mode 100644 index 000000000..add10d445 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2adc330eb3f0f847b6472910cdf00a9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups.meta b/Assets/AddressableAssetsData/AssetGroups.meta new file mode 100644 index 000000000..535ff4c6a --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b15287266a76fc64382e8a6ee9b31c40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset b/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset new file mode 100644 index 000000000..a930b28a8 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset @@ -0,0 +1,23 @@ +%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Default Local Group + m_EditorClassIdentifier: + m_GroupName: Default Local Group + m_GUID: 8e0a3b4ef79b6b240a41c854861466bc + m_SerializeEntries: [] + m_ReadOnly: 0 + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: fb8396823dce10546b061ca4622f2b66, type: 2} + - {fileID: 11400000, guid: 22ace92b945ae1a43b8b744b5207c2f0, type: 2} diff --git a/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta new file mode 100644 index 000000000..7fc63b5bc --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efd3d847c7762ee45835e0b07b6669cb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset new file mode 100644 index 000000000..720fb26d3 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset @@ -0,0 +1,28 @@ +%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Localization-Assets-Shared + m_EditorClassIdentifier: + m_GroupName: Localization-Assets-Shared + m_GUID: 8a47e39d9e5abb940bafad52f1e7423f + m_SerializeEntries: + - m_GUID: 0f00ef9cea8f57e4e952e1881becfed7 + m_Address: Assets/13.Localization/MyTable Shared Data.asset + m_ReadOnly: 1 + m_SerializedLabels: [] + FlaggedDuringContentUpdateRestriction: 0 + m_ReadOnly: 1 + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: 2ae79ff8a5c7196408b80f3c3abac936, type: 2} + - {fileID: 11400000, guid: 4fac0f66fe2efd84a937540fc631d1e4, type: 2} diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset.meta new file mode 100644 index 000000000..c28f8a994 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-Assets-Shared.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c6ddc027d3bf41a408deea0e1863ebc4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset b/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset new file mode 100644 index 000000000..f8ab13e5c --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset @@ -0,0 +1,35 @@ +%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Localization-Locales + m_EditorClassIdentifier: + m_GroupName: Localization-Locales + m_GUID: 4d4caa5b27d3bc44e9b4a58a81000b5a + m_SerializeEntries: + - m_GUID: 0ba2b82aba69b944e80ad1f44deaae84 + m_Address: English (en) + m_ReadOnly: 1 + m_SerializedLabels: + - Locale + FlaggedDuringContentUpdateRestriction: 0 + - m_GUID: e69cad9a5a67a1e4cb71c511420ca0c9 + m_Address: Korean (ko) + m_ReadOnly: 1 + m_SerializedLabels: + - Locale + FlaggedDuringContentUpdateRestriction: 0 + m_ReadOnly: 1 + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: 236acc8cb99c9884f98830f51dc30c53, type: 2} + - {fileID: 11400000, guid: b67c7e987b43fe944bccfe91c0bcfb2e, type: 2} diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset.meta new file mode 100644 index 000000000..c0a90e34d --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-Locales.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e55b17f01dde1704983640efbd276646 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset new file mode 100644 index 000000000..b5c71f32e --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset @@ -0,0 +1,29 @@ +%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Localization-String-Tables-English (en) + m_EditorClassIdentifier: + m_GroupName: Localization-String-Tables-English (en) + m_GUID: 6c1cfc8e806cfa54990f95cdd785dcef + m_SerializeEntries: + - m_GUID: 0803abc25fa424f45975b00068d199fd + m_Address: StringDataTable_en + m_ReadOnly: 1 + m_SerializedLabels: + - Locale-en + FlaggedDuringContentUpdateRestriction: 0 + m_ReadOnly: 1 + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: dc7459460c508be438b58e3ef2dd266e, type: 2} + - {fileID: 11400000, guid: 8fcbdeebeeee479418e20f84c9282520, type: 2} diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset.meta b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset.meta new file mode 100644 index 000000000..6b9670893 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-English (en).asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 837bf01a180409d45b303bf687c55305 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset new file mode 100644 index 000000000..64392dddf --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset @@ -0,0 +1,29 @@ +%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3} + m_Name: Localization-String-Tables-Korean (ko) + m_EditorClassIdentifier: + m_GroupName: Localization-String-Tables-Korean (ko) + m_GUID: 0fc26bbb017edea439cdcc69a4b8af5f + m_SerializeEntries: + - m_GUID: 27df9b52b15cda44296fb4f13854d384 + m_Address: StringDataTable_ko + m_ReadOnly: 1 + m_SerializedLabels: + - Locale-ko + FlaggedDuringContentUpdateRestriction: 0 + m_ReadOnly: 1 + m_Settings: {fileID: 11400000, guid: 5d834588a5565d647a28b3027ed7f255, type: 2} + m_SchemaSet: + m_Schemas: + - {fileID: 11400000, guid: 7e55a4da3a58ccc40aeb6f6525d5bafb, type: 2} + - {fileID: 11400000, guid: f7bc236a7c40ff648a25e68bb36dd2c4, type: 2} diff --git a/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset.meta b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset.meta new file mode 100644 index 000000000..2cf1f86be --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Localization-String-Tables-Korean (ko).asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea10f5b03a2014b4a94a0a10d897bd88 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas.meta new file mode 100644 index 000000000..40e2013be --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 56f97fbb44183be4d8ff14d14c724aa3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset new file mode 100644 index 000000000..fdf4ab9f0 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset @@ -0,0 +1,47 @@ +%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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Default Local Group_BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: efd3d847c7762ee45835e0b07b6669cb, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_LoadPath: + m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 0 + m_AssetLoadMode: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta new file mode 100644 index 000000000..09abb4f54 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fb8396823dce10546b061ca4622f2b66 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset new file mode 100644 index 000000000..92be79276 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Default Local Group_ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: efd3d847c7762ee45835e0b07b6669cb, type: 2} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 000000000..5e9c4397b --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22ace92b945ae1a43b8b744b5207c2f0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset new file mode 100644 index 000000000..9b4a463c9 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset @@ -0,0 +1,47 @@ +%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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Localization-Assets-Shared_BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: c6ddc027d3bf41a408deea0e1863ebc4, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_LoadPath: + m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 1 + m_AssetLoadMode: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset.meta new file mode 100644 index 000000000..f574fee1a --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ae79ff8a5c7196408b80f3c3abac936 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset new file mode 100644 index 000000000..ef0bf95cb --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Localization-Assets-Shared_ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: c6ddc027d3bf41a408deea0e1863ebc4, type: 2} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 000000000..c04dad3dd --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Assets-Shared_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4fac0f66fe2efd84a937540fc631d1e4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset new file mode 100644 index 000000000..8e5c473f3 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset @@ -0,0 +1,47 @@ +%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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Localization-Locales_BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: e55b17f01dde1704983640efbd276646, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_LoadPath: + m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 1 + m_AssetLoadMode: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset.meta new file mode 100644 index 000000000..08eb45295 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 236acc8cb99c9884f98830f51dc30c53 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset new file mode 100644 index 000000000..64f23db05 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Localization-Locales_ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: e55b17f01dde1704983640efbd276646, type: 2} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 000000000..3171eca99 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-Locales_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b67c7e987b43fe944bccfe91c0bcfb2e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset new file mode 100644 index 000000000..cc939e216 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset @@ -0,0 +1,47 @@ +%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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Localization-String-Tables-English (en)_BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: 837bf01a180409d45b303bf687c55305, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_LoadPath: + m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 1 + m_AssetLoadMode: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset.meta new file mode 100644 index 000000000..8a77e1424 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc7459460c508be438b58e3ef2dd266e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset new file mode 100644 index 000000000..69466656f --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Localization-String-Tables-English (en)_ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: 837bf01a180409d45b303bf687c55305, type: 2} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 000000000..175984d9b --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-English (en)_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8fcbdeebeeee479418e20f84c9282520 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset new file mode 100644 index 000000000..132d201eb --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset @@ -0,0 +1,47 @@ +%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: e5d17a21594effb4e9591490b009e7aa, type: 3} + m_Name: Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: ea10f5b03a2014b4a94a0a10d897bd88, type: 2} + m_InternalBundleIdMode: 1 + m_Compression: 1 + m_IncludeAddressInCatalog: 1 + m_IncludeGUIDInCatalog: 1 + m_IncludeLabelsInCatalog: 1 + m_InternalIdNamingMode: 0 + m_CacheClearBehavior: 0 + m_IncludeInBuild: 1 + m_BundledAssetProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider + m_ForceUniqueProvider: 0 + m_UseAssetBundleCache: 1 + m_UseAssetBundleCrc: 1 + m_UseAssetBundleCrcForCachedBundles: 1 + m_UseUWRForLocalBundles: 0 + m_Timeout: 0 + m_ChunkedTransfer: 0 + m_RedirectLimit: -1 + m_RetryCount: 0 + m_BuildPath: + m_Id: 85d4e1c73a3613a41ae47721b17d5f25 + m_LoadPath: + m_Id: da763efbac427a64b835bdc2ccaa2d25 + m_BundleMode: 0 + m_AssetBundleProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider + m_UseDefaultSchemaSettings: 0 + m_SelectedPathPairIndex: 0 + m_BundleNaming: 1 + m_AssetLoadMode: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset.meta new file mode 100644 index 000000000..39b505308 --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_BundledAssetGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e55a4da3a58ccc40aeb6f6525d5bafb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset new file mode 100644 index 000000000..3495ad53d --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset @@ -0,0 +1,16 @@ +%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3} + m_Name: Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema + m_EditorClassIdentifier: + m_Group: {fileID: 11400000, guid: ea10f5b03a2014b4a94a0a10d897bd88, type: 2} + m_StaticContent: 0 diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset.meta b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset.meta new file mode 100644 index 000000000..0df9e2c4c --- /dev/null +++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Localization-String-Tables-Korean (ko)_ContentUpdateGroupSchema.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f7bc236a7c40ff648a25e68bb36dd2c4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DataBuilders.meta b/Assets/AddressableAssetsData/DataBuilders.meta new file mode 100644 index 000000000..dded3c889 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bfc43962269f6cf42adb075efd48d012 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset b/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset new file mode 100644 index 000000000..50d30dc58 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset @@ -0,0 +1,20 @@ +%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: 88d21199f5d473f4db36845f2318f180, type: 3} + m_Name: BuildScriptFastMode + m_EditorClassIdentifier: + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta b/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta new file mode 100644 index 000000000..a33286bb4 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a857241caf51864ea979ff7a1b17183 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset new file mode 100644 index 000000000..ec875f943 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset @@ -0,0 +1,20 @@ +%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: 3e2e0ffa088c91d41a086d0b8cb16bdc, type: 3} + m_Name: BuildScriptPackedMode + m_EditorClassIdentifier: + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta new file mode 100644 index 000000000..f3271a759 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7dd6b34ed361b004ba11cd6ce55c9ca5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset new file mode 100644 index 000000000..762884519 --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset @@ -0,0 +1,20 @@ +%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: ad8c280d42ee0ed41a27db23b43dd2bf, type: 3} + m_Name: BuildScriptPackedPlayMode + m_EditorClassIdentifier: + instanceProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider + sceneProviderType: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider diff --git a/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta new file mode 100644 index 000000000..e3e6efe6d --- /dev/null +++ b/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4225e246575e36a49bb918fbfe647cb1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DefaultObject.asset b/Assets/AddressableAssetsData/DefaultObject.asset new file mode 100644 index 000000000..0045f4ba6 --- /dev/null +++ b/Assets/AddressableAssetsData/DefaultObject.asset @@ -0,0 +1,15 @@ +%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: 3a189bb168d8d90478a09ea08c2f3d72, type: 3} + m_Name: DefaultObject + m_EditorClassIdentifier: + m_AddressableAssetSettingsGuid: 5d834588a5565d647a28b3027ed7f255 diff --git a/Assets/AddressableAssetsData/DefaultObject.asset.meta b/Assets/AddressableAssetsData/DefaultObject.asset.meta new file mode 100644 index 000000000..e075a3a26 --- /dev/null +++ b/Assets/AddressableAssetsData/DefaultObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f03eb8afe743ba2408eba2f226d4915f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset index edc10923d..734e891b8 100644 --- a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset @@ -48,6 +48,8 @@ MonoBehaviour: - sc.stylizedwater2.runtime - SingularityGroup.HotReload.Runtime - SingularityGroup.HotReload.Runtime.Public + - Sirenix.OdinInspector.Modules.Unity.Addressables + - Sirenix.OdinInspector.Modules.UnityLocalization - spine-csharp - spine-timeline - spine-unity diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset index 34d5c6f52..b5b6b057c 100644 --- a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset @@ -15,5 +15,9 @@ MonoBehaviour: configurations: - ID: Unity.Mathematics ActivationSettings: 0 + - ID: Unity.Localization + ActivationSettings: 0 + - ID: Unity.Addressables + ActivationSettings: 0 ModuleTogglingSettings: 1 ModuleUpdateSettings: 1 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.meta new file mode 100644 index 000000000..cca95bd93 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7264c703b339c141976b0f32b50383f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs new file mode 100644 index 000000000..dbf783fbf --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs @@ -0,0 +1,1276 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using Sirenix.OdinInspector; +using UnityEngine; + +[assembly: RegisterAssetReferenceAttributeForwardToChild(typeof(InlineEditorAttribute))] +[assembly: RegisterAssetReferenceAttributeForwardToChild(typeof(PreviewFieldAttribute))] + +namespace Sirenix.OdinInspector +{ + using System.Diagnostics; + + /// + /// DisallowAddressableSubAssetField is used on AssetReference properties, and disallows and prevents assigned sub-assets to the asset reference. + /// + /// + /// + /// [DisallowAddressableSubAssetField] + /// public AssetReference Reference; + /// + /// + /// + /// + [Conditional("UNITY_EDITOR")] + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.ReturnValue | AttributeTargets.Parameter)] + public class DisallowAddressableSubAssetFieldAttribute : Attribute + { + } + + /// + /// Registers an attribute to be applied to an AssetRefenece property, to be forwarded and applied to the AssetReference's child instead. + /// This allows attributes designed for use on UnityEngine.Objects to be used on AssetReference properties as well. + /// By default, InlineEditorAttribute and PreviewFieldAttribute are registered for forwarding. + /// + /// + /// + /// [assembly: Sirenix.OdinInspector.Modules.RegisterAssetReferenceAttributeForwardToChild(typeof(InlineEditorAttribute))] + /// [assembly: Sirenix.OdinInspector.Modules.RegisterAssetReferenceAttributeForwardToChild(typeof(PreviewFieldAttribute))] + /// + /// + /// + [Conditional("UNITY_EDITOR")] + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] + public class RegisterAssetReferenceAttributeForwardToChildAttribute : Attribute // TODO: Should this be a global attribute? + { + /// + /// The type of the attribute to forward. + /// + public readonly Type AttributeType; + + /// + /// Registers the specified attribute to be copied and applied to the AssetReference's UnityEngine.Object child instead. + /// + /// The attribute type to forward. + public RegisterAssetReferenceAttributeForwardToChildAttribute(Type attributeType) + { + this.AttributeType = attributeType; + } + } +} + +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + using Sirenix.OdinInspector.Editor; + using Sirenix.Serialization; + using Sirenix.Utilities; + using Sirenix.Utilities.Editor; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; + using UnityEditor; + using UnityEditor.AddressableAssets; + using UnityEditor.AddressableAssets.Settings; + using UnityEditor.AddressableAssets.GUI; + using UnityEngine; + using UnityEngine.AddressableAssets; + using System.Runtime.Serialization; + using System.IO; + + /// + /// Draws an AssetReference property. + /// + /// The concrete type of AssetReference to be drawn. For example, AssetReferenceTexture. + [DrawerPriority(0, 1, 0)] + public class AssetReferenceDrawer : OdinValueDrawer, IDefinesGenericMenuItems + where T : AssetReference + { + private bool hideAssetReferenceField; + private Type targetType; + private string NoneSelectedLabel; + //private string[] labelRestrictions; + private bool disallowSubAssets; + private bool showSubAssetField; + + private bool updateShowSubAssetField; + + private List restrictions; + + protected override bool CanDrawValueProperty(InspectorProperty property) + { + return property.GetAttribute() == null; + } + + protected override void Initialize() + { + // If a child exists, we draw that child instead of the AssetReference field. + if (this.Property.Children.Count > 0) + { + this.hideAssetReferenceField = true; + return; + } + + this.targetType = OdinAddressableUtility.GetAssetReferenceTargetType(typeof(T)); + + if (this.targetType == typeof(UnityEngine.Object)) + { + this.NoneSelectedLabel = "None (Addressable Asset)"; + } + else + { + this.NoneSelectedLabel = $"None (Addressable {this.targetType.GetNiceName()})"; + } + + this.restrictions = new List(); + foreach (var attr in this.Property.Attributes) + { + if (attr is AssetReferenceUIRestriction r) + { + this.restrictions.Add(r); + } + } + + this.disallowSubAssets = Property.GetAttribute() != null; + + this.updateShowSubAssetField = true; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + if (this.hideAssetReferenceField == false) + { + var value = ValueEntry.SmartValue; + + // Update showSubAssetField. + if (this.updateShowSubAssetField && Event.current.type == EventType.Layout) + { + if (value == null || value.AssetGUID == null || value.editorAsset == null) + { + this.showSubAssetField = false; + } + else if (string.IsNullOrEmpty(value.SubObjectName) == false) + { + this.showSubAssetField = true; + } + else if (this.disallowSubAssets) + { + this.showSubAssetField = false; + } + else + { + var path = AssetDatabase.GUIDToAssetPath(value.AssetGUID); + + if (path == null) + { + this.showSubAssetField = false; + } + else + { + this.showSubAssetField = AssetDatabase.LoadAllAssetRepresentationsAtPath(path).Length > 0; + } + } + + this.updateShowSubAssetField = false; + } + + var rect = SirenixEditorGUI.GetFeatureRichControlRect(label, out var controlId, out var _, out var valueRect); + + Rect mainRect = valueRect; + Rect subRect = default, subPickerRect = default; + + if (this.showSubAssetField) + { + subRect = mainRect.Split(1, 2).AddX(1); + mainRect = mainRect.Split(0, 2).SubXMax(1); + subPickerRect = subRect.AlignRight(16); + } + + var mainPickerRect = mainRect.AlignRight(16); + + // Cursor + EditorGUIUtility.AddCursorRect(mainPickerRect, MouseCursor.Link); + if (showSubAssetField) + { + EditorGUIUtility.AddCursorRect(subPickerRect, MouseCursor.Link); + } + + // Selector + if (GUI.Button(mainPickerRect, "", SirenixGUIStyles.None)) + { + OpenMainAssetSelector(valueRect); + } + if (showSubAssetField && GUI.Button(subPickerRect, "", SirenixGUIStyles.None)) + { + OpenSubAssetSelector(valueRect); + } + + // Ping + if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && mainRect.Contains(Event.current.mousePosition) && value != null && value.editorAsset != null) + { + EditorGUIUtility.PingObject(value.editorAsset); + } + + // Drag and drop + EditorGUI.BeginChangeCheck(); + var drop = DragAndDropUtilities.DropZone(rect, null, typeof(object), false, controlId); + if (EditorGUI.EndChangeCheck()) + { + T dropValue; + + if (!object.ReferenceEquals(drop, null) + && ConvertUtility.TryWeakConvert(drop, targetType, out object converted) + && converted is UnityEngine.Object obj + && obj != null) + { + dropValue = CreateAssetReferenceFrom(obj); + } + else + { + dropValue = drop as T; + } + + if (dropValue != null) + { + if (this.disallowSubAssets && string.IsNullOrEmpty(dropValue.SubObjectName) == false) + { + dropValue.SubObjectName = null; + } + + this.updateShowSubAssetField = true; + this.ValueEntry.SmartValue = dropValue; + } + } + + // Drawing + if (Event.current.type == EventType.Repaint) + { + GUIContent valueLabel; + if (value == null || string.IsNullOrEmpty(value.AssetGUID) || value.editorAsset == null) + { + valueLabel = GUIHelper.TempContent(NoneSelectedLabel); + } + else + { + valueLabel = GUIHelper.TempContent(value.editorAsset.name, AssetPreview.GetMiniThumbnail(value.editorAsset)); + } + + GUI.Label(mainRect, valueLabel, EditorStyles.objectField); + SdfIcons.DrawIcon(mainPickerRect.SetWidth(12), SdfIconType.Record2); + + if (this.showSubAssetField) + { + if (string.IsNullOrEmpty(value.SubObjectName) || value.editorAsset == null) + { + valueLabel = GUIHelper.TempContent(""); + } + else + { + valueLabel = GUIHelper.TempContent(value.SubObjectName); + } + + GUI.Label(subRect, valueLabel, EditorStyles.objectField); + SdfIcons.DrawIcon(subPickerRect.SetWidth(12), SdfIconType.Record2); + } + } + } + else + { + this.Property.Children[0].Draw(label); + } + } + + private void OpenMainAssetSelector(Rect rect) + { + var selector = new AddressableSelector("Select", this.targetType, this.restrictions, typeof(T)); + + selector.SelectionChanged += OnMainAssetSelect; + selector.SelectionConfirmed += OnMainAssetSelect; + + selector.ShowInPopup(rect); + } + + private void OpenSubAssetSelector(Rect rect) + { + if (this.ValueEntry.SmartValue == null || this.ValueEntry.SmartValue.AssetGUID == null) + return; + + var path = AssetDatabase.GUIDToAssetPath(this.ValueEntry.SmartValue.AssetGUID); + if (path == null) + return; + + var subAssets = AssetDatabase.LoadAllAssetRepresentationsAtPath(path); + + var items = new GenericSelectorItem[subAssets.Length + 1]; + items[0] = new GenericSelectorItem("", null); + for (int i = 0; i < subAssets.Length; i++) + { + items[i + 1] = new GenericSelectorItem(subAssets[i].name + " : " + subAssets[i].GetType().GetNiceName(), subAssets[i]); + } + + var selector = new GenericSelector("Select Sub Asset", false, items); + + selector.SelectionChanged += OnSubAssetSelect; + selector.SelectionConfirmed += OnSubAssetSelect; + + selector.ShowInPopup(rect); + } + + private void OnMainAssetSelect(IEnumerable selection) + { + var selected = selection.FirstOrDefault(); + this.ValueEntry.SmartValue = CreateAssetReferenceFrom(selected); + this.updateShowSubAssetField = true; + } + + private void OnSubAssetSelect(IEnumerable selection) + { + if (this.ValueEntry == null || this.ValueEntry.SmartValue.AssetGUID == null) + return; + + var selected = selection.FirstOrDefault(); + + this.ValueEntry.SmartValue.SetEditorSubObject(selected); + } + + private T CreateAssetReferenceFrom(AddressableAssetEntry entry) + { + if (entry != null) + { + return CreateAssetReferenceFrom(entry.TargetAsset); + } + else + { + return null; + } + } + + private T CreateAssetReferenceFrom(UnityEngine.Object obj) + { + var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(obj)); + + if (guid == null) return null; + + var instance = (T)Activator.CreateInstance(typeof(T), guid); + + if (this.disallowSubAssets == false && AssetDatabase.IsSubAsset(obj)) + { + instance.SetEditorSubObject(obj); + } + + return instance; + } + + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + genericMenu.AddItem(new GUIContent("Set To Null"), false, () => + { + this.ValueEntry.WeakSmartValue = null; + this.updateShowSubAssetField = true; + }); + + if (this.ValueEntry.SmartValue != null && string.IsNullOrEmpty(this.ValueEntry.SmartValue.SubObjectName) == false) + { + genericMenu.AddItem(new GUIContent("Remove Sub Asset"), false, () => + { + if (this.ValueEntry.SmartValue != null) + { + this.ValueEntry.SmartValue.SetEditorSubObject(null); + } + this.updateShowSubAssetField = true; + }); + } + else + { + genericMenu.AddDisabledItem(new GUIContent("Remove Sub Asset")); + } + + genericMenu.AddItem(new GUIContent("Open Groups Window"), false, OdinAddressableUtility.OpenGroupsWindow); + } + } + + /// + /// Draws an AssetLabelReference field. + /// + [DrawerPriority(0, 1, 0)] + public class AssetLabelReferenceDrawer : OdinValueDrawer, IDefinesGenericMenuItems + { + protected override bool CanDrawValueProperty(InspectorProperty property) + { + return property.GetAttribute() == null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + var rect = SirenixEditorGUI.GetFeatureRichControlRect(label, out var controlId, out var hasKeyboardFocus, out var valueRect); + + string valueLabel; + if (this.ValueEntry.SmartValue == null || string.IsNullOrEmpty(this.ValueEntry.SmartValue.labelString)) + { + valueLabel = ""; + } + else + { + valueLabel = this.ValueEntry.SmartValue.labelString; + } + + if (GUI.Button(valueRect, valueLabel, EditorStyles.popup)) + { + var selector = new AddressableLabelSelector(); + + selector.SelectionChanged += SetLabel; + selector.SelectionConfirmed += SetLabel; + + selector.ShowInPopup(valueRect); + } + } + + private void SetLabel(IEnumerable selection) + { + var selected = selection.FirstOrDefault(); + this.ValueEntry.SmartValue = new AssetLabelReference() + { + labelString = selected, + }; + } + + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + genericMenu.AddItem(new GUIContent("Set To Null"), false, () => property.ValueEntry.WeakSmartValue = null); + genericMenu.AddItem(new GUIContent("Open Label Window"), false, () => OdinAddressableUtility.OpenLabelsWindow()); + } + } + + /// + /// Odin Selector for Addressables. + /// + public class AddressableSelector : OdinSelector + { + //private static EditorPrefBool flatten = new EditorPrefBool("AddressablesSelector.Flatten", false); + + private static EditorPrefEnum listMode = new EditorPrefEnum("AddressablesSelector.ListMode", SelectorListMode.Group); + + private readonly string title; + private readonly Type filterType; + private readonly List restrictions; + private readonly AssetReference assetReferenceForValidating; + + public override string Title => this.title; + + /// + /// Initializes a AddressableSelector. + /// + /// The title of the selector. Set to null for no title. + /// The type of UnityEngine.Object to be selectable. For example, UnityEngine.Texture. For no restriction, set to UnityEngine.Object. + /// The Addressable labels to restrict the selector to. Set to null for no label restrictions. + /// Throws if the filter type is null. + public AddressableSelector(string title, Type filterType, List restrictions, Type assetReferenceType) + { + this.title = title; + this.filterType = filterType ?? throw new ArgumentNullException(nameof(filterType)); + this.restrictions = restrictions; + + if (assetReferenceType != null) + { + if (assetReferenceType.InheritsFrom() == false) + { + throw new ArgumentException("Must inherit AssetReference", nameof(assetReferenceType)); + } + else if (assetReferenceType.IsAbstract) + { + throw new ArgumentException("Cannot be abstract type.", nameof(assetReferenceType)); + } + + this.assetReferenceForValidating = (AssetReference)FormatterServices.GetUninitializedObject(assetReferenceType); + } + } + + protected override void DrawToolbar() + { + bool drawTitle = !string.IsNullOrEmpty(this.Title); + bool drawSearchToolbar = this.SelectionTree.Config.DrawSearchToolbar; + bool drawButton = this.DrawConfirmSelectionButton; + + if (drawTitle || drawSearchToolbar || drawButton) + { + SirenixEditorGUI.BeginHorizontalToolbar(this.SelectionTree.Config.SearchToolbarHeight); + { + DrawToolbarTitle(); + DrawToolbarSearch(); + EditorGUI.DrawRect(GUILayoutUtility.GetLastRect().AlignLeft(1), SirenixGUIStyles.BorderColor); + + SdfIconType icon; + if (listMode.Value == SelectorListMode.Path) + icon = SdfIconType.ListNested; + else if (listMode.Value == SelectorListMode.Group) + icon = SdfIconType.ListStars; + else if (listMode.Value == SelectorListMode.Flat) + icon = SdfIconType.List; + else + icon = SdfIconType.X; + + if (SirenixEditorGUI.ToolbarButton(icon, true)) + { + int m = (int)listMode.Value + 1; + + if (m >= (int)SelectorListMode.Max) + { + m = 0; + } + + listMode.Value = (SelectorListMode)m; + + this.RebuildMenuTree(); + } + + if (SirenixEditorGUI.ToolbarButton(SdfIconType.GearFill, true)) + { + OdinAddressableUtility.OpenGroupsWindow(); + } + + DrawToolbarConfirmButton(); + } + SirenixEditorGUI.EndHorizontalToolbar(); + } + } + + protected override void BuildSelectionTree(OdinMenuTree tree) + { + OdinMenuItem noneItem; + if (filterType == typeof(UnityEngine.Object)) + { + noneItem = new OdinMenuItem(tree, " (Addressable Asset)", null); + } + else + { + noneItem = new OdinMenuItem(tree, $" (Addressable {filterType.GetNiceName()})", null); + } + + noneItem.SdfIcon = SdfIconType.X; + tree.MenuItems.Add(noneItem); + tree.Config.SelectMenuItemsOnMouseDown = true; + + if (AddressableAssetSettingsDefaultObject.SettingsExists) + { + var settings = AddressableAssetSettingsDefaultObject.Settings; + + foreach (var group in settings.groups) + { + if (group == null || group.name == "Built In Data") continue; + + foreach (var entry in group.entries) + { + AddEntriesToTree(tree, group.name, entry); + } + } + } + + foreach (var i in tree.EnumerateTree().Skip(1)) + { + if (i.Value == null) + { + i.SdfIcon = SdfIconType.Folder; + } + } + } + + private void AddEntriesToTree(OdinMenuTree tree, string groupName, AddressableAssetEntry entry) + { + var asset = entry.TargetAsset; + + if (entry.IsFolder == false && asset.GetType().InheritsFrom(filterType) && PassesRestrictions(entry)) + { + string name; + if (listMode.Value == SelectorListMode.Group) + { + name = entry.address; + } + else if (listMode.Value == SelectorListMode.Path) + { + name = System.IO.Path.GetFileNameWithoutExtension(entry.AssetPath); + } + else if (listMode.Value == SelectorListMode.Flat) + { + name = entry.address; + } + else + { + throw new Exception("Unsupported list mode: " + listMode.Value); + } + + var item = new OdinMenuItem(tree, name, entry) + { + Icon = AssetPreview.GetMiniThumbnail(asset) + }; + + if (listMode.Value == SelectorListMode.Group) + { + OdinMenuItem groupItem = tree.GetMenuItem(groupName); + + if (groupItem == null) + { + groupItem = new OdinMenuItem(tree, groupName, null); + tree.MenuItems.Add(groupItem); + } + + if (entry.ParentEntry != null && entry.ParentEntry.IsFolder) + { + OdinMenuItem folderItem = null; + + for (int i = 0; i < groupItem.ChildMenuItems.Count; i++) + { + if (groupItem.ChildMenuItems[i].Name == entry.ParentEntry.address) + { + folderItem = groupItem.ChildMenuItems[i]; + break; + } + } + + if (folderItem == null) + { + folderItem = new OdinMenuItem(tree, entry.ParentEntry.address, null); + groupItem.ChildMenuItems.Add(folderItem); + } + + folderItem.ChildMenuItems.Add(item); + } + else + { + groupItem.ChildMenuItems.Add(item); + } + } + else if (listMode.Value == SelectorListMode.Path) + { + tree.AddMenuItemAtPath(System.IO.Path.GetDirectoryName(entry.AssetPath), item); + } + else if (listMode.Value == SelectorListMode.Flat) + { + tree.MenuItems.Add(item); + + } + } + + if (entry.IsFolder) + { + foreach (var e in entry.SubAssets) + { + AddEntriesToTree(tree, groupName, e); + } + } + } + + private bool PassesRestrictions(AddressableAssetEntry entry) + { + if (restrictions == null) return true; + + return OdinAddressableUtility.ValidateAssetReferenceRestrictions(restrictions, entry.MainAsset); + + //for (int i = 0; i < this.restrictions.Count; i++) + //{ + // if (this.restrictions[i].ValidateAsset(entry.AssetPath) == false) + // { + // return false; + // } + //} + + //return true; + + /* If for whatever reason Unity haven't actually implemented their restriction methods, then we can use this code to atleast implement label restriction. */ + //if (this.labelRestrictions == null) return true; + + //for (int i = 0; i < labelRestrictions.Length; i++) + //{ + // if (entry.labels.Contains(labelRestrictions[i])) return true; + //} + + //return false; + } + + private enum SelectorListMode + { + Group, + Path, + Flat, + + Max, + } + } + + public class AddressableLabelSelector : OdinSelector + { + protected override void DrawToolbar() + { + bool drawTitle = !string.IsNullOrEmpty(this.Title); + bool drawSearchToolbar = this.SelectionTree.Config.DrawSearchToolbar; + bool drawButton = this.DrawConfirmSelectionButton; + + if (drawTitle || drawSearchToolbar || drawButton) + { + SirenixEditorGUI.BeginHorizontalToolbar(this.SelectionTree.Config.SearchToolbarHeight); + { + DrawToolbarTitle(); + DrawToolbarSearch(); + EditorGUI.DrawRect(GUILayoutUtility.GetLastRect().AlignLeft(1), SirenixGUIStyles.BorderColor); + + if (SirenixEditorGUI.ToolbarButton(SdfIconType.GearFill, true)) + { + OdinAddressableUtility.OpenLabelsWindow(); + } + + DrawToolbarConfirmButton(); + } + SirenixEditorGUI.EndHorizontalToolbar(); + } + } + protected override void BuildSelectionTree(OdinMenuTree tree) + { + IList labels = null; + + if (AddressableAssetSettingsDefaultObject.SettingsExists) + { + var settings = AddressableAssetSettingsDefaultObject.Settings; + labels = settings.GetLabels(); + } + + if (labels == null) labels = Array.Empty(); + + tree.MenuItems.Add(new OdinMenuItem(tree, "", null)); + + for (int i = 0; i < labels.Count; i++) + { + tree.MenuItems.Add(new OdinMenuItem(tree, labels[i], labels[i])); + } + } + } + + /// + /// Resolves children for AssetReference properties, and implements the RegisterAssetReferenceAttributeForwardToChild behaviour. + /// + /// The concrete type of AssetReference to be drawn. For example, AssetReferenceTexture. + public class AssetReferencePropertyResolver : OdinPropertyResolver + where T : AssetReference + { + private static readonly Type[] attributesToForward; + + static AssetReferencePropertyResolver() + { + attributesToForward = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(x => x.GetCustomAttributes()) + .Cast() + .Select(x => x.AttributeType) + .ToArray(); + } + + public override int ChildNameToIndex(string name) + { + return 0; + } + + public override int ChildNameToIndex(ref StringSlice name) + { + return 0; + } + + public override InspectorPropertyInfo GetChildInfo(int childIndex) + { + var targetType = OdinAddressableUtility.GetAssetReferenceTargetType(typeof(T)); + var getterSetterType = typeof(AssetReferenceValueGetterSetter<>).MakeGenericType(typeof(T), targetType); + + var getterSetter = Activator.CreateInstance(getterSetterType) as IValueGetterSetter; + + List attributes = new List + { + new ShowInInspectorAttribute(), + }; + + foreach (var type in attributesToForward) + { + var attr = this.Property.Attributes.FirstOrDefault(x => x.GetType() == type); + if (attr != null) + { + attributes.Add(attr); + } + } + + string label = "Asset"; + + return InspectorPropertyInfo.CreateValue(label, 0, SerializationBackend.None, getterSetter, attributes); + } + + protected override int GetChildCount(T value) + { + foreach (var attr in attributesToForward) + { + if (this.Property.Attributes.Any(x => x.GetType() == attr)) + { + return 1; + } + } + + return 0; + } + + private class AssetReferenceValueGetterSetter : IValueGetterSetter + where TTarget : UnityEngine.Object + { + public bool IsReadonly => false; + + public Type OwnerType => typeof(T); + + public Type ValueType => typeof(TTarget); + + public TTarget GetValue(ref T owner) + { + var v = owner.editorAsset; + return v as TTarget; + } + + public object GetValue(object owner) + { + var v = (owner as T)?.editorAsset; + return v as TTarget; + } + + public void SetValue(ref T owner, TTarget value) + { + owner.SetEditorAsset(value); + } + + public void SetValue(object owner, object value) + { + (owner as T).SetEditorAsset(value as TTarget); + } + } + } + + /// + /// Processes attributes for AssetReference properties. + /// + /// The concrete type of AssetReference to be drawn. For example, AssetReferenceTexture. + public class AssetReferenceAttributeProcessor : OdinAttributeProcessor + where T : AssetReference + { + public override void ProcessSelfAttributes(InspectorProperty property, List attributes) + { + attributes.Add(new DoNotDrawAsReferenceAttribute()); + attributes.Add(new HideReferenceObjectPickerAttribute()); + attributes.Add(new SuppressInvalidAttributeErrorAttribute()); // TODO: Remove this with proper attribute forwarding support. + } + } + + /// + /// Processes attributes for AssetLabelReference properties. + /// + public class AssetLabelReferenceAttributeProcessor : OdinAttributeProcessor + { + public override void ProcessSelfAttributes(InspectorProperty property, List attributes) + { + attributes.Add(new DoNotDrawAsReferenceAttribute()); + attributes.Add(new HideReferenceObjectPickerAttribute()); + } + } + + /// + /// Implements conversion behaviour for addressables. + /// + [InitializeOnLoad] + internal class AssetReferenceConverter : ConvertUtility.ICustomConverter + { + private readonly Type type_AssetEntryTreeViewItem; + private WeakValueGetter get_AssetEntryTreeViewItem_entry; + + static AssetReferenceConverter() + { + ConvertUtility.AddCustomConverter(new AssetReferenceConverter()); + } + + public AssetReferenceConverter() + { + this.type_AssetEntryTreeViewItem = TwoWaySerializationBinder.Default.BindToType("UnityEditor.AddressableAssets.GUI.AssetEntryTreeViewItem") ?? throw new Exception("Failed to find UnityEditor.AddressableAssets.GUI.AddressableAssetEntryTreeViewItem type."); + var field_AssetEntryTreeViewItem_entry = type_AssetEntryTreeViewItem.GetField("entry", Flags.AllMembers) ?? throw new Exception("Failed to find entry field in UnityEditor.AddressableAssets.GUI.AddressableAssetEntryTreeViewItem type."); + this.get_AssetEntryTreeViewItem_entry = EmitUtilities.CreateWeakInstanceFieldGetter(type_AssetEntryTreeViewItem, field_AssetEntryTreeViewItem_entry); + } + + // UnityEngine.Object > AssetReference/T + // AddressableAssetEntry > AssetReference + // AssetReference/T > UnityEngine.Object + // AssetReference/T > AssetReference/T + // AddressableAssetEntry > UnityEngine.Object + + public bool CanConvert(Type from, Type to) + { + var comparer = FastTypeComparer.Instance; + + if (to.InheritsFrom(typeof(AssetReference))) + { + if (comparer.Equals(from, typeof(AddressableAssetEntry)) || comparer.Equals(from, type_AssetEntryTreeViewItem)) + { + return true; + } + else if (from.InheritsFrom()) + { + if (to.InheritsFrom(typeof(AssetReferenceT<>))) + { + var baseType = to.GetGenericBaseType(typeof(AssetReferenceT<>)); + + var targetType = baseType.GetGenericArguments()[0]; + + return from.InheritsFrom(targetType); + } + else + { + return true; + } + } + else if (from.InheritsFrom(typeof(AssetReference))) + { + return to.InheritsFrom(from); + } + else + { + return false; + } + } + else if (from.InheritsFrom(typeof(AssetReference)) && to.InheritsFrom()) + { + return false; + } + else + { + return false; + } + } + + public bool TryConvert(object obj, Type to, out object result) + { + if (obj == null) + { + result = null; + return false; + } + + var comparer = FastTypeComparer.Instance; + + // AssetEntryTreeViewItems is a UI element container for AddressableAssetEntry. + // With this we can just treat AssetEntryTreeViewItems as an AddressableAssetEntry. + if (comparer.Equals(obj.GetType(), type_AssetEntryTreeViewItem)) + { + obj = get_AssetEntryTreeViewItem_entry(ref obj); + } + + if (to.InheritsFrom(typeof(AssetReference))) + { + Type assetType; + if (to.InheritsFrom(typeof(AssetReferenceT<>))) + { + var baseType = to.GetGenericBaseType(typeof(AssetReferenceT<>)); + assetType = baseType.GetGenericArguments()[0]; + } + else + { + assetType = typeof(UnityEngine.Object); + } + + if (obj is UnityEngine.Object uObj) + { + if (obj.GetType().InheritsFrom(assetType)) + { + string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(uObj)); + + if (string.IsNullOrEmpty(guid) == false) + { + + result = CreateReference(to, uObj); + return true; + } + else + { + result = null; + return false; + } + } + else + { + result = null; + return false; + } + } + else if (obj is AddressableAssetEntry entry) + { + if (entry.TargetAsset.GetType().InheritsFrom(assetType)) + { + result = CreateReference(to, entry.TargetAsset); + return true; + + } + else + { + result = null; + return false; + } + } + else if (obj is AssetReference reference) + { + if (TryGetReferencedAsset(reference, assetType, out var asset)) + { + result = CreateReference(to, asset); + return true; + } + else + { + result = null; + return false; + } + } + else + { + result = null; + return false; + } + } + else if (to.InheritsFrom(typeof(UnityEngine.Object)) && obj is AssetReference reference) + { + if (TryGetReferencedAsset(reference, to, out var asset)) + { + result = asset; + return true; + } + else + { + result = null; + return false; + } + } + else if (to.InheritsFrom(typeof(UnityEngine.Object)) && obj is AddressableAssetEntry entry) + { + var target = entry.TargetAsset; + if (target == null) + { + result = null; + return false; + } + else if (target.GetType().InheritsFrom(to)) + { + result = target; + return true; + } + else if (ConvertUtility.TryWeakConvert(target, to, out var converted)) + { + result = converted; + return true; + } + else + { + result = null; + return false; + } + } + else + { + result = null; + return false; + } + } + + private bool TryGetReferencedAsset(AssetReference reference, Type to, out UnityEngine.Object asset) + { + if (reference.AssetGUID == null) + { + asset = null; + return false; + } + + var path = AssetDatabase.GUIDToAssetPath(reference.AssetGUID); + + if (reference.SubObjectName != null) + { + asset = null; + var subassets = AssetDatabase.LoadAllAssetRepresentationsAtPath(path); + + for (int i = 0; i < subassets.Length; i++) + { + if (subassets[i].name == reference.SubObjectName) + { + asset = subassets[i]; + break; + } + } + } + else + { + asset = AssetDatabase.LoadAssetAtPath(path); + } + + if (asset != null) + { + if (asset.GetType().InheritsFrom(to)) + { + return true; + } + else if (ConvertUtility.TryWeakConvert(asset, to, out var converted)) + { + asset = (UnityEngine.Object)converted; + return true; + } + else + { + asset = null; + return false; + } + } + else + { + return false; + } + } + + private AssetReference CreateReference(Type type, UnityEngine.Object obj) + { + var reference = (AssetReference)Activator.CreateInstance(type, new string[] { AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(obj)) }); + if (AssetDatabase.IsSubAsset(obj)) + { + reference.SetEditorAsset(obj); + } + + return reference; + } + } + + /// + /// Odin Inspector utility methods for working with addressables. + /// + public static class OdinAddressableUtility + { + private readonly static Action openAddressableWindowAction; + + static OdinAddressableUtility() + { + var type = TwoWaySerializationBinder.Default.BindToType("UnityEditor.AddressableAssets.GUI.AddressableAssetsWindow") ?? throw new Exception(""); + var method = type.GetMethod("Init", Flags.AllMembers) ?? throw new Exception(""); + openAddressableWindowAction = (Action)Delegate.CreateDelegate(typeof(Action), method); + + } + + /// + /// Opens the addressables group settings window. + /// + public static void OpenGroupsWindow() + { + openAddressableWindowAction(); + } + + /// + /// Opens the addressables labels settings window. + /// + public static void OpenLabelsWindow() + { + if (!AddressableAssetSettingsDefaultObject.SettingsExists) return; + EditorWindow.GetWindow().Intialize(AddressableAssetSettingsDefaultObject.Settings); + } + + /// + /// Converts the specified object into an addressable. + /// + /// The object to make addressable. + /// The addressable group to add the object to. + public static void MakeAddressable(UnityEngine.Object obj, AddressableAssetGroup group) + { + if (!AddressableAssetSettingsDefaultObject.SettingsExists) return; + + var settings = AddressableAssetSettingsDefaultObject.Settings; + var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(obj)); + var entry = settings.CreateOrMoveEntry(guid, group, false, false); + entry.address = AssetDatabase.GUIDToAssetPath(guid); + settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryCreated, entry, false, true); + } + + /// + /// Gets the type targeted by an AssetReference type. For example, returns Texture for AssetReferenceTexture. + /// Returns UnityEngine.Object for AssetReference type. + /// + /// A type of AssetReference, for example, AssetReferenceTexture. + /// + /// If the given type inherits AssetRefernceT<T>, then the method returns the generic T argument. + /// If the given type is AssetReference, then the method returns UnityEngine.Object. + /// + /// Throws if given parameter is null. + /// Throws if the given type does not inherit or is AssetReference. + public static Type GetAssetReferenceTargetType(Type assetReferenceType) + { + if (assetReferenceType == null) throw new ArgumentNullException(nameof(assetReferenceType)); + + if (assetReferenceType.InheritsFrom(typeof(AssetReferenceT<>))) + { + var genericBase = assetReferenceType.GetGenericBaseType(typeof(AssetReferenceT<>)); + return genericBase.GetGenericArguments()[0]; + } + else + { + return typeof(UnityEngine.Object); + } + } + + /// + /// Validate an asset against a list of AssetReferenceUIRestrictions. + /// + /// The restrictions to apply. + /// The asset to validate. + /// Returns true if the asset passes all restrictions. Otherwise false. + /// Throws if Addressable Settings have not been created. + /// Throws if restrictions or asset is null. + public static bool ValidateAssetReferenceRestrictions(List restrictions, UnityEngine.Object asset) + { + return ValidateAssetReferenceRestrictions(restrictions, asset, out _); + } + + /// + /// Validate an asset against a list of AssetReferenceUIRestrictions. + /// + /// The restrictions to apply. + /// The asset to validate. + /// The first failed restriction. null if no restrictions failed. + /// Returns true if the asset passes all restrictions. Otherwise false. + /// Throws if Addressable Settings have not been created. + /// Throws if restrictions or asset is null. + public static bool ValidateAssetReferenceRestrictions(List restrictions, UnityEngine.Object asset, out AssetReferenceUIRestriction failedRestriction) + { + if (AddressableAssetSettingsDefaultObject.SettingsExists == false) throw new Exception("Addressable Settings have not been created."); + + _ = restrictions ?? throw new ArgumentNullException(nameof(restrictions)); + _ = asset ?? throw new ArgumentNullException(nameof(asset)); + + for (int i = 0; i < restrictions.Count; i++) + { + if (restrictions[i] is AssetReferenceUILabelRestriction labels) + { + /* Unity, in all its wisdom, have apparently decided not to implement their AssetReferenceRestriction attributes in some versions(?) + * So, to compensate, we're going to manually validate the label restriction attribute, so atleast that works. */ + + var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(asset)); + + var entry = AddressableAssetSettingsDefaultObject.Settings.FindAssetEntry(guid, true); + + if (entry.labels.Any(x => labels.m_AllowedLabels.Contains(x)) == false) + { + failedRestriction = labels; + return false; + } + } + else if (restrictions[i].ValidateAsset(asset) == false) + { + failedRestriction = restrictions[i]; + return false; + } + } + + failedRestriction = null; + return true; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs.meta new file mode 100644 index 000000000..66d12eec5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ba1664ec1a0467641a742eaadae146d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef new file mode 100644 index 000000000..7be66dce6 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef @@ -0,0 +1,29 @@ +{ + "name": "Sirenix.OdinInspector.Modules.Unity.Addressables", + "references": [ + "Unity.Addressables", + "Unity.Addressables.Editor", + "Sirenix.Serialization", + "Sirenix.OdinInspector.Attributes", + "Sirenix.OdinInspector.Editor", + "Sirenix.Utilities.Editor", + "Sirenix.Utilities", + "Sirenix.OdinValidator.Editor" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [ + "Sirenix.Serialization.dll", + "Sirenix.OdinInspector.Attributes.dll", + "Sirenix.OdinInspector.Editor.dll", + "Sirenix.Utilities.Editor.dll", + "Sirenix.Utilities.dll", + "Sirenix.OdinValidator.Editor.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta new file mode 100644 index 000000000..f7deb1dca --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3b4d8e09c665bfa47849130d8695171e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators.meta new file mode 100644 index 000000000..05862c291 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b568c1d508ce0b74eb0025b8501d1c1e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs new file mode 100644 index 000000000..82f677b09 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR + +using UnityEngine; +using UnityEditor.AddressableAssets; +using Sirenix.OdinInspector.Editor.Validation; +using UnityEngine.AddressableAssets; +using Sirenix.OdinInspector.Modules.Addressables.Editor; + +#if ODIN_VALIDATOR_3_1 +[assembly: RegisterValidationRule(typeof(AssetLabelReferenceValidator), Description = + "This validator ensures that AssetLabelReferences marked with the Required attribute display an error " + + "message if they are not set. It can also be configured to require that all AssetLabelReferences be set " + + "by default; the Optional attribute can then be used to exclude specific AssetLabelReferences from " + + "validation.")] +#else +[assembly: RegisterValidator(typeof(AssetLabelReferenceValidator))] +#endif + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + /// + /// Validator for AssetLabelReference values. + /// + public class AssetLabelReferenceValidator : ValueValidator + { + [Tooltip("If enabled, the validator will display an error message if the AssetLabelReference is not set. " + + "If disabled, the validator will only display an error message if the AssetLabelReference is set, but the " + + "assigned label does not exist.")] + [ToggleLeft] + public bool RequiredByDefault; + + private bool required; + private bool optional; + private string requiredMessage; + + protected override void Initialize() + { + var requiredAttr = this.Property.GetAttribute(); + + this.requiredMessage = requiredAttr?.ErrorMessage ?? $"{this.Property.NiceName} is required."; + + if (this.RequiredByDefault) + { + required = true; + optional = Property.GetAttribute() != null; + } + else + { + required = requiredAttr != null; + optional = false; + } + } + + protected override void Validate(ValidationResult result) + { + // If the Addressables settings have not been created, nothing else is really valid. + if (AddressableAssetSettingsDefaultObject.SettingsExists == false) + { + result.AddError("Addressables Settings have not been created.") + .WithButton("Open Settings Window", () => OdinAddressableUtility.OpenGroupsWindow()); + return; + } + + var value = Value?.labelString; + + if (string.IsNullOrEmpty(value)) + { + if (optional == false && required) // Optional == false & required? Nice. + { + result.AddError(requiredMessage).EnableRichText(); + } + } + else + { + var labels = AddressableAssetSettingsDefaultObject.Settings.GetLabels(); + + if (labels.Contains(value) == false) + { + result.AddError($"Label {value} has not been created as a label.") + .WithButton("Open Label Settings", () => OdinAddressableUtility.OpenLabelsWindow()); + } + } + } + } + +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs.meta new file mode 100644 index 000000000..c9b6cfc0d --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetLabelReferenceValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fcaf7dc3b9a98a545b301a1ea175055b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs new file mode 100644 index 000000000..5a335c3c8 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs @@ -0,0 +1,280 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR + +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.AddressableAssets; +using Sirenix.OdinInspector.Editor.Validation; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine.AddressableAssets; +using Sirenix.OdinInspector.Modules.Addressables.Editor; + +#if ODIN_VALIDATOR_3_1 +[assembly: RegisterValidationRule(typeof(AssetReferenceValidator), Description = + "This validator provides robust integrity checks for your asset references within Unity. " + + "It validates whether an asset reference has been assigned, and if it's missing, raises an error. " + + "It further checks the existence of the main asset at the assigned path, ensuring it hasn't been " + + "inadvertently deleted or moved. The validator also verifies if the assigned asset is addressable " + + "and, if not, offers a fix to make it addressable. Moreover, it ensures the asset adheres to " + + "specific label restrictions set through the AssetReferenceUILabelRestriction attribute. " + + "Lastly, it performs checks on any sub-object linked to the asset, making sure it hasn't gone missing. " + + "This comprehensive validation system prevents hard-to-spot bugs and errors, " + + "fostering a more robust and efficient development workflow.")] +#else +[assembly: RegisterValidator(typeof(AssetReferenceValidator))] +#endif + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + public class AssetReferenceValidator : ValueValidator + { + [Tooltip("If true and the AssetReference is not marked with the Optional attribute, " + + "the validator will display an error message if the AssetReference is not set. " + + "If false, the validator will only display an error message if the AssetReference is set, " + + "but the assigned asset does not exist.")] + [ToggleLeft] + public bool RequiredByDefault; + + private bool required; + private bool optional; + private string requiredMessage; + + private List restrictions; + + protected override void Initialize() + { + var requiredAttr = this.Property.GetAttribute(); + + this.requiredMessage = requiredAttr?.ErrorMessage ?? $"{this.Property.NiceName} is required."; + + if (this.RequiredByDefault) + { + this.required = true; + this.optional = this.Property.GetAttribute() != null; + } + else + { + this.required = requiredAttr != null; + this.optional = false; + } + + this.restrictions = new List(); + foreach (var attr in this.Property.Attributes) + { + if (attr is AssetReferenceUIRestriction r) + { + this.restrictions.Add(r); + } + } + } + + protected override void Validate(ValidationResult result) + { + // If the Addressables settings have not been created, nothing else is really valid. + if (AddressableAssetSettingsDefaultObject.SettingsExists == false) + { + result.AddError("Addressables Settings have not been created.") + .WithButton("Open Settings Window", () => OdinAddressableUtility.OpenGroupsWindow()); + return; + } + + var assetReference = this.Value; + var assetReferenceHasBeenAssigned = !string.IsNullOrEmpty(assetReference?.AssetGUID); + + // No item has been assigned. + if (!assetReferenceHasBeenAssigned) + { + if (optional == false && required) // Optional == false & required? Nice. + { + result.AddError(this.requiredMessage).EnableRichText(); + } + + return; + } + + var assetPath = AssetDatabase.GUIDToAssetPath(assetReference.AssetGUID); + var mainAsset = AssetDatabase.LoadMainAssetAtPath(assetPath); + + // The item has been assigned, but is now missing. + if (mainAsset == null) + { + result.AddError($"The previously assigned main asset with path '{assetPath}' is missing. GUID '{assetReference.AssetGUID}'"); + return; + } + + var addressableAssetEntry = AddressableAssetSettingsDefaultObject.Settings.FindAssetEntry(assetReference.AssetGUID, true); + var isAddressable = addressableAssetEntry != null; + + // Somehow an item sneaked through all of unity's validation measures and ended up not being addressable + // while still ending up in the asset reference object field. + if (!isAddressable) + { + result.AddError("Assigned item is not addressable.") + .WithFix("Make Addressable", args => OdinAddressableUtility.MakeAddressable(mainAsset, args.Group)); + } + // Check the assigned item against any and all label restrictions. + else + { + if (OdinAddressableUtility.ValidateAssetReferenceRestrictions(restrictions, mainAsset, out var failedRestriction) == false) + { + if (failedRestriction is AssetReferenceUILabelRestriction labelRestriction) + { + result.AddError($"Asset reference is restricted to items with these specific labels '{string.Join(", ", labelRestriction.m_AllowedLabels)}'. The currently assigned item has none of them.") + .WithFix("Add Labels", args => SetLabels(mainAsset, args.AssetLabels)); + } + else + { + result.AddError("Restriction failed: " + failedRestriction.ToString()); + } + } + } + + // The assigned item had a sub object, but it's missing. + if (!string.IsNullOrEmpty(assetReference.SubObjectName)) + { + var subObjects = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath); + + var hasMissingSubObject = true; + + foreach (var subObject in subObjects) + { + if (subObject.name == assetReference.SubObjectName) + { + hasMissingSubObject = false; + break; + } + } + + if (hasMissingSubObject) + { + result.AddError($"The previously assigned sub asset with name '{assetReference.SubObjectName}' is missing.").EnableRichText(); + } + } + + if (assetReference.ValidateAsset(mainAsset) || assetReference.ValidateAsset(assetPath)) + return; + + if (assetReference is AssetReferenceSprite && assetReference.editorAsset is Sprite) + return; + + result.AddError($"{assetReference.GetType().GetNiceFullName()}.ValidateAsset failed to validate assigned asset."); + } + + private static void SetLabels(UnityEngine.Object obj, List assetLabels) + { + if (!AddressableAssetSettingsDefaultObject.SettingsExists) return; + + var settings = AddressableAssetSettingsDefaultObject.Settings; + var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(obj)); + var entry = settings.FindAssetEntry(guid, false); + + foreach (var assetLabel in assetLabels.Where(a => a.Toggled)) + { + entry.SetLabel(assetLabel.Label, true, false, false); + } + + settings.SetDirty(AddressableAssetSettings.ModificationEvent.LabelAdded, entry, false, true); + } + + private class MakeAddressableFixArgs + { + [ValueDropdown(nameof(GetGroups))] + [OnInspectorInit(nameof(SelectDefault))] + public AddressableAssetGroup Group; + + private void SelectDefault() + { + this.Group = AddressableAssetSettingsDefaultObject.SettingsExists + ? AddressableAssetSettingsDefaultObject.Settings.DefaultGroup + : null; + } + + private static IEnumerable GetGroups() + { + return !AddressableAssetSettingsDefaultObject.SettingsExists + ? Enumerable.Empty() + : AddressableAssetSettingsDefaultObject.Settings.groups + .Where(group => !group.ReadOnly) + .Select(group => new ValueDropdownItem(group.Name, group)); + } + + [Button(SdfIconType.ListNested), PropertySpace(8f)] + private void OpenAddressablesGroups() => OdinAddressableUtility.OpenGroupsWindow(); + } + + private class AddLabelsFixArgs + { + [HideIf("@true")] + public List AssetLabels + { + get + { + if (!AddressableAssetSettingsDefaultObject.SettingsExists) return this.assetLabels; + + var settings = AddressableAssetSettingsDefaultObject.Settings; + var labels = settings + .GetLabels() + .Select(l => new AssetLabel { Label = l, Toggled = false }) + .ToList(); + + foreach (var assetLabel in this.assetLabels) + { + var label = labels.FirstOrDefault(l => l.Label == assetLabel.Label); + + if (label != null) + { + label.Toggled = assetLabel.Toggled; + } + } + + this.assetLabels = labels; + return this.assetLabels; + } + } + + private List assetLabels = new List(); + + [OnInspectorGUI] + private void Draw() + { + var togglesRect = EditorGUILayout.GetControlRect(false, Mathf.CeilToInt(this.AssetLabels.Count / 2f) * 20f); + + for (var i = 0; i < this.AssetLabels.Count; i++) + { + var assetLabel = this.AssetLabels[i]; + var toggleRect = togglesRect.SplitGrid(togglesRect.width / 2f, 20, i); + assetLabel.Toggled = GUI.Toggle(toggleRect, assetLabel.Toggled, assetLabel.Label); + } + + if (!AddressableAssetSettingsDefaultObject.SettingsExists) return; + + GUILayout.Space(8f); + + var buttonsRect = EditorGUILayout.GetControlRect(false, 20f); + + if (SirenixEditorGUI.SDFIconButton(buttonsRect, "Open Addressables Labels", SdfIconType.TagsFill)) + { + OdinAddressableUtility.OpenLabelsWindow(); + } + } + } + + private class AssetLabel + { + public bool Toggled; + public string Label; + } + } + +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs.meta new file mode 100644 index 000000000..44421787c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/AssetReferenceValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b44b08a1f58a83149988fde5ac600fe4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs new file mode 100644 index 000000000..2275f1106 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs @@ -0,0 +1,201 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR && ODIN_VALIDATOR_3_1 + +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.AddressableAssets; +using Sirenix.OdinInspector.Editor.Validation; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor.AddressableAssets.Settings; +using System.Collections; +using System; +using Sirenix.OdinValidator.Editor; +using Sirenix.OdinInspector.Modules.Addressables.Editor; + +[assembly: RegisterValidationRule(typeof(CheckDuplicateBundleDependenciesValidator), + Description = "This validator detects potential duplicate asset dependencies in an addressable group, without the need for a build. " + + "For instance, imagine two prefabs in separate groups, both referencing the same material. Each group would then include the material " + + "and all its associated dependencies. " + + "To address this, the material should be marked as Addressable, either with one of the prefabs or in a distinct group.\n\n" + + "Fixes: Executing the fix will make the dependency addressable and move it to the specified group.\n\n" + + "Exceptions: It's important to note that duplicate assets aren't inherently problematic. For example, if certain assets are " + + "never accessed by the same user group, such as region-specific assets, these duplications might be desired or at least inconsequential. " + + "As every project is unique, decisions concerning duplicate asset dependencies should be considered on a case-by-case basis.")] + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + public class CheckDuplicateBundleDependenciesValidator : GlobalValidator + { + private static Dictionary> dependencyGroupMap = new Dictionary>(); + + [Tooltip("The severity of the validation result.")] + public ValidatorSeverity ValidatorSeverity = ValidatorSeverity.Warning; + + [Tooltip("Assets to ignore when validating.")] + [LabelText("Ignored GUIDs"), CustomValueDrawer(nameof(DrawGUIDEntry))] + public List IgnoredGUIDs = new List(); + + public override IEnumerable RunValidation(ValidationResult result) + { + dependencyGroupMap.Clear(); + + var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings; + + if (addressableAssetSettings == null) yield break; + + foreach (var addressableAssetGroup in addressableAssetSettings.groups) + { + if (addressableAssetGroup == null) continue; + + foreach (var addressableAssetEntry in addressableAssetGroup.entries) + { + var dependencyAssetPaths = AssetDatabase.GetDependencies(addressableAssetEntry.AssetPath) + .Where(assetPath => !assetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) && + !assetPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)); + + foreach (var dependencyAssetPath in dependencyAssetPaths) + { + var dependencyGUID = new GUID(AssetDatabase.AssetPathToGUID(dependencyAssetPath)); + + if (this.IgnoredGUIDs.Contains(dependencyGUID.ToString())) continue; + + var dependencyAddressableAssetEntry = addressableAssetSettings.FindAssetEntry(dependencyGUID.ToString()); + + var isAddressable = dependencyAddressableAssetEntry != null; + if (isAddressable) continue; + + if (!dependencyGroupMap.ContainsKey(dependencyGUID)) + { + dependencyGroupMap.Add(dependencyGUID, new List()); + } + + if (!dependencyGroupMap[dependencyGUID].Contains(addressableAssetGroup.Name)) + { + dependencyGroupMap[dependencyGUID].Add(addressableAssetGroup.Name); + } + } + } + } + + foreach (var kvp in dependencyGroupMap) + { + var dependencyGUID = kvp.Key; + var groups = kvp.Value; + + if (groups.Count > 1) + { + var assetPath = AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString()); + var message = $"{assetPath} is duplicated in these groups: {string.Join(", ", groups)}"; + + result.Add(this.ValidatorSeverity, message).WithFix(args => + { + if (args.FixChoice == FixChoice.Ignore) + { + var sourceType = args.IgnoreForEveryone ? ConfigSourceType.Project : ConfigSourceType.Local; + var data = RuleConfig.Instance.GetRuleData(sourceType); + data.IgnoredGUIDs.Add(dependencyGUID.ToString()); + RuleConfig.Instance.SetAndSaveRuleData(data, sourceType); + return; + } + + var obj = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)); + AddressableAssetGroup group; + + if (args.Group == "Create New Group") + { + if (args.GroupName.IsNullOrWhitespace()) return; + + group = addressableAssetSettings.FindGroup(args.GroupName); + + if (group == null) + { + group = addressableAssetSettings.CreateGroup(args.GroupName, false, false, false, null); + } + } + else + { + group = addressableAssetSettings.FindGroup(args.Group); + + if (group == null) + { + group = addressableAssetSettings.CreateGroup(args.Group, false, false, false, null); + } + } + + OdinAddressableUtility.MakeAddressable(obj, group); + }, false).WithModifyRuleDataContextClick("Ignore", data => + { + data.IgnoredGUIDs.Add(dependencyGUID.ToString()); + }).SetSelectionObject(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString()))); + } + } + } + + private string DrawGUIDEntry(string guid) + { + var assetPath = AssetDatabase.GUIDToAssetPath(guid); + EditorGUILayout.TextArea(assetPath, SirenixGUIStyles.MultiLineLabel); + EditorGUILayout.TextField(guid); + return guid; + } + + private enum FixChoice + { + AddToGroup, + Ignore, + } + + private class FixArgs + { + [EnumToggleButtons, HideLabel] + public FixChoice FixChoice; + + [PropertySpace(10)] + [ValueDropdown("Groups")] + //[Title("Group To Add To", TitleAlignment = TitleAlignments.Centered)] + [ShowIf(nameof(FixChoice), FixChoice.AddToGroup, Animate = false)] + public string Group = "Duplicate Asset Isolation"; + + [ValidateInput(nameof(ValidateGroupName), "The group name cannot be empty")] + [ShowIf(nameof(ShowNewGroupName), Animate = false)] + public string GroupName; + + [LabelWidth(120f)] + [PropertySpace(10)] + [ShowIf("FixChoice", FixChoice.Ignore, Animate = false)] + public bool IgnoreForEveryone = true; + + [OnInspectorGUI] + [PropertySpace(10)] + [DetailedInfoBox("Note that duplicate assets may not always be an issue", "Note that duplicate assets may not always be an issue. If assets will never be requested by the same set of users (for example, region-specific assets), then duplicate dependencies may be desired, or at least inconsequential. Each Project is unique, so fixing duplicate asset dependencies should be evaluated on a case by case basis")] + private void Dummy() { } + + private bool ShowNewGroupName => this.FixChoice != FixChoice.Ignore && this.Group == "Create New Group"; + + private bool ValidateGroupName() => !this.GroupName.IsNullOrWhitespace(); + + private IEnumerable Groups() + { + var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings; + + return addressableAssetSettings == null + ? Enumerable.Empty() + : addressableAssetSettings.groups + .Where(group => group != null && group.Name != "Built In Data") + .Select(group => group.Name) + .Append("Duplicate Asset Isolation") + .Prepend("Create New Group"); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs.meta new file mode 100644 index 000000000..f7d4e44a8 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckDuplicateBundleDependenciesValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bdc8ee2cf75a17644a0bd81a965cc2e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs new file mode 100644 index 000000000..0e0390eae --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs @@ -0,0 +1,171 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR && ODIN_VALIDATOR_3_1 + +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.AddressableAssets; +using Sirenix.OdinInspector.Editor.Validation; +using Sirenix.Utilities.Editor; +using System.Collections; +using System; +using System.IO; +using Sirenix.OdinValidator.Editor; +using Sirenix.OdinInspector.Modules.Addressables.Editor; + +[assembly: RegisterValidationRule(typeof(CheckResourcesToAddressableDuplicateDependenciesValidator), + Description = "This validator identifies dependencies that are duplicated in both addressable groups and the \"Resources\" folder.\n\n" + + "These duplications mean that data will be included in both the application build and the addressables build.\n\n" + + "You can decide to simply ignore these duplicated dependencies if this behavior is desired, or use the provided fix " + + "to move the asset outside of the \"Resources\" folder.")] + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + public class CheckResourcesToAddressableDuplicateDependenciesValidator : GlobalValidator + { + [Tooltip("The severity of the validation result.")] + public ValidatorSeverity ValidatorSeverity = ValidatorSeverity.Warning; + + [Tooltip("Assets to ignore when validating.")] + [LabelText("Ignored GUIDs"), CustomValueDrawer(nameof(DrawGUIDEntry))] + public List IgnoredGUIDs = new List(); + + public override IEnumerable RunValidation(ValidationResult result) + { + var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings; + + if (addressableAssetSettings == null) yield break; + + foreach (var addressableAssetGroup in addressableAssetSettings.groups) + { + if (addressableAssetGroup == null) continue; + + foreach (var addressableAssetEntry in addressableAssetGroup.entries) + { + var dependencyAssetPaths = AssetDatabase.GetDependencies(addressableAssetEntry.AssetPath) + .Where(assetPath => !assetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) && + !assetPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)); + + foreach (var dependencyAssetPath in dependencyAssetPaths) + { + var dependencyGUID = new GUID(AssetDatabase.AssetPathToGUID(dependencyAssetPath)); + + if (this.IgnoredGUIDs.Contains(dependencyGUID.ToString())) continue; + + var dependencyAddressableAssetEntry = addressableAssetSettings.FindAssetEntry(dependencyGUID.ToString()); + + var isAddressable = dependencyAddressableAssetEntry != null; + if (isAddressable) continue; + if (!IsInsideResourcesFolder(dependencyAssetPath)) continue; + + result.Add(this.ValidatorSeverity, $"{dependencyAssetPath} is duplicated in addressable data and resource folders.") + .WithFix(args => + { + if (args.FixChoice == FixChoice.Ignore) + { + var sourceType = args.IgnoreForEveryone ? ConfigSourceType.Project : ConfigSourceType.Local; + var data = RuleConfig.Instance.GetRuleData(sourceType); + data.IgnoredGUIDs.Add(dependencyGUID.ToString()); + RuleConfig.Instance.SetAndSaveRuleData(data, sourceType); + return; + } + + if (!ValidNewFolder(args.NewFolder, out _)) return; + + if (!AssetDatabase.IsValidFolder(args.NewFolder)) + { + Directory.CreateDirectory(new DirectoryInfo(args.NewFolder).FullName); + AssetDatabase.Refresh(); + } + + var newPath = $"{args.NewFolder}/{Path.GetFileName(dependencyAssetPath)}"; + AssetDatabase.MoveAsset(dependencyAssetPath, newPath); + }, false).WithModifyRuleDataContextClick("Ignore", data => + { + data.IgnoredGUIDs.Add(dependencyGUID.ToString()); + }).SetSelectionObject(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(dependencyGUID.ToString()))); + + yield break; + } + } + } + } + + private string DrawGUIDEntry(string guid) + { + var assetPath = AssetDatabase.GUIDToAssetPath(guid); + EditorGUILayout.TextArea(assetPath, SirenixGUIStyles.MultiLineLabel); + EditorGUILayout.TextField(guid); + return guid; + } + + private static bool IsInsideResourcesFolder(string path) + { + var pathElements = path.Split('/'); + + foreach (var pathElement in pathElements) + { + if (pathElement.Equals("Resources", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + private static bool ValidNewFolder(string path, out string message) + { + if (IsInsideResourcesFolder(path)) + { + message = "The asset cannot be moved into a 'Resources' folder"; + return false; + } + + if (!path.StartsWith("Assets/")) + { + message = "The asset must be inside the 'Assets' folder"; + return false; + } + + message = "The folder is valid"; + return true; + } + + private enum FixChoice + { + MoveAsset, + Ignore, + } + private class FixArgs + { + [HideLabel] + [EnumToggleButtons] + public FixChoice FixChoice; + + [FolderPath] + [PropertySpace(10)] + [ValidateInput(nameof(ValidateFolderPath))] + [ShowIf("FixChoice", FixChoice.MoveAsset, Animate = false)] + public string NewFolder = "Assets/Resources_moved"; + + [LabelWidth(120f)] + [PropertySpace(10)] + [ShowIf("FixChoice", FixChoice.Ignore, Animate = false)] + public bool IgnoreForEveryone = true; + + private bool ValidateFolderPath(string path, ref string message) + { + return ValidNewFolder(path, out message); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta new file mode 100644 index 000000000..a2bc61e20 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f75aebe03a9aa4a4b82d2b54dcc34de5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs new file mode 100644 index 000000000..05037ac49 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs @@ -0,0 +1,34 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR + +using Sirenix.OdinInspector.Editor.Validation; +using Sirenix.OdinInspector.Modules.Addressables.Editor; +using UnityEngine.AddressableAssets; + +[assembly: RegisterValidator(typeof(DisallowAddressableSubAssetFieldAttributeValidator))] + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + /// + /// Validator for the DisallowAddressableSubAssetFieldAttribute. + /// + public class DisallowAddressableSubAssetFieldAttributeValidator : AttributeValidator + { + protected override void Validate(ValidationResult result) + { + if (this.Value != null && string.IsNullOrEmpty(this.Value.SubObjectName) == false) + { + result.AddError("Sub-asset references is not allowed on this field.") + .WithFix("Remove Sub-Asset", () => this.Value.SubObjectName = null, true); + } + } + } + +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta new file mode 100644 index 000000000..7a7fd44df --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5775d33ffc1143149c4f425f693b04b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs new file mode 100644 index 000000000..90811cc1e --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs @@ -0,0 +1,55 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR && ODIN_VALIDATOR_3_1 + +using System.Collections.Generic; +using UnityEditor.AddressableAssets; +using Sirenix.OdinInspector.Editor.Validation; +using UnityEditor.AddressableAssets.Settings; +using System.Collections; +using Sirenix.OdinInspector.Modules.Addressables.Editor; + +[assembly: RegisterValidator(typeof(MissingAddressableGroupReferenceValidator))] + +namespace Sirenix.OdinInspector.Modules.Addressables.Editor +{ + public class MissingAddressableGroupReferenceValidator : GlobalValidator + { + public override IEnumerable RunValidation(ValidationResult result) + { + var addressableAssetSettings = AddressableAssetSettingsDefaultObject.Settings; + + if (addressableAssetSettings == null) yield break; + + var missingGroupIndices = new List(); + + for (var i = 0; i < addressableAssetSettings.groups.Count; i++) + { + var group = addressableAssetSettings.groups[i]; + + if (group == null) + { + missingGroupIndices.Add(i); + } + } + + if (missingGroupIndices.Count > 0) + { + result.Add(ValidatorSeverity.Error, "Addressable groups contains missing references").WithFix("Delete missing reference", () => + { + for (var i = missingGroupIndices.Count - 1; i >= 0; i--) + { + addressableAssetSettings.groups.RemoveAt(missingGroupIndices[i]); + addressableAssetSettings.SetDirty(AddressableAssetSettings.ModificationEvent.GroupRemoved, null, true, true); + } + }); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs.meta new file mode 100644 index 000000000..0f3914fce --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/Validators/MissingAddressableGroupReferenceValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ae55abdaf19ef4498d1a2fbe1bd9f9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt new file mode 100644 index 000000000..4e97b1e83 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt @@ -0,0 +1,21 @@ +ManifestVersion: 1 +ModuleID: Unity.Addressables +ModuleVersion: 1.1.0.4 +ModuleFiles: + AddressablesInspectors.cs + AddressablesInspectors.cs.meta + Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef + Sirenix.OdinInspector.Modules.Unity.Addressables.asmdef.meta + Validators.meta + Validators/AssetLabelReferenceValidator.cs + Validators/AssetLabelReferenceValidator.cs.meta + Validators/AssetReferenceValidator.cs + Validators/AssetReferenceValidator.cs.meta + Validators/CheckDuplicateBundleDependenciesValidator.cs + Validators/CheckDuplicateBundleDependenciesValidator.cs.meta + Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs + Validators/CheckResourcesToAddressableDuplicateDependenciesValidator.cs.meta + Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs + Validators/DisallowAddressableSubAssetFieldAttributeValidator.cs.meta + Validators/MissingAddressableGroupReferenceValidator.cs + Validators/MissingAddressableGroupReferenceValidator.cs.meta diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt.meta new file mode 100644 index 000000000..194dd3ea7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/manifest.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b895c767daedd2d46b8ae7c0c0bfc599 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.meta new file mode 100644 index 000000000..79593fb00 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aef9f84551321cf4aac8228f4d56bf0e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor.meta new file mode 100644 index 000000000..bb9bcece7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 175cafb710462ef489cbf56cb46c97d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs.meta new file mode 100644 index 000000000..6d4e3a498 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3459a30abd1a4e979488e906febc27e7 +timeCreated: 1707714315 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset new file mode 100644 index 000000000..dc6574899 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset @@ -0,0 +1,29 @@ +%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: 2fc91909e6444cb29aacb664f2098c7e, type: 3} + m_Name: OdinLocalizationConfig + m_EditorClassIdentifier: + recordUndosForAssetTableEntries: 1 + assetRowHeight: 128 + useSyntaxHighlighter: 1 + placeholderColor: + lightColor: {r: 0.743147, g: 0.9433962, b: 0.9242815, a: 1} + darkColor: {r: 0, g: 0.5882353, b: 0.5333334, a: 1} + selectorColor: + lightColor: {r: 1, g: 0.7727525, b: 0.3632075, a: 1} + darkColor: {r: 1, g: 0.6470588, b: 0, a: 1} + formatterColor: + lightColor: {r: 0.9921569, g: 0.9855571, b: 0.8823529, a: 1} + darkColor: {r: 0.9607843, g: 0.9607843, b: 0.8627451, a: 1} + scrollSpeed: 24 + invertMouseDragNavigation: 1 + mouseDragSpeed: 1 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset.meta new file mode 100644 index 000000000..0fd9bb9bc --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c09625914af7d2d4e92c3653d5f15bd7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs new file mode 100644 index 000000000..839a8b2e5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs @@ -0,0 +1,173 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Reflection.Editor; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEngine; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Configs +{ + [GlobalConfig("Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs")] + public class OdinLocalizationConfig : GlobalConfig + { + public class ThemeColorDrawer : OdinValueDrawer + { + protected override void Initialize() + { + base.Initialize(); + this.Property.State.Expanded = false; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + SirenixEditorGUI.BeginBox(string.Empty); + { + SirenixEditorGUI.BeginBoxHeader(); + { + GUILayout_Internal.BeginRow(); + { + GUILayout_Internal.BeginColumn(LayoutSize.Pixels(EditorGUIUtility.labelWidth + 6.0f)); + { + this.Property.State.Expanded = EditorGUILayout.Foldout(this.Property.State.Expanded, + $"{label.text} ({(EditorGUIUtility.isProSkin ? "Dark" : "Light")})", + true); + } + GUILayout_Internal.EndColumn(); + + GUILayout_Internal.BeginColumn(LayoutSize.Auto); + { + this.Property.Children[nameof(ThemeColor.Color)].Draw(null); + } + GUILayout_Internal.EndColumn(); + } + GUILayout_Internal.EndRow(); + } + SirenixEditorGUI.EndBoxHeader(); + + bool toggle = this.ValueEntry.ValueState != PropertyValueState.NullReference && this.Property.State.Expanded; + + if (SirenixEditorGUI.BeginFadeGroup(this, toggle)) + { + GUILayout.BeginHorizontal(); + this.Property.Children[nameof(ThemeColor.lightColor)].Draw(); + GUILayout.Space(3.5f); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + this.Property.Children[nameof(ThemeColor.darkColor)].Draw(); + GUILayout.Space(3.5f); + GUILayout.EndHorizontal(); + } + + SirenixEditorGUI.EndFadeGroup(); + } + SirenixEditorGUI.EndBox(); + + if (this.Property.State.Expanded) + { + GUILayout.Space(4.0f); + } + } + } + + [Serializable] + public class ThemeColor + { + [ShowInInspector] + public Color Color + { + get => EditorGUIUtility.isProSkin ? this.darkColor : this.lightColor; + + set + { + if (EditorGUIUtility.isProSkin) + { + this.darkColor = value; + } + else + { + this.lightColor = value; + } + } + } + + public Color lightColor; + public Color darkColor; + + public ThemeColor(Color lightColor, Color darkColor) + { + this.lightColor = lightColor; + this.darkColor = darkColor; + } + + public static implicit operator Color(ThemeColor color) => color.Color; + } + + [ShowInInspector] + [BoxGroup("User Interface")] + [Range(96, 1024)] + public int assetRowHeight = 128; + + [BoxGroup("Syntax Highlighting")] + public bool useSyntaxHighlighter = true; + + [EnableIf(nameof(useSyntaxHighlighter))] + [BoxGroup("Syntax Highlighting")] + public ThemeColor placeholderColor = new ThemeColor(new Color(0.743147f, 0.9433962f, 0.9242815f), new Color(0, 0.5882353f, 0.5333334f)); + + [EnableIf(nameof(useSyntaxHighlighter))] + [BoxGroup("Syntax Highlighting")] + public ThemeColor selectorColor = new ThemeColor(new Color(1.0f, 0.7727525f, 0.3632075f), new Color(1, 0.6470588f, 0)); + + [EnableIf(nameof(useSyntaxHighlighter))] + [BoxGroup("Syntax Highlighting")] + public ThemeColor formatterColor = new ThemeColor(new Color(0.9921569f, 0.9855571f, 0.8823529f), new Color(0.9607843f, 0.9607843f, 0.8627451f)); + + [BoxGroup("Navigation")] + [Range(1, 1000.0f)] + public float scrollSpeed = 24.0f; + + [BoxGroup("Navigation")] + public bool invertMouseDragNavigation = true; + + [BoxGroup("Navigation")] + [Range(0.5f, 5.0f)] + public float mouseDragSpeed = 1.0f; + + [InfoBox("We couldn't find the necessary methods/classes to perform custom undo operations, therefore this option has been disabled and will be considered false even if true.", + VisibleIf = "@!OdinLocalizationReflectionValues.HasAPIForCustomUndo")] + [EnableIf("@OdinLocalizationReflectionValues.HasAPIForCustomUndo")] + [BoxGroup("Undo")] + public bool useCustomUndoHandlingForAssetCollections = true; + + [Button(ButtonSizes.Large)] + public void Reset() + { + if (!EditorUtility.DisplayDialog("Odin Localization Config", "Are you certain you want to reset your Localization config?", "Yes", "No")) + { + return; + } + + this.useCustomUndoHandlingForAssetCollections = OdinLocalizationReflectionValues.HasAPIForCustomUndo; + + this.assetRowHeight = 128; + + this.useSyntaxHighlighter = true; + this.placeholderColor = new ThemeColor(new Color(0.743147f, 0.9433962f, 0.9242815f), new Color(0, 0.5882353f, 0.5333334f)); + this.selectorColor = new ThemeColor(new Color(1.0f, 0.7727525f, 0.3632075f), new Color(1, 0.6470588f, 0)); + this.formatterColor = new ThemeColor(new Color(0.9921569f, 0.9855571f, 0.8823529f), new Color(0.9607843f, 0.9607843f, 0.8627451f)); + + this.scrollSpeed = 24.0f; + this.invertMouseDragNavigation = true; + this.mouseDragSpeed = 1.0f; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs.meta new file mode 100644 index 000000000..3ec82c500 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Configs/OdinLocalizationConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2fc91909e6444cb29aacb664f2098c7e +timeCreated: 1707714331 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI.meta new file mode 100644 index 000000000..e206adbf9 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bf930ee5d27d4f90ab84f23d337eaaca +timeCreated: 1704811167 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs new file mode 100644 index 000000000..57454a9d1 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs @@ -0,0 +1,993 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization.Metadata; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class LocalizationMetadata + { + private object lastTarget; + public object Target; + private LocalizationTableCollection localizationTableCollection; + private SearchField searchField = new SearchField(); + private string searchTerm; + private Vector2 scrollPosition; + private IMetadata toBeAdded; + private IMetadata toBeRemoved; + private Type lastMetadataTypeUnderCursor; + private StringBuilder stringBuilder = new StringBuilder(); + private OdinLocalizationEditorWindow.WindowState windowState; + + private List tags = new List + { + typeof(ExcludeEntryFromExport) + }; + + private GUIStyle _contentPadding; + private GUIStyle ContentPadding => + this._contentPadding = this._contentPadding ?? new GUIStyle + { + padding = new RectOffset(10, 10, 10, 10) + }; + + private GUIStyle _platformOverridePadding; + + private GUIStyle PlatformOverridePadding => + this._platformOverridePadding = this._platformOverridePadding ?? new GUIStyle + { + padding = new RectOffset(10, 20, 10, 10) + }; + + public LocalizationMetadata(LocalizationTableCollection localizationTableCollection, OdinLocalizationEditorWindow.WindowState windowState) + { + this.localizationTableCollection = localizationTableCollection; + this.windowState = windowState; + } + + /// + /// Adds the given metadata to the shared data of the . + /// + public void Add(IMetadata metadata) + { + this.localizationTableCollection.SharedData.Metadata.AddMetadata(metadata); + } + + /// + /// Adds the given metadata to the given . + /// + public void Add(LocalizationTable localizationTable, IMetadata metadata) + { + localizationTable.AddMetadata(metadata); + } + + /// + /// Adds the given metadata to the given . + /// + public void Add(SharedTableData.SharedTableEntry sharedTableEntry, IMetadata metadata) + { + sharedTableEntry.Metadata.AddMetadata(metadata); + } + + /// + /// Adds the given metadata to the given . + /// + public void Add(TableEntry tableEntry, IMetadata metadata) + { + tableEntry.AddMetadata(metadata); + } + + /// + /// Removes the given metadata from the shared data of the . + /// + public void Remove(IMetadata metadata) + { + this.localizationTableCollection.SharedData.Metadata.RemoveMetadata(metadata); + } + + /// + /// Removes the given metadata from the given . + /// + public void Remove(LocalizationTable localizationTable, IMetadata metadata) + { + localizationTable.RemoveMetadata(metadata); + } + + /// + /// Removes the given metadata from the given . + /// + public void Remove(SharedTableData.SharedTableEntry sharedTableEntry, IMetadata metadata) + { + sharedTableEntry.Metadata.RemoveMetadata(metadata); + } + + /// + /// Removes the given metadata from the given . + /// + public void Remove(TableEntry tableEntry, IMetadata metadata) + { + tableEntry.RemoveMetadata(metadata); + } + + /// + /// Draws the metadata for the given + /// + public float Draw(Rect rect) + { + var minWidth = 0f; + if (this.Target == null) return minWidth; + + if (Event.current.type != EventType.Repaint) + { + if (this.toBeAdded != null) + { + switch (this.Target) + { + case LocalizationTable localizationTable: + Undo.RecordObject(this.localizationTableCollection, "Localization Tables Metadata Added"); + this.Add(localizationTable, this.toBeAdded); + break; + case SharedTableData.SharedTableEntry sharedTableEntry: + Undo.RecordObject(this.localizationTableCollection.SharedData, "Localization Tables Metadata Added"); + this.Add(sharedTableEntry, this.toBeAdded); + break; + case TableEntry tableEntry: + Undo.RecordObject(tableEntry.Table, "Localization Tables Metadata Added"); + this.Add(tableEntry, this.toBeAdded); + break; + default: + Undo.RecordObject(this.localizationTableCollection.SharedData, "Localization Tables Metadata Added"); + this.Add(this.toBeAdded); + break; + } + + this.toBeAdded = null; + this.windowState.Dispose(); + } + + if (this.toBeRemoved != null) + { + switch (this.Target) + { + case LocalizationTable localizationTable: + Undo.RecordObject(this.localizationTableCollection, "Localization Tables Metadata Removed"); + this.Remove(localizationTable, this.toBeRemoved); + break; + case SharedTableData.SharedTableEntry sharedTableEntry: + Undo.RecordObject(this.localizationTableCollection.SharedData, "Localization Tables Metadata Removed"); + this.Remove(sharedTableEntry, this.toBeRemoved); + break; + case TableEntry tableEntry: + Undo.RecordObject(tableEntry.Table, "Localization Tables Metadata Removed"); + this.Remove(tableEntry, this.toBeRemoved); + break; + default: + Undo.RecordObject(this.localizationTableCollection.SharedData, "Localization Tables Metadata Removed"); + this.Remove(this.toBeRemoved); + break; + } + + this.toBeRemoved = null; + this.windowState.Dispose(); + } + } + + if (this.windowState.MetadataTree == null || this.lastTarget != this.Target) + { + this.windowState.MetadataTree?.Dispose(); + + switch (this.Target) + { + case LocalizationTable localizationTable: + this.windowState.MetadataTree = PropertyTree.Create(localizationTable); + break; + case SharedTableData.SharedTableEntry sharedTableEntry: + this.windowState.MetadataTree = PropertyTree.Create(sharedTableEntry); + break; + case TableEntry tableEntry: + { + var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + var entryData = typeof(TableEntry).GetProperty("Data", bindingFlags).GetValue(tableEntry); + this.windowState.MetadataTree = PropertyTree.Create(entryData); + break; + } + case LocalizationTableCollection localizationTableCollection: + this.windowState.MetadataTree = PropertyTree.Create(localizationTableCollection.SharedData); + break; + } + + this.lastTarget = this.Target; + } + + var metadataCollection = this.windowState.MetadataTree.RootProperty.Children["m_Metadata"]; + var metadataEntries = metadataCollection.Children["m_Items"].Children.ToList(); + + metadataEntries = metadataEntries + .Where(entry => !entry.Attributes.HasAttribute()) + .OrderBy(entry => !this.tags.Contains(entry.ValueEntry.TypeOfValue)) + .ThenBy(entry => entry.Name) + .ToList(); + + this.windowState.MetadataTree.BeginDraw(false); + switch (this.Target) + { + case LocalizationTable localizationTable: + minWidth = this.Draw(rect, localizationTable, "Table", metadataEntries, m => this.Add(localizationTable, m), m => this.Remove(localizationTable, m), () => this.OpenMetadataSelector(localizationTable)); + break; + case SharedTableData.SharedTableEntry sharedTableEntry: + minWidth = this.Draw(rect, this.localizationTableCollection.SharedData, "Shared Entry", metadataEntries, m => this.Add(sharedTableEntry, m), m => this.Remove(sharedTableEntry, m), () => this.OpenMetadataSelector(sharedTableEntry)); + break; + case TableEntry tableEntry: + minWidth = this.Draw(rect, tableEntry.Table, "Entry", metadataEntries, m => this.Add(tableEntry, m), m => this.Remove(tableEntry, m), () => this.OpenMetadataSelector(tableEntry)); + break; + default: + minWidth = this.Draw(rect, this.localizationTableCollection.SharedData, "Shared Table", metadataEntries, m => this.Add(m), m => this.Remove(m), () => this.OpenMetadataSelector(this.localizationTableCollection)); + break; + } + this.windowState.MetadataTree.EndDraw(); + + return minWidth; + } + + private float Draw(Rect rect, UnityEngine.Object target, string title, List metadataEntries, Action add, Action remove, Action openMetadataSelector) + { + const int headerHeight = 22; + const int addButtonAreaHeight = 40; + + EditorGUIUtility.labelWidth = 0f; + + // We only want to process events if the user's mouse is currently + // in the metadata panel so we grab some information for later. + var metadataPanelHasFocus = Event.current.IsMouseOver(rect); + var holdingControl = Event.current.control && metadataPanelHasFocus; + var holdingAlt = Event.current.alt && metadataPanelHasFocus; + + if (Event.current.OnKeyUp(KeyCode.LeftAlt)) + { + this.lastMetadataTypeUnderCursor = null; + } + + var searchAreaRect = rect.TakeFromTop(32); + EditorGUI.DrawRect(searchAreaRect.AlignBottom(1), SirenixGUIStyles.BorderColor); + + // Draw search field. + if (searchAreaRect.width > 125) + { + var titleWidth = SirenixGUIStyles.LabelCentered.CalcWidth(title) + 13; + var titleRect = searchAreaRect.AlignRight(titleWidth); + EditorGUI.DrawRect(titleRect.TakeFromLeft(1), SirenixGUIStyles.BorderColor); + this.searchTerm = this.searchField.Draw(searchAreaRect.SubXMax(titleWidth).Padding(6), this.searchTerm, + "Search for metadata..."); + GUI.Label(titleRect, title, SirenixGUIStyles.LabelCentered); + } + else + { + GUI.Label(searchAreaRect, title, SirenixGUIStyles.LabelCentered); + } + + var filteredMetadataEntries = string.IsNullOrWhiteSpace(this.searchTerm) + ? metadataEntries.ToList() + : metadataEntries.Where(metadataEntry => + { + if (FuzzySearch.Contains(this.searchTerm, metadataEntry.Info.TypeOfOwner.Name)) + { + return true; + } + + if (FuzzySearch.Contains(this.searchTerm, metadataEntry.ValueEntry?.WeakSmartValue?.ToString())) + { + return true; + } + + foreach (var child in metadataEntry.Children.Recurse()) + { + if (FuzzySearch.Contains(this.searchTerm, child.Name)) + { + return true; + } + + if (FuzzySearch.Contains(this.searchTerm, child.ValueEntry?.WeakSmartValue?.ToString())) + { + return true; + } + } + + return false; + }).ToList(); + + var metadataViewHeight = rect.height - addButtonAreaHeight; + GUILayout.BeginArea(rect.AlignTop(metadataViewHeight)); + this.scrollPosition = EditorGUILayout.BeginScrollView(this.scrollPosition, GUIStyle.none, GUI.skin.verticalScrollbar); + GUIHelper.BeginLayoutMeasuring(); + { + for (var i = 0; i < filteredMetadataEntries.Count; i++) + { + var metadataEntry = filteredMetadataEntries[i]; + var metadataHeaderRect = GUILayoutUtility.GetRect(0, headerHeight, GUILayoutOptions.ExpandWidth().ExpandHeight(false)); + var unchangedMetadataHeaderRect = metadataHeaderRect; + + var genericMenu = new GenericMenu(); + genericMenu.AddItem(new GUIContent("Delete"), false, () => + { + var metadata = (IMetadata)metadataEntry.ValueEntry.WeakSmartValue; + this.toBeRemoved = metadata; + }); + + var isTag = this.tags.Contains(metadataEntry.ValueEntry.TypeOfValue); + + if (!isTag) + { + genericMenu.AddItem(new GUIContent("Copy"), false, () => + { + var metadata = (IMetadata)metadataEntry.ValueEntry.WeakSmartValue; + Clipboard.Copy(metadata); + }); + + if (Clipboard.CanPaste()) + genericMenu.AddItem(new GUIContent("Paste"), false, () => + { + var metadata = (IMetadata)Clipboard.Paste(); + this.toBeAdded = metadata; + }); + else + genericMenu.AddDisabledItem(new GUIContent("Paste")); + + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent($"{(metadataEntry.State.Expanded ? "Collapse" : "Expand")} All (Ctrl-Click)"), false, () => + { + var newState = !metadataEntry.State.Expanded; + foreach (var entry in filteredMetadataEntries) entry.State.Expanded = newState; + }); + genericMenu.AddItem(new GUIContent($"{(metadataEntry.State.Expanded ? "Collapse" : "Expand")} All Of Same Type (Alt-Click)"), false, () => + { + var newState = !metadataEntry.State.Expanded; + foreach (var entry in filteredMetadataEntries.Where(m => m.Info.TypeOfOwner == metadataEntry.Info.TypeOfOwner)) entry.State.Expanded = newState; + }); + } + + Color metadataHeaderBackground = new Color(0.243f, 0.243f, 0.243f); + + if (!isTag && holdingControl) + { + metadataHeaderBackground = new Color(0.278f, 0.278f, 0.278f); + + GUIHelper.RequestRepaint(); + } + else if (!isTag && holdingAlt) + { + if (Event.current.IsMouseOver(unchangedMetadataHeaderRect)) + { + this.lastMetadataTypeUnderCursor = metadataEntry.ValueEntry.TypeOfValue; + GUIHelper.RequestRepaint(); + } + + metadataHeaderBackground = this.lastMetadataTypeUnderCursor == metadataEntry.ValueEntry.TypeOfValue + ? new Color(0.278f, 0.278f, 0.278f) + : new Color(0.243f, 0.243f, 0.243f); + } + + if (Event.current.IsMouseOver(unchangedMetadataHeaderRect)) + { + metadataHeaderBackground = new Color(0.278f, 0.278f, 0.278f); + } + + EditorGUI.DrawRect(unchangedMetadataHeaderRect, metadataHeaderBackground); + + if (i != 0) + { + EditorGUI.DrawRect(unchangedMetadataHeaderRect.AlignTop(1), new Color(0.102f, 0.102f, 0.102f)); + } + + var foldoutTriangleRect = metadataHeaderRect.TakeFromLeft(headerHeight); + + if (!isTag) + SdfIcons.DrawIcon( + foldoutTriangleRect.Padding(6), + metadataEntry.State.Expanded ? SdfIconType.CaretDownFill : SdfIconType.CaretRightFill, + new Color(0.443f, 0.443f, 0.443f)); + + var iconRect = metadataHeaderRect.TakeFromLeft(headerHeight); + SdfIcons.DrawIcon( + iconRect.Padding(0, 4, 4, 4), + isTag ? SdfIconType.TagFill : SdfIconType.GeoAltFill, + new Color(0.933f, 0.933f, 0.933f)); + + var contextMenuIconRect = metadataHeaderRect.TakeFromRight(headerHeight); + + SdfIcons.DrawIcon(contextMenuIconRect.Padding(7), SdfIconType.ThreeDotsVertical); + + var niceName = ObjectNames.NicifyVariableName(metadataEntry.ValueEntry.TypeOfValue.GetNiceName()); + + if (metadataEntry.Info.TypeOfOwner == typeof(Comment)) + { + var headerLabelWidth = EditorStyles.label.CalcWidth(niceName) + 1; + var comment = ((string)metadataEntry.ValueEntry.WeakSmartValue).Split('\n')[0]; + var hintRect = metadataHeaderRect.AlignRight(metadataHeaderRect.width - headerLabelWidth - 10); + + if (SirenixGUIStyles.RightAlignedGreyMiniLabel.CalcWidth(comment) > hintRect.width) + { + if (hintRect.width < 30) + { + comment = ""; + } + else + { + GUI.Label(hintRect.TakeFromLeft(11), "...", SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + } + + GUI.Label(hintRect, comment, SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + else if (metadataEntry.Info.TypeOfOwner == typeof(PreloadAssetTableMetadata)) + { + var headerLabelWidth = EditorStyles.label.CalcWidth(niceName) + 1; + var preloadAssetLabel = ObjectNames.NicifyVariableName(metadataEntry.ValueEntry.WeakSmartValue.ToString()); + var hintRect = metadataHeaderRect.AlignRight(metadataHeaderRect.width - headerLabelWidth - 10); + + if (SirenixGUIStyles.RightAlignedGreyMiniLabel.CalcWidth(preloadAssetLabel) > hintRect.width) + { + if (hintRect.width < 30) + { + preloadAssetLabel = ""; + } + else + { + GUI.Label(hintRect.TakeFromLeft(11), "...", SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + } + + GUI.Label(hintRect, preloadAssetLabel, SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + else if (metadataEntry.Info.TypeOfOwner == typeof(PlatformOverride)) + { + var platformOverrides = metadataEntry.Children; + var headerLabelWidth = EditorStyles.label.CalcWidth(niceName) + 1; + var hintRect = metadataHeaderRect.AlignRight(metadataHeaderRect.width - headerLabelWidth - 10); + + this.stringBuilder.Clear(); + for (var j = 0; j < platformOverrides.Count; j++) + { + var platformOverrideInspectorProperty = platformOverrides[j]; + var platform = (RuntimePlatform)platformOverrideInspectorProperty.Children[0].ValueEntry.WeakSmartValue; + this.stringBuilder.Append(platform); + + if (j != platformOverrides.Count - 1) + { + this.stringBuilder.Append(", "); + } + } + + var platforms = this.stringBuilder.ToString(); + + if (SirenixGUIStyles.RightAlignedGreyMiniLabel.CalcWidth(platforms) > hintRect.width) + { + if (hintRect.width < 30) + { + GUI.Label(hintRect, $"[{platformOverrides.Count}]", SirenixGUIStyles.RightAlignedGreyMiniLabel); + platforms = ""; + } + else if (platformOverrides.Count > 1) + { + GUI.Label(hintRect.TakeFromLeft(11), "...", SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + } + + GUI.Label(hintRect, platforms, SirenixGUIStyles.RightAlignedGreyMiniLabel); + } + + GUI.Label(metadataHeaderRect, niceName); + + var evt = Event.current; + if (evt.OnMouseDown(contextMenuIconRect, 0, false)) + genericMenu.ShowAsContext(); + else if (evt.OnMouseDown(unchangedMetadataHeaderRect, 1, false)) genericMenu.ShowAsContext(); + + if (metadataEntry.ValueEntry.TypeOfValue == typeof(ExcludeEntryFromExport)) continue; + + if (evt.OnMouseDown(unchangedMetadataHeaderRect, 0, false)) + { + if (holdingControl) + { + var newState = !metadataEntry.State.Expanded; + foreach (var entry in filteredMetadataEntries) + { + entry.State.Expanded = newState; + } + } + else if (holdingAlt) + { + var newState = !metadataEntry.State.Expanded; + foreach (var entry in filteredMetadataEntries.Where(m => m.ValueEntry.TypeOfValue == this.lastMetadataTypeUnderCursor)) + { + entry.State.Expanded = newState; + } + } + else + { + metadataEntry.State.Expanded = !metadataEntry.State.Expanded; + } + + GUIHelper.RemoveFocusControl(); + } + + if (SirenixEditorGUI.BeginFadeGroup(metadataEntry, metadataEntry.State.Expanded)) + { + EditorGUI.DrawRect(unchangedMetadataHeaderRect.AlignBottom(1), + new Color(0.188f, 0.188f, 0.188f)); + + var contentRect = EditorGUILayout.BeginVertical(); + + if (metadataEntry.ValueEntry.TypeOfValue == typeof(Comment)) + { + EditorGUILayout.BeginVertical(this.ContentPadding); + foreach (var child in metadataEntry.Children) + { + child.Draw(null); + } + EditorGUILayout.EndVertical(); + } + else if (metadataEntry.ValueEntry.TypeOfValue == typeof(PreloadAssetTableMetadata)) + { + EditorGUILayout.BeginVertical(this.ContentPadding); + + var preloadAssetTableMetadata = (PreloadAssetTableMetadata)metadataEntry.ValueEntry.WeakSmartValue; + var btnRect = EditorGUILayout.GetControlRect(false); + var leftRect = btnRect.Split(0, 2); + var mouseOverLeft = Event.current.IsMouseOver(leftRect); + var leftActive = mouseOverLeft && Event.current.type == EventType.MouseDown && Event.current.button == 0; + var leftOn = preloadAssetTableMetadata.Behaviour == PreloadAssetTableMetadata.PreloadBehaviour.NoPreload; + + var rightRect = btnRect.Split(1, 2); + var mouseOverRight = Event.current.IsMouseOver(rightRect); + var rightActive = mouseOverRight && Event.current.type == EventType.MouseDown && Event.current.button == 0; + var rightOn = preloadAssetTableMetadata.Behaviour == PreloadAssetTableMetadata.PreloadBehaviour.PreloadAll; + + if (Event.current.type == EventType.Repaint) + { + SirenixGUIStyles.ButtonLeft.Draw(leftRect, "No Preload", mouseOverLeft, leftActive, leftOn, false); + SirenixGUIStyles.ButtonRight.Draw(rightRect, "Preload All", mouseOverRight, rightActive, rightOn, false); + } + + if (Event.current.OnMouseDown(leftRect, 0, false)) + { + preloadAssetTableMetadata.Behaviour = PreloadAssetTableMetadata.PreloadBehaviour.NoPreload; + } + else if (Event.current.OnMouseDown(rightRect, 0, false)) + { + preloadAssetTableMetadata.Behaviour = PreloadAssetTableMetadata.PreloadBehaviour.PreloadAll; + } + + EditorGUILayout.EndVertical(); + } + else if (metadataEntry.ValueEntry.TypeOfValue == typeof(PlatformOverride)) + { + this.DrawPlatformOverride(metadataEntry); + } + else + { + EditorGUILayout.BeginVertical(this.ContentPadding); + foreach (var child in metadataEntry.Children) + { + child.Draw(); + } + EditorGUILayout.EndVertical(); + } + + EditorGUILayout.EndVertical(); + } + + SirenixEditorGUI.EndFadeGroup(); + } + } + var measureRect = GUIHelper.EndLayoutMeasuring(); + EditorGUILayout.EndScrollView(); + GUILayout.EndArea(); + + var pinAddMetadataButton = measureRect.height > metadataViewHeight; + rect.TakeFromTop(pinAddMetadataButton ? metadataViewHeight : measureRect.height); + + if (metadataEntries.Count > 1) + { + EditorGUI.DrawRect(rect.TakeFromTop(1), SirenixGUIStyles.BorderColor); + } + + var addMetadataRect = rect.AlignTop(addButtonAreaHeight).AlignCenter(Mathf.Min(200, rect.width - 16)).VerticalPadding(8); + + if (GUI.Button(addMetadataRect, "Add Metadata")) + { + openMetadataSelector(); + } + + // Draw the shadow that appears under the search bar while scrolling through the metadata. + GUI.DrawTexture( + searchAreaRect.AlignBottom(10).AddY(10), + OdinLocalizationGUITextures.TopToBottomFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0, 0, 0, Mathf.InverseLerp(0f, 30f, this.scrollPosition.y) * 0.6f), + 0, + 0); + + if (measureRect.height > metadataViewHeight) + { + var pos = this.scrollPosition.y + metadataViewHeight; + // Draw the shadow that appears at the bottom of the metadata while scrolling through the metadata + GUI.DrawTexture( + rect.AlignTop(10).SubY(10), + OdinLocalizationGUITextures.BottomToTopFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0, 0, 0, Mathf.InverseLerp(measureRect.height, measureRect.height - 30, pos) * 0.6f), + 0, + 0); + } + + return measureRect.width; + } + + private void DrawPlatformOverride(InspectorProperty metadataEntry) + { + var platformOverride = (PlatformOverride)metadataEntry.ValueEntry.WeakSmartValue; + var platformOverrideDatas = (IList)metadataEntry.Children["m_PlatformOverrides"]?.ValueEntry.WeakSmartValue; + var platformOverrideDataInspectorProperties = metadataEntry.Children["m_PlatformOverrides"]?.Children; + + if (platformOverrideDatas == null) + { + return; + } + + if (platformOverrideDatas.Count == 0) + { + platformOverride.AddPlatformOverride(RuntimePlatform.WindowsPlayer, null, null, EntryOverrideType.None); + } + + for (var i = 0; i < platformOverrideDataInspectorProperties.Count; i++) + { + var platformOverrideDataInspectorProperty = platformOverrideDataInspectorProperties[i]; + var backgroundRect = EditorGUILayout.BeginVertical(this.PlatformOverridePadding); + var backgroundColor = i % 2 == 0 ? SirenixGUIStyles.ListItemColorEven : SirenixGUIStyles.ListItemColorOdd; + EditorGUI.DrawRect(backgroundRect, backgroundColor); + platformOverrideDataInspectorProperty.Children["platform"].Draw(); + platformOverrideDataInspectorProperty.Children["entryOverrideType"].Draw(); + + var entryOverrideType = (EntryOverrideType)platformOverrideDataInspectorProperty.Children + .FirstOrDefault(c => c.Info.TypeOfValue == typeof(EntryOverrideType))?.ValueEntry.WeakSmartValue; + + var entryOverrideRect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight, GUILayoutOptions.ExpandWidth(true).ExpandHeight(false)); + + switch (entryOverrideType) + { + case EntryOverrideType.Table: + { + var tableReference = (TableReference)platformOverrideDataInspectorProperty.Children.FirstOrDefault(c => c.Info.TypeOfValue == typeof(TableReference))?.ValueEntry.WeakSmartValue; + this.DoTableGUI(entryOverrideRect, tableReference, platformOverrideDataInspectorProperty); + break; + } + case EntryOverrideType.Entry: + { + var tableReference = (TableReference)platformOverrideDataInspectorProperty.Children.FirstOrDefault(c => c.Info.TypeOfValue == typeof(TableReference)) + ?.ValueEntry.WeakSmartValue; + var tableEntryReference = (TableEntryReference)platformOverrideDataInspectorProperty.Children.FirstOrDefault(c => c.Info.TypeOfValue == typeof(TableEntryReference))?.ValueEntry.WeakSmartValue; + this.DoTableAndEntryGUI(entryOverrideRect, tableReference, tableEntryReference, platformOverrideDataInspectorProperty, false); + break; + } + + case EntryOverrideType.TableAndEntry: + { + var tableReference = (TableReference)platformOverrideDataInspectorProperty.Children.FirstOrDefault(c => c.Info.TypeOfValue == typeof(TableReference))?.ValueEntry.WeakSmartValue; + var tableEntryReference = (TableEntryReference)platformOverrideDataInspectorProperty.Children.FirstOrDefault(c => c.Info.TypeOfValue == typeof(TableEntryReference))?.ValueEntry.WeakSmartValue; + this.DoTableAndEntryGUI(entryOverrideRect, tableReference, tableEntryReference, platformOverrideDataInspectorProperty, true); + break; + } + } + + EditorGUILayout.EndVertical(); + + var xIconRect = backgroundRect.AlignRight(10).SubX(4).AlignCenterY(10); + var mouseOverX = Event.current.IsMouseOver(xIconRect); + SdfIcons.DrawIcon(xIconRect, SdfIconType.X, mouseOverX ? Color.white : EditorStyles.label.normal.textColor); + + if (Event.current.OnMouseDown(xIconRect, 0, false)) + { + var platform = (RuntimePlatform)platformOverrideDataInspectorProperty.Children[0].ValueEntry.WeakSmartValue; + platformOverride.RemovePlatformOverride(platform); + } + } + + var addButtonRect = GUILayoutUtility.GetRect(0, 40, GUILayoutOptions.ExpandWidth().ExpandHeight(false)); + EditorGUI.DrawRect(addButtonRect.AlignTop(1), new Color(0.188f, 0.188f, 0.188f)); + + if (GUI.Button(addButtonRect.Padding(8), "Add Platform Override")) + { + var selector = new EnumSelector(); + selector.SelectionConfirmed += platforms => + { + var platform = platforms.FirstOrDefault(); + platformOverride.AddPlatformOverride(platform, null, null, EntryOverrideType.None); + }; + selector.ShowInPopup(); + } + } + + private void OpenMetadataSelector(LocalizationTableCollection localizationTableCollection) + { + this.OpenMetadataSelector(localizationTableCollection.SharedData.Metadata.MetadataEntries, MetadataType.SharedTableData); + } + + private void OpenMetadataSelector(LocalizationTable localizationTable) + { + switch (localizationTable) + { + case StringTable _: + this.OpenMetadataSelector(localizationTable.MetadataEntries, MetadataType.StringTable); + break; + case AssetTable _: + this.OpenMetadataSelector(localizationTable.MetadataEntries, MetadataType.AssetTable); + break; + } + } + + private void OpenMetadataSelector(SharedTableData.SharedTableEntry sharedTableEntry) + { + switch (this.localizationTableCollection) + { + case StringTableCollection _: + this.OpenMetadataSelector(sharedTableEntry.Metadata.MetadataEntries, MetadataType.StringTableEntry, MetadataType.SharedStringTableEntry); + break; + case AssetTableCollection _: + this.OpenMetadataSelector(sharedTableEntry.Metadata.MetadataEntries, MetadataType.AssetTableEntry, MetadataType.SharedAssetTableEntry); + break; + } + } + + private void OpenMetadataSelector(TableEntry tableEntry) + { + switch (tableEntry) + { + case StringTableEntry _: + this.OpenMetadataSelector(tableEntry.MetadataEntries, MetadataType.StringTableEntry); + break; + case AssetTableEntry _: + this.OpenMetadataSelector(tableEntry.MetadataEntries, MetadataType.AssetTableEntry); + break; + } + } + + private void OpenMetadataSelector(IList existingMetadata, params MetadataType[] allowedTypes) + { + var existingMetadataTypes = existingMetadata.Select(m => m?.GetType()).ToList(); + var metadataTypes = TypeCache.GetTypesDerivedFrom(); + var validMetadataTypes = new List(); + + foreach (var metadataType in metadataTypes) + { + var metadataAttribute = metadataType.GetCustomAttribute(); + if (metadataAttribute != null && allowedTypes.Any(allowedType => metadataAttribute.AllowedTypes.HasFlag(allowedType))) + { + if (existingMetadataTypes.Contains(metadataType) && !OdinLocalizationMetadataRegistry.MetadataAllowsMultiple.ContainsKey(metadataType)) continue; + + validMetadataTypes.Add(metadataType); + } + } + + var selector = new GenericSelector("", validMetadataTypes, false, type => ObjectNames.NicifyVariableName(type.Name)); + + foreach (var item in selector.SelectionTree.MenuItems) + { + item.SdfIcon = SdfIconType.Braces; + } + + selector.SelectionConfirmed += types => + { + var selectedType = types.FirstOrDefault(); + + if (selectedType == null) + { + return; + } + + var metadata = (IMetadata)Activator.CreateInstance(selectedType); + this.toBeAdded = metadata; + }; + selector.EnableSingleClickToSelect(); + selector.ShowInPopup(); + } + + public class TableReferenceSelector : OdinSelector + { + private Type tableType; + + public TableReferenceSelector(Type tableType) + { + this.tableType = tableType; + } + + protected override void BuildSelectionTree(OdinMenuTree tree) + { + tree.Config.SelectMenuItemsOnMouseDown = true; + tree.Selection.SupportsMultiSelect = false; + + var collectionGUIDs = AssetDatabase.FindAssets($"t:{nameof(LocalizationTableCollection)}"); + + foreach (var guid in collectionGUIDs) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + var collection = AssetDatabase.LoadAssetAtPath(path); + + if (collection is null) continue; + if (collection.Tables.Count < 1) continue; + if (collection.Tables[0].asset.GetType() != this.tableType) continue; + + var collectionItem = new OdinMenuItem(tree, collection.name, collection) + { + SdfIcon = SdfIconType.Table + }; + + tree.MenuItems.Add(collectionItem); + } + } + } + + public class TableEntryReferenceSelector : OdinSelector + { + private Type tableType; + + public struct TableEntry + { + public LocalizationTableCollection Collection; + public SharedTableData.SharedTableEntry SharedEntry; + } + + public TableEntryReferenceSelector(Type tableType) + { + this.tableType = tableType; + } + + protected override void BuildSelectionTree(OdinMenuTree tree) + { + tree.Config.SelectMenuItemsOnMouseDown = true; + tree.Selection.SupportsMultiSelect = false; + + + var collectionGUIDs = AssetDatabase.FindAssets($"t:{nameof(LocalizationTableCollection)}"); + + foreach (var guid in collectionGUIDs) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + var collection = AssetDatabase.LoadAssetAtPath(path); + + if (collection is null) continue; + if (collection.Tables.Count < 1) continue; + if (collection.Tables[0].asset.GetType() != this.tableType) continue; + + var collectionItem = new OdinMenuItem(tree, collection.name, collection) + { + SdfIcon = SdfIconType.Table + }; + + List entries = collection.SharedData.Entries; + + for (var j = 0; j < entries.Count; j++) + { + SharedTableData.SharedTableEntry entry = entries[j]; + + var tableEntry = new TableEntry {Collection = collection, SharedEntry = entry}; + + var entryItem = new OdinMenuItem(tree, entry.Key, tableEntry) + { + SdfIcon = SdfIconType.KeyFill + }; + + collectionItem.ChildMenuItems.Add(entryItem); + } + + collectionItem.IsSelectable = false; + tree.MenuItems.Add(collectionItem); + } + } + } + + private void DoTableGUI(Rect rect, TableReference tableReference, InspectorProperty platformOverrideData) + { + var dropDownPosition = EditorGUI.PrefixLabel(rect, new GUIContent("Table Collection")); + var label = tableReference.TableCollectionName; + + if (EditorGUI.DropdownButton(dropDownPosition, new GUIContent(label), FocusType.Passive)) + { + TableReferenceSelector tableReferenceSelector; + + tableReferenceSelector = this.localizationTableCollection.GetType() == typeof(AssetTableCollection) + ? new TableReferenceSelector(typeof(AssetTable)) + : new TableReferenceSelector(typeof(StringTable)); + + tableReferenceSelector.GetCurrentSelection(); + + tableReferenceSelector.SelectionConfirmed += selections => + { + var selection = selections.FirstOrDefault(); + + var platformOverrideType = typeof(PlatformOverride); + var platformOverrideDataType = platformOverrideType.GetNestedType("PlatformOverrideData", BindingFlags.NonPublic); + + platformOverrideDataType + .GetField("tableReference") + .SetValue(platformOverrideData.ValueEntry.WeakSmartValue, selection.TableCollectionNameReference); + + platformOverrideDataType + .GetField("tableEntryReference") + .SetValue(platformOverrideData.ValueEntry.WeakSmartValue, (TableEntryReference) string.Empty); + }; + + tableReferenceSelector.ShowInPopup(); + } + } + + private void DoTableAndEntryGUI(Rect rect, + TableReference tableReference, + TableEntryReference tableEntryReference, + InspectorProperty platformOverrideData, + bool displayTableName) + { + var dropDownPosition = EditorGUI.PrefixLabel(rect, new GUIContent("Reference")); + + var entryLabel = tableEntryReference.ReferenceType != TableEntryReference.Type.Empty + ? tableEntryReference.ResolveKeyName(this.localizationTableCollection.SharedData) + : null; + + string label; + if (displayTableName) + { + var tableLabel = tableReference.TableCollectionName ?? ""; + label = string.IsNullOrEmpty(tableLabel) || string.IsNullOrEmpty(entryLabel) ? "None" : $"{tableLabel}/{entryLabel}"; + } + else + { + label = string.IsNullOrWhiteSpace(entryLabel) ? "None" : $"{entryLabel}"; + } + + if (EditorGUI.DropdownButton(dropDownPosition, new GUIContent(label), FocusType.Passive)) + { + Type tableType = this.localizationTableCollection.GetType() == typeof(AssetTableCollection) + ? typeof(AssetTable) + : typeof(StringTable); + + TableEntryReferenceSelector tableEntryReferenceSelector = new TableEntryReferenceSelector(tableType); + tableEntryReferenceSelector.SelectionConfirmed += selections => + { + var selection = selections.FirstOrDefault(); + var platformOverrideType = typeof(PlatformOverride); + var platformOverrideDataType = platformOverrideType.GetNestedType("PlatformOverrideData", BindingFlags.NonPublic); + + platformOverrideDataType + .GetField("tableReference") + .SetValue(platformOverrideData.ValueEntry.WeakSmartValue, selection.Collection.TableCollectionNameReference); + + platformOverrideDataType + .GetField("tableEntryReference") + .SetValue(platformOverrideData.ValueEntry.WeakSmartValue, (TableEntryReference) selection.SharedEntry.Key); + }; + + tableEntryReferenceSelector.ShowInPopup(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs.meta new file mode 100644 index 000000000..9a8682721 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/LocalizationMetadata.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1490cea564e237341b75e0cdba1f374a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs new file mode 100644 index 000000000..e7ea77ad0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs @@ -0,0 +1,986 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#define USING_WIDTH_NON_PERCENT + +using System; +using System.Collections.ObjectModel; +using System.IO; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.AddressableAssets.Settings; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinAssetTableCollectionEditor : OdinTableCollectionEditor + { + public Type UserSpecifiedCollectionType; + + private AssetTableEntry pickedEntry; + private string pickedEntryOriginalGuid; + + private Action setEntryAssetTypeAction; + private Action removeEntryAssetTypeAction; + + public OdinAssetTableCollectionEditor(AssetTableCollection collection, OdinMenuEditorWindow relatedWindow, + OdinLocalizationEditorWindow.WindowState windowState) : + base(collection, relatedWindow, windowState) { } + + public void SetEntryAssetType(AssetTableEntry entry, Type assetType) + { + if (assetType == null || assetType == typeof(UnityEngine.Object)) + { + this.removeEntryAssetTypeAction(entry.KeyId, entry.Table.LocaleIdentifier.Code); + + return; + } + + this.setEntryAssetTypeAction(entry.KeyId, assetType, entry.Table.LocaleIdentifier.Code); + } + + protected override void OnInitialize() + { + this.setEntryAssetTypeAction = OdinLocalizationReflectionValues.Create_AssetTableCollection_SetEntryAssetType_PrivateMethod_Delegate(this.Collection); + + this.removeEntryAssetTypeAction = + OdinLocalizationReflectionValues.Create_AssetTableCollection_RemoveEntryAssetType_PrivateMethod_Delegate(this.Collection); + + for (var i = 0; i < this.SharedEntries.Length; i++) + { + SharedTableData.SharedTableEntry sharedEntry = this.SharedEntries[i]; + + this.MeasureEntry(sharedEntry); + } + + //this.SharedEntries.OnSharedEntryAdded += (i, sharedEntry) => { this.MeasureEntry(sharedEntry); }; + + //this.SharedEntries.OnSharedEntryRemoved += (i, sharedEntry) => { this.SharedEntryHeights.Remove(sharedEntry.Id); }; + + this.OnTableEntryModified = sharedEntry => + { + if (!this.Collection.SharedData.Contains(sharedEntry.Id)) + { + return; + } + + int index = this.SharedEntries.GetIndex(sharedEntry); + + this.MeasureEntry(sharedEntry); + + this.EntryScrollView.ReallocateRect(index, this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + }; + + this.OnAssetTableEntryAdded = (collection, table, entry) => + { + if (this.Collection != collection) + { + return; + } + + this.MeasureEntry(entry.SharedEntry); + }; + + this.OnAssetTableEntryRemoved = (collection, table, entry, guid) => + { + if (this.Collection != collection) + { + return; + } + + if (entry == null) + { + return; + } + + SharedTableData.SharedTableEntry sharedEntry = table.SharedData.GetEntry(entry.KeyId); + + if (sharedEntry == null) + { + return; + } + + this.MeasureEntry(sharedEntry); + }; + } + + protected override void AllocateItems() + { + for (var i = 0; i < this.SharedEntries.Length; i++) + { + SharedTableData.SharedTableEntry sharedEntry = this.SharedEntries[i]; + + if (!this.SharedEntries.IsVisible(sharedEntry)) + { + continue; + } + + if (!this.SharedEntryHeights.ContainsKey(sharedEntry.Id)) + { + this.MeasureEntry(sharedEntry); + } + + this.EntryScrollView.AllocateRect(this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + + //this.ControlIds[sharedEntry] = GUIUtility.GetControlID(FocusType.Keyboard); + } + } + + protected override void DrawItems(ref OdinGUIScrollView.VisibleItems visibleItems) + { + this.HandleObjectPickerUpdates(); + + this.MeasureVisibleEntries(ref visibleItems); + + float scrollSpeed = OdinLocalizationConfig.Instance.scrollSpeed; + + this.EntryScrollView.BeginScrollView(offset: new Vector2(this.PinnedWidth, OdinLocalizationConstants.COLUMN_HEIGHT), + addViewSize: new Vector2(-this.PinnedWidth, 0), + scrollSpeed: scrollSpeed); + { + this.DrawEntries(ref visibleItems, false); + } + this.EntryScrollView.EndScrollView(); + + this.EntryScrollView.BeginClip(offset: new Vector2(0, OdinLocalizationConstants.COLUMN_HEIGHT), ignoreScrollX: true); + { + this.DrawEntries(ref visibleItems, true); + } + this.EntryScrollView.EndClip(); + } + + protected override void MeasureAllEntries() + { + for (var i = 0; i < this.SharedEntries.Length; i++) + { + this.MeasureEntry(this.SharedEntries[i]); + } + + this.HasGUIChanged = true; + } + + protected override void MeasureVisibleEntries(ref OdinGUIScrollView.VisibleItems visibleItems) + { + int dataOffset = visibleItems.Offset; + + for (var i = 0; i < visibleItems.Length; i++) + { + if (!visibleItems.HasAssociatedData(i)) + { + continue; + } + + var sharedEntry = visibleItems.GetAssociatedData(i); + + this.MeasureEntry(sharedEntry); + + this.EntryScrollView.ReallocateRect(dataOffset + i, this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + } + } + + private void MeasureEntry(SharedTableData.SharedTableEntry sharedEntry) + { + var keyColumnWidth = 0.0f; + + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable table = this.GUITables[i]; + + if (table.Type != OdinGUITable.GUITableType.Key) + { + continue; + } + +#if USING_WIDTH_NON_PERCENT + keyColumnWidth = table.Width; +#else + keyColumnWidth = this.GUITables[i].Width; +#endif + break; + } + + float keyHeight = MeasureText(sharedEntry.Key, keyColumnWidth); + + Type assetSharedType = this.Collection.GetEntryAssetType(sharedEntry.Id); + float assetHeight; + + if (assetSharedType == null || assetSharedType == typeof(UnityEngine.Object)) + { + assetHeight = OdinLocalizationConstants.EMPTY_ASSET_ROW_HEIGHT; + } + else + { + assetHeight = EditorGUIUtility.HasObjectThumbnail(assetSharedType) + ? OdinLocalizationConstants.AssetPreviewRowHeight + : OdinLocalizationConstants.ASSET_ROW_HEIGHT; + } + + this.SharedEntryHeights[sharedEntry.Id] = Mathf.Max(keyHeight, assetHeight); + } + + private void DrawEntries(ref OdinGUIScrollView.VisibleItems visibleItems, bool pinned) + { + bool isDraggingControls = this.IsDraggingAnything(); + + for (var i = 0; i < visibleItems.Length; i++) + { + if (!visibleItems.HasAssociatedData(i)) + { + continue; + } + + Rect position = visibleItems.GetRect(i); + + int hint = visibleItems.Offset + i + this.ControlIdHint; + + var sharedEntry = visibleItems.GetAssociatedData(i); + + bool isEven = (visibleItems.Offset + i) % 2 == 0; + + for (var j = 0; j < this.GUITables.Count; j++) + { + OdinGUITable table = this.GUITables[j]; + + if (!table.IsVisible) + { + continue; + } + + if (table.IsPinned != pinned) + { + continue; + } + + if (!this.GUITables.TablesWithinVisibleBounds.Contains(table)) + { + position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); + continue; + } + +#if USING_WIDTH_NON_PERCENT + Rect entryRect = position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); +#else + Rect entryRect = position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); +#endif + + bool isCellPressed, isSelected; + + switch (table.Type) + { + case OdinGUITable.GUITableType.Key: + isSelected = this.IsSharedEntrySelected(sharedEntry); + + if (isSelected) + { + this.SelectionAnimFloat.Move(1 / 0.18f, Easing.InSine); + + FancyColor start = FancyColor.Gray; + + var end = OdinLocalizationGUI.Selected; + + FancyColor.PushBlend(start.Lerp(end, this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + + isCellPressed = DrawCell(entryRect, isEven); + + this.DrawKey(entryRect, sharedEntry, GUIUtility.GetControlID(hint, FocusType.Keyboard)); + + if (isSelected) + { + FancyColor.PopBlend(); + } + + if (isCellPressed) + { + this.SelectSharedEntry(sharedEntry); + } + + break; + + case OdinGUITable.GUITableType.Default: + AssetTableEntry entry = table.Asset.GetEntry(sharedEntry.Id); + + isSelected = this.IsEntrySelected(entry); + + if (isSelected) + { + this.SelectionAnimFloat.Move(1 / 0.18f, Easing.InSine); + + FancyColor start = FancyColor.Gray; + + FancyColor end = OdinLocalizationGUI.Selected; + + FancyColor.PushBlend(start.Lerp(end, this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + + isCellPressed = DrawCell(entryRect, isEven); + + this.DrawEntry(entryRect, sharedEntry, entry, table, isDraggingControls); + + if (isSelected) + { + FancyColor.PopBlend(); + } + + if (isCellPressed) + { + if (entry is null) + { + entry = table.Asset.AddEntry(sharedEntry.Id, string.Empty); + } + + GUIUtility.keyboardControl = 0; + + this.SelectEntry(entry); + } + + if (isSelected && Event.current.type == EventType.KeyDown && EditorWindow.focusedWindow == this.RelatedWindow) + { + switch (Event.current.keyCode) + { + case KeyCode.Delete: + case KeyCode.Backspace: + if (entry == null) + { + break; + } + + this.AssignObjectToSharedEntry(sharedEntry, table.Asset, null); + + Event.current.Use(); + break; + + case KeyCode.Space: + case KeyCode.Return: + if (entry == null) + { + entry = table.Asset.AddEntry(sharedEntry.Id, string.Empty); + } + + this.ShowObjectPickerForEntry(entry); + + Event.current.Use(); + break; + } + } + + break; + } + } + } + } + + private void DrawEntry(Rect rect, SharedTableData.SharedTableEntry sharedEntry, AssetTableEntry entry, OdinGUITable table, + bool isDraggingControls) + { + UnityEngine.Object asset = null; + + Type entryAssetType = this.Collection.GetEntryAssetType(sharedEntry.Id); + + if (entry != null && !entry.IsEmpty) + { + asset = OdinLocalizationAssetCache.Get(entry.Guid, entryAssetType); + } + + Rect fullRect = rect; + + Rect rightMenuRect = rect.TakeFromRight(OdinLocalizationConstants.ROW_MENU_WIDTH); + rect.TakeFromLeft(OdinLocalizationConstants.ROW_MENU_WIDTH); + + rightMenuRect = rightMenuRect.Padding(0, 6); + + Rect openInspectorRect = rightMenuRect.AlignTop(14); + Rect openExplorerRect = rightMenuRect.AlignBottom(14); + + bool isMouseOverInspector = Event.current.IsMouseOver(openInspectorRect); + bool isMouseOverExplorer = Event.current.IsMouseOver(openExplorerRect); + + // TODO: some caveats to just adding this +#if true + var dragId = 0; + + if (!isDraggingControls) + { + EditorGUI.BeginChangeCheck(); + var dragValue = DragAndDropUtilities.DragAndDropZone(fullRect, asset, entryAssetType, true, false, false) as UnityEngine.Object; + dragId = DragAndDropUtilities.PrevDragAndDropId; + if (EditorGUI.EndChangeCheck() && dragValue != asset) + { + entry = this.AssignObjectToSharedEntry(sharedEntry, table.Asset, dragValue); + asset = dragValue; + entryAssetType = this.Collection.GetEntryAssetType(sharedEntry.Id); + } + } +#endif + + bool hasThumbnail = EditorGUIUtility.HasObjectThumbnail(entryAssetType); + + if (asset != null) + { + if (Event.current.OnMouseDown(rect, 0, false) && Event.current.clickCount >= 2) + { + EditorGUIUtility.PingObject(asset); + } + } + + + if (entry == null || asset == null) + { + GUI.Label(rect, $"None ({entryAssetType.Name})", SirenixGUIStyles.LabelCentered); + } + else if (!hasThumbnail) + { + GUI.Label(rect.AlignMiddle(20), + GUIHelper.TempContent($"{asset.name} ({entryAssetType.Name})", AssetPreview.GetMiniThumbnail(asset)), + SirenixGUIStyles.LabelCentered); + + if (entryAssetType != typeof(UnityEngine.Object)) + { + var c = EditorGUIUtility.isProSkin + ? new Color(1, 1, 1, isMouseOverInspector ? 0.8f : 0.3f) + : new Color(0, 0, 0, isMouseOverInspector ? 0.8f : 0.3f); + + var c1 = EditorGUIUtility.isProSkin + ? new Color(1, 1, 1, isMouseOverExplorer ? 0.8f : 0.3f) + : new Color(0, 0, 0, isMouseOverExplorer ? 0.8f : 0.3f); + + SdfIcons.DrawIcon(openInspectorRect, SdfIconType.PencilFill, c); + SdfIcons.DrawIcon(openExplorerRect, SdfIconType.FolderFill, c1); + + GUI.Label(openInspectorRect, GUIHelper.TempContent(string.Empty, "Inspect Object")); + GUI.Label(openExplorerRect, GUIHelper.TempContent(string.Empty, "Show In Explorer")); + + if (Event.current.OnMouseDown(openInspectorRect, 0)) + { + GUIHelper.OpenInspectorWindow(asset); + } + + if (Event.current.OnMouseDown(openExplorerRect, 0)) + { + string assetAbsPath = Path.GetFullPath(AssetDatabase.GetAssetPath(asset)); + + if (File.Exists(assetAbsPath)) + { + EditorUtility.RevealInFinder(assetAbsPath); + +#if SIRENIX_INTERNAL + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Tools, + $"(DEVELOPER) Opened asset path: {asset.name} ({assetAbsPath})", + Color.black, + 15.0f); +#endif + } + else + { + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.ExclamationTriangleFill, + $"Failed to find asset: {asset.name}", + SirenixGUIStyles.RedErrorColor, + 5.0f); + } + + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + } + else + { + Rect previewRect = rect.Padding(12); + + Texture preview; + + if (asset is Sprite || asset is Cubemap) + { + preview = AssetPreview.GetAssetPreview(asset); + } + else + { + preview = AssetPreview.GetMiniThumbnail(asset); + } + + if (preview == null) + { + preview = AssetDatabase.GetCachedIcon(AssetDatabase.GetAssetPath(asset)); + } + + float previewHeight = preview.height; + float aspect = (float) preview.width / preview.height; + + if (previewHeight < previewRect.height) + { + previewRect = previewRect.AlignMiddle(previewHeight < 32 ? 32 : previewHeight); + } + else + { + previewHeight = previewRect.height; + } + + float previewWidth = previewHeight * aspect; + + if (previewWidth > previewRect.width) + { + previewWidth = previewRect.width; + previewHeight = previewWidth / aspect; + } + + previewRect = previewRect.AlignCenter(previewWidth, previewHeight); + + previewRect.x = Mathf.Round(previewRect.x); + previewRect.y = Mathf.Round(previewRect.y); + previewRect.width = Mathf.Round(previewRect.width); + previewRect.height = Mathf.Round(previewRect.height); + + if (Event.current.type == EventType.Repaint) + { + if (this.IsEntrySelected(entry)) + { + GUIHelper.PushColor(OdinLocalizationGUI.Selected * new FancyColor(1.05f)); + } + + EditorStyles.objectFieldThumb.Draw(previewRect, GUIContent.none, false, false, false, false); + + if (this.IsEntrySelected(entry)) + { + GUIHelper.PopColor(); + } + } + + GUI.DrawTexture(previewRect, preview, ScaleMode.ScaleToFit); + + GUI.DrawTexture(previewRect, Texture2D.whiteTexture, ScaleMode.StretchToFill, true, 1.0f, new FancyColor(0.17f), 1, 0); + + var c = EditorGUIUtility.isProSkin + ? new Color(1, 1, 1, isMouseOverInspector ? 0.8f : 0.3f) + : new Color(0, 0, 0, isMouseOverInspector ? 0.8f : 0.3f); + + var c1 = EditorGUIUtility.isProSkin + ? new Color(1, 1, 1, isMouseOverExplorer ? 0.8f : 0.3f) + : new Color(0, 0, 0, isMouseOverExplorer ? 0.8f : 0.3f); + + SdfIcons.DrawIcon(openInspectorRect, SdfIconType.PencilFill, c); + SdfIcons.DrawIcon(openExplorerRect, SdfIconType.FolderFill, c1); + + GUI.Label(openInspectorRect, GUIHelper.TempContent(string.Empty, "Inspect Object")); + GUI.Label(openExplorerRect, GUIHelper.TempContent(string.Empty, "Show In Explorer")); + + if (Event.current.OnMouseDown(openInspectorRect, 0)) + { + GUIHelper.OpenInspectorWindow(asset); + } + + if (Event.current.OnMouseDown(openExplorerRect, 0)) + { + string assetAbsPath = Path.GetFullPath(AssetDatabase.GetAssetPath(asset)); + + if (File.Exists(assetAbsPath)) + { + EditorUtility.RevealInFinder(assetAbsPath); + +#if SIRENIX_INTERNAL + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Tools, + $"(DEVELOPER) Opened asset path: {asset.name} ({assetAbsPath})", + Color.black, + 15.0f); +#endif + } + else + { + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.ExclamationOctagonFill, + $"Failed to find asset: {asset.name} ({assetAbsPath})", + SirenixGUIStyles.RedErrorColor, + 5.0f); + } + + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + + Rect pickerRect = rightMenuRect.AlignMiddle(14); + + if (OdinLocalizationGUI.ObjectPickerButton(pickerRect)) + { + if (entry == null) + { + entry = table.Asset.AddEntry(sharedEntry.Id, string.Empty); + } + + this.ShowObjectPickerForEntry(entry); + } + + GUI.Label(pickerRect, GUIHelper.TempContent(string.Empty, "Select Object")); + +#if true + if (!isDraggingControls && DragAndDropUtilities.IsDragging && DragAndDropUtilities.HoveringAcceptedDropZone == dragId) + { + GUI.DrawTexture(fullRect, Texture2D.whiteTexture, ScaleMode.StretchToFill, false, 1, new Color(0, 0.5f, 0.8f, 0.25f), 0, 2.5f); + } +#endif + } + + public override void RemoveKey(SharedTableData.SharedTableEntry sharedEntry) + { + bool hasAssets = this.DoesSharedEntryHaveAssets(sharedEntry); + + if (!hasAssets) + { + base.RemoveKey(sharedEntry); + return; + } + + this.SharedEntryHeights.Remove(sharedEntry.Id); + + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable table = this.GUITables[i]; + + if (table.Type == OdinGUITable.GUITableType.Key) + { + continue; + } + + AssetTableEntry entry = table.Asset.GetEntry(sharedEntry.Id); + + if (entry == null || entry.IsEmpty) + { + continue; + } + + this.Collection.RemoveAssetFromTable(table.Asset, sharedEntry.Id); + } + + this.Collection.RemoveEntry(sharedEntry.Id); + + this.GUITables.SetDirty(this.Collection.SharedData); + } + + private bool DoesSharedEntryHaveAssets(SharedTableData.SharedTableEntry sharedEntry) + { + Type sharedType = this.Collection.GetEntryAssetType(sharedEntry.Id); + + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable table = this.GUITables[i]; + + if (table.Type == OdinGUITable.GUITableType.Key) + { + continue; + } + + if (OdinLocalizationAssetCache.Get(sharedEntry, table.Asset, sharedType) != null) + { + return true; + } + } + + return false; + } + + private void ShowObjectPickerForEntry(AssetTableEntry entry) + { + this.pickedEntry = entry; + + this.pickedEntryOriginalGuid = entry.Guid; + + UnityEngine.Object obj = null; + + Type objType = this.UserSpecifiedCollectionType ?? this.Collection.GetEntryAssetType(entry.KeyId); + + UnityEngine.Object asset = OdinLocalizationAssetCache.Get(entry.Guid, objType); + + if (asset != null) + { + obj = asset; + } + + OdinObjectSelector.Show(this.RelatedWindow, OdinObjectSelectorIds.LOCALIZATION_EDITOR, obj, objType, false); + //SirenixObjectPickerUtilities.ShowObjectPicker(obj, objType, false, string.Empty, this.RelatedWindowId); + } + + private void HandleObjectPickerUpdates() + { + if (this.pickedEntry == null) + { + return; + } + +#if true + object selectedObj = OdinObjectSelector.SelectorObject; + + try + { + if (OdinObjectSelector.IsReadyToClaim(this.RelatedWindow, OdinObjectSelectorIds.LOCALIZATION_EDITOR)) + { + this.AssignObjectToSelectorEntry(OdinObjectSelector.Claim() as UnityEngine.Object); + + Event.current.Use(); + } + else + { + if (!OdinObjectSelector.IsOpen) + { + this.pickedEntry.Guid = this.pickedEntryOriginalGuid; + this.pickedEntry = null; + this.pickedEntryOriginalGuid = string.Empty; + } + + EditorGUI.BeginChangeCheck(); + var changedValue = OdinObjectSelector.GetChangedObject(null, this.RelatedWindow, OdinObjectSelectorIds.LOCALIZATION_EDITOR); + if (EditorGUI.EndChangeCheck()) + { + if (changedValue == null) + { + this.pickedEntry.Guid = string.Empty; + } + else + { + this.pickedEntry.Guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(changedValue)); + } + } + } + } + catch (NullReferenceException exception) + { + Debug.LogError($"{nameof(NullReferenceException)}: The asset '{selectedObj ?? ""}' is NULL.\n{exception}"); + } +#else + if (Event.current.type != EventType.ExecuteCommand || + EditorGUIUtility.GetObjectPickerControlID() != this.RelatedWindowId || + this.RelatedWindowId == 0) + { + return; + } + + UnityEngine.Object selectedObj = null; + + try + { + if (Event.current.commandName == "ObjectSelectorClosed") + { + Vector2 lastScrollPosition = this.EntryScrollView.Position; + + this.pickedEntry.Guid = this.pickedEntryOriginalGuid; + + selectedObj = EditorGUIUtility.GetObjectPickerObject(); + + var table = (AssetTable) this.pickedEntry.Table; + + SharedTableData.SharedTableEntry sharedEntry = this.pickedEntry.SharedEntry; + + if (selectedObj == null) + { + this.Collection.RemoveAssetFromTable((AssetTable) this.pickedEntry.Table, + this.pickedEntry.SharedEntry.Id, + OdinLocalizationConfig.Instance.recordUndosForAssetTableEntries); + + this.pickedEntry = table.GetEntry(sharedEntry.Id) ?? table.AddEntry(sharedEntry.Id, string.Empty); + } + else + { + this.Collection.AddAssetToTable((AssetTable) this.pickedEntry.Table, + this.pickedEntry.SharedEntry.Id, + selectedObj, + OdinLocalizationConfig.Instance.recordUndosForAssetTableEntries); + + this.pickedEntry = table.GetEntry(sharedEntry.Id); + } + + EditorUtility.SetDirty(this.Collection.SharedData); + EditorUtility.SetDirty(table); + + this.EntryScrollView.Position = lastScrollPosition; + + this.pickedEntry = null; + this.pickedEntryOriginalGuid = string.Empty; + Event.current.Use(); + return; + } + + if (Event.current.commandName != "ObjectSelectorUpdated") + { + return; + } + + selectedObj = EditorGUIUtility.GetObjectPickerObject(); + + this.pickedEntry.Guid = selectedObj == null ? string.Empty : AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(selectedObj)); + + Event.current.Use(); + } + catch (NullReferenceException exception) + { + // NOTE: edge cases for when the user selects assets that appear in the object picker, but in reality are null. + Debug.LogError($"{nameof(NullReferenceException)}: The asset '{(selectedObj == null ? "" : selectedObj.name)}' is NULL.\n{exception}"); + } +#endif + } + + // TODO: implement when drag'n'drop areas are done and keyboard commands +#if true + private AssetTableEntry AssignObjectToSharedEntry(SharedTableData.SharedTableEntry sharedEntry, AssetTable table, UnityEngine.Object obj) + { + Vector2 lastScrollPosition = this.EntryScrollView.Position; + + AssetTableEntry entry; + + if (obj == null) + { + this.CustomRemoveAssetFromTable(table, sharedEntry.Id, true); + + entry = table.GetEntry(sharedEntry.Id) ?? table.AddEntry(sharedEntry.Id, string.Empty); + } + else + { + this.Collection.AddAssetToTable(table, sharedEntry.Id, obj, true); + + entry = table.GetEntry(sharedEntry.Id); + } + + this.EntryScrollView.Position = lastScrollPosition; + + return entry; + } +#endif + + private void AssignObjectToSelectorEntry(UnityEngine.Object obj) + { + object selectedObj = OdinObjectSelector.SelectorObject; + + try + { + Vector2 lastScrollPosition = this.EntryScrollView.Position; + + this.pickedEntry.Guid = this.pickedEntryOriginalGuid; + + var table = (AssetTable) this.pickedEntry.Table; + + SharedTableData.SharedTableEntry sharedEntry = this.pickedEntry.SharedEntry; + + if (obj == null) + { + this.CustomRemoveAssetFromTable((AssetTable) this.pickedEntry.Table, this.pickedEntry.SharedEntry.Id, true); + + this.pickedEntry = table.GetEntry(sharedEntry.Id) ?? table.AddEntry(sharedEntry.Id, string.Empty); + } + else + { + this.Collection.AddAssetToTable((AssetTable) this.pickedEntry.Table, this.pickedEntry.SharedEntry.Id, obj, true); + + this.pickedEntry = table.GetEntry(sharedEntry.Id); + } + + EditorUtility.SetDirty(this.Collection.SharedData); + EditorUtility.SetDirty(table); + + this.EntryScrollView.Position = lastScrollPosition; + + this.pickedEntry = null; + this.pickedEntryOriginalGuid = string.Empty; + } + catch (NullReferenceException exception) + { + Debug.LogError($"{nameof(NullReferenceException)}: The asset '{selectedObj ?? ""}' is NULL.\n{exception}"); + } + } + + public void CustomRemoveAssetFromTable(AssetTable table, TableEntryReference entryReference, bool createUndo = false) + { + if (!OdinLocalizationReflectionValues.HasAPIForCustomUndo || !OdinLocalizationConfig.Instance.useCustomUndoHandlingForAssetCollections) + { + this.Collection.RemoveAssetFromTable(table, entryReference, createUndo); + + return; + } + + var groupIndex = 0; + + if (createUndo) + { + groupIndex = Undo.GetCurrentGroup(); + Undo.IncrementCurrentGroup(); + Undo.SetCurrentGroupName("Remove asset from table"); + } + + if (createUndo) + { + Undo.RecordObjects(new UnityEngine.Object[] {table, table.SharedData}, "Remove asset from table"); + } + + AssetTableEntry tableEntry = table.GetEntryFromReference(entryReference); + + if (tableEntry == null) + { + return; + } + + string removedAssetGuid = tableEntry.Guid; + + tableEntry.Guid = string.Empty; + + AddressableAssetSettings addressableAssetSettings = OdinLocalizationEditorSettings.GetAddressableAssetSettings(false); + + if (addressableAssetSettings == null) + { + return; + } + + EditorUtility.SetDirty(table); + EditorUtility.SetDirty(table.SharedData); + + this.SetEntryAssetType(tableEntry, null); + + if (tableEntry.MetadataEntries.Count == 0) + { + table.RemoveEntry(tableEntry.KeyId); + } + + ReadOnlyCollection assetTableCollections = LocalizationEditorSettings.GetAssetTableCollections(); + + foreach (AssetTableCollection collection in assetTableCollections) + { + if (collection.GetTable(table.LocaleIdentifier) is AssetTable tableWithMatchingLocaleId && + tableWithMatchingLocaleId.ContainsValue(removedAssetGuid)) + { + return; + } + } + + AddressableAssetEntry assetEntry = addressableAssetSettings.FindAssetEntry(removedAssetGuid); + + if (assetEntry != null) + { + if (createUndo) + { + Undo.RecordObject(assetEntry.parentGroup, "Remove asset from table"); + } + + var assetLabel = (string) OdinLocalizationReflectionValues.FormatAssetLabelMethod.Invoke(null, new object[] {table.LocaleIdentifier}); + + assetEntry.SetLabel(assetLabel, false); + + OdinLocalizationReflectionValues.UpdateAssetGroupMethod.Invoke(this.Collection, new object[] {addressableAssetSettings, assetEntry, createUndo}); + } + + OdinLocalizationEvents.RaiseAssetTableEntryRemoved(this.Collection, table, tableEntry, removedAssetGuid); + + if (createUndo) + { + Undo.CollapseUndoOperations(groupIndex); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs.meta new file mode 100644 index 000000000..7568b7161 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinAssetTableCollectionEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc0d9dcd4d4f4e3094085c752e185ef8 +timeCreated: 1704811181 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs new file mode 100644 index 000000000..0552ebf8f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs @@ -0,0 +1,196 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#define USING_WIDTH_NON_PERCENT +//#undef USING_WIDTH_NON_PERCENT + +using System; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEngine; +using UnityEngine.Localization; +using UnityEngine.Localization.Tables; +using UnityEngine.Serialization; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinGUITable : IComparable> where TTable : LocalizationTable + { + public const string KEY_DISPLAY_NAME = "Key"; + + public enum GUITableType + { + Default, + Key + } + + public float Width + { + get => this._width; + set + { + if (value < OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + this._width = OdinLocalizationConstants.MIN_COLUMN_WIDTH; + return; + } + + this._width = Mathf.Round(value); + } + } + + public bool IsDraggingSlider = false; + public bool IsVisible; + public string DisplayName; + public GUITableType Type; + + [FormerlySerializedAs("Table")] + public TTable Asset; + public bool IsPinned; + + private float _width; + +#if USING_WIDTH_NON_PERCENT + //public float VisualWidth; +#else + internal float WidthPercentage; +#endif + +#if USING_WIDTH_NON_PERCENT + public static OdinGUITable CreateKeyTable() +#else + public static OdinGUITable CreateKeyTable(float widthPercent) +#endif + { + return new OdinGUITable + { + IsVisible = true, + DisplayName = KEY_DISPLAY_NAME, + Type = GUITableType.Key, + Asset = null, + IsPinned = false, + Width = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH, +#if USING_WIDTH_NON_PERCENT + // VisualWidth = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH +#else + WidthPercentage = widthPercent +#endif + }; + } + +#if USING_WIDTH_NON_PERCENT + public static OdinGUITable CreateTable(TTable table, Locale locale) +#else + public static OdinGUITable CreateTable(TTable table, float widthPercent) +#endif + { + return new OdinGUITable + { + IsVisible = true, + DisplayName = locale.LocaleName, + Type = GUITableType.Default, + Asset = table, + IsPinned = false, + Width = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH, +#if USING_WIDTH_NON_PERCENT + // VisualWidth = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH +#else + WidthPercentage = widthPercent +#endif + }; + } + + public int CompareTo(OdinGUITable other) + { + if (other == null) + { + return -1; + } + + if (this.IsVisible && !other.IsVisible) + { + return -1; + } + + if (!this.IsVisible && other.IsVisible) + { + return 1; + } + + if (this.IsPinned && !other.IsPinned) + { + return -1; + } + + if (!this.IsPinned && other.IsPinned) + { + return 1; + } + + if (this.DisplayName == KEY_DISPLAY_NAME && other.DisplayName == KEY_DISPLAY_NAME) + { + return 0; + } + + if (other.DisplayName == KEY_DISPLAY_NAME) + { + return 1; + } + + if (this.DisplayName == KEY_DISPLAY_NAME) + { + return -1; + } + + return this.Asset.LocaleIdentifier.CompareTo(other.Asset.LocaleIdentifier); + } + + public Vector2 HandleSlider(Rect position) + { + if (GUIUtility.hotControl == 0) + { + this.IsDraggingSlider = false; + } + + if (!GUI.enabled) + { + return Vector2.zero; + } + + EditorGUIUtility.AddCursorRect(position, MouseCursor.ResizeHorizontal); + + if (GUI.enabled && Event.current.OnMouseDown(position, 0)) + { + this.IsDraggingSlider = true; + SharedUniqueControlId.SetActive(); + EditorGUIUtility.SetWantsMouseJumping(1); + Event.current.Use(); + } + else if (SharedUniqueControlId.IsActive && this.IsDraggingSlider) + { + if (Event.current.type == EventType.MouseDrag) + { + Event.current.Use(); + GUI.changed = true; + return Event.current.delta; + } + + if (Event.current.type != EventType.MouseUp) + { + return Vector2.zero; + } + + this.IsDraggingSlider = false; + SharedUniqueControlId.SetInactive(); + EditorGUIUtility.SetWantsMouseJumping(0); + Event.current.Use(); + } + + return Vector2.zero; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs.meta new file mode 100644 index 000000000..6ad3d1926 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c6172b1a79444464bfac84d14344febf +timeCreated: 1706411334 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs new file mode 100644 index 000000000..abc61f52f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs @@ -0,0 +1,483 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#define USING_WIDTH_NON_PERCENT +//#undef USING_WIDTH_NON_PERCENT + +using System; +using System.Collections.Generic; +using Sirenix.OdinInspector.Editor.Internal; +using UnityEditor; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinGUITableCollection : List> where TTable : LocalizationTable + { + public readonly struct VisibleTables + { + public readonly int Offset; + public readonly int Length; + public readonly int PinnedLength; + public readonly float StartOffset; + + private readonly OdinGUITableCollection collection; + + public VisibleTables(OdinGUITableCollection collection, int offset, int length, int pinnedLength, float startOffset) + { + this.collection = collection; + this.Offset = offset; + this.Length = length + pinnedLength; + this.PinnedLength = pinnedLength; + this.StartOffset = startOffset; + } + + public OdinGUITable this[int index] => + index >= this.PinnedLength ? this.collection[this.Offset + index - this.PinnedLength] : this.collection[index]; + } + + //public VisibleTables CurrentVisibleTables; + + public HashSet> TablesWithinVisibleBounds = new HashSet>(); + + public OdinGUITableCollection(int capacity) : base(capacity) { } + +#if USING_WIDTH_NON_PERCENT + public void AddKeyTable() + { + for (var i = 0; i < this.Count; i++) + { + if (this[i].Type == OdinGUITable.GUITableType.Key) + { + return; + } + } + + this.Add(OdinGUITable.CreateKeyTable()); + } +#else + public void AddKeyTable(float widthPercent) + { + for (var i = 0; i < this.Count; i++) + { + if (this[i].Type == OdinGUITable.GUITableType.Key) + { + return; + } + } + + this.Add(OdinGUITable.CreateKeyTable(widthPercent)); + } +#endif + +#if USING_WIDTH_NON_PERCENT + public void UpdateVisibleTables(OdinGUIScrollView view, float pinnedWidth) + { +#if true + this.TablesWithinVisibleBounds.Clear(); + + var offset = 0; + var currentVisibleWidth = 0.0f; + var xMin = 0.0f; + var xMax = 0.0f; + + for (var i = 0; i < this.Count; i++) + { + OdinGUITable table = this[i]; + + if (!table.IsVisible) + { + continue; + } + + if (table.IsPinned) + { + this.TablesWithinVisibleBounds.Add(table); + continue; + } + + xMax += table.Width; + + bool isVisible = view.Position.x >= xMin && view.Position.x <= xMax; + + if (!isVisible) + { + xMin = xMax; + continue; + } + + offset = i; + + currentVisibleWidth = xMax - view.Position.x; + this.TablesWithinVisibleBounds.Add(table); + break; + } + + float width = view.Bounds.width - pinnedWidth; + + for (int i = offset + 1; i < this.Count; i++) + { + OdinGUITable table = this[i]; + + if (!table.IsVisible) + { + break; + } + + if (currentVisibleWidth >= width) + { + this.TablesWithinVisibleBounds.Add(table); + break; + } + + this.TablesWithinVisibleBounds.Add(table); + currentVisibleWidth += this[i].Width; + } +#else + if (this.GetVisibleCount() < 1) + { + this.CurrentVisibleTables = new VisibleTables(this, 0, 0, 0, 0.0f); + return; + } + + const int LENGTH_NOT_SET = -1; + + var offset = 0; + int length = LENGTH_NOT_SET; + + var currentVisibleWidth = 0.0f; + + float xMin = 0.0f, xMax = 0.0f; + + float positionX = view.Position.x; + float width = view.Bounds.width - pinnedWidth; + + for (var i = 0; i < this.Count; i++) + { + OdinGUITable table = this[i]; + + if (table.IsPinned) + { + continue; + } + + if (!table.IsVisible) + { + break; + } + + xMax += table.VisualWidth; + + bool isVisible = positionX >= xMin && positionX <= xMax; + + if (!isVisible) + { + xMin = xMax; + continue; + } + + offset = i; + + currentVisibleWidth = xMax - positionX; + break; + } + + float startOffset = xMin; + + for (int i = offset + 1; i < this.Count; i++) + { + if (!this[i].IsVisible) + { + length = i - offset; + break; + } + + if (currentVisibleWidth >= width) + { + length = i - offset + 1; + break; + } + + currentVisibleWidth += this[i].VisualWidth; + } + + int pinnedCount = this.GetPinnedCount(); + + if (length == LENGTH_NOT_SET) + { + length = this.Count - offset; + } + + this.CurrentVisibleTables = new VisibleTables(this, offset, length, pinnedCount, startOffset); +#endif + } + + public float GetVisibleWidth() + { + var result = 0.0f; + + for (var i = 0; i < this.Count; i++) + { + if (this[i].IsVisible) + { + result += this[i].Width; + } + } + + return result; + } + + public void ResizeBy(float factor) + { + for (var i = 0; i < this.Count; i++) + { + if (this[i].IsVisible) + { + this[i].Width *= factor; + } + } + } +#else + /// Calculates the field on beforehand. + /// The to perform calculations on. + public void CalcWidths(OdinGUIScrollView scrollView) + { + float viewWidth = scrollView.ViewRect.width; + + float visibleFactor = this.GetVisibleFactor(); + + for (var i = 0; i < this.Count; i++) + { + this[i].Width = viewWidth * (this[i].WidthPercentage * visibleFactor); + } + } +#endif + + public int GetLastVisibleIndex() + { + for (int i = this.Count - 1; i >= 0; i--) + { + if (this[i].IsVisible) + { + return i; + } + } + + return 0; + } + + public int GetLastVisiblePinnedIndex() + { + for (int i = this.Count - 1; i >= 0; i--) + { + if (this[i].IsVisible && this[i].IsPinned) + { + return i; + } + } + + return 0; + } + + public int GetVisibleCount() + { + var result = 0; + + for (var i = 0; i < this.Count; i++) + { + if (this[i].IsVisible) + { + result++; + } + } + + return result; + } + + public int GetHiddenCount() + { + var result = 0; + + for (var i = 0; i < this.Count; i++) + { + if (!this[i].IsVisible) + { + result++; + } + } + + return result; + } + + public int GetPinnedCount() + { + var result = 0; + + for (var i = 0; i < this.Count; i++) + { + if (this[i].IsVisible && this[i].IsPinned) + { + result++; + } + } + + return result; + } + + public OdinGUITable GetNextVisible(int index) + { + for (int i = index + 1; i < this.Count; i++) + { + if (this[i].IsVisible) + { + return this[i]; + } + } + + return null; + } + + public void UndoRecordCollection(SharedTableData sharedTableData, string name) + { + for (var i = 0; i < this.Count; i++) + { + switch (this[i].Type) + { + case OdinGUITable.GUITableType.Default: + Undo.RecordObject(this[i].Asset, name); + break; + + case OdinGUITable.GUITableType.Key: + if (sharedTableData != null) + { + Undo.RecordObject(sharedTableData, name); + } + + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + public void SetDirty(SharedTableData sharedTableData) + { + for (var i = 0; i < this.Count; i++) + { + switch (this[i].Type) + { + case OdinGUITable.GUITableType.Default: + EditorUtility.SetDirty(this[i].Asset); + break; + + case OdinGUITable.GUITableType.Key: + if (sharedTableData != null) + { + EditorUtility.SetDirty(sharedTableData); + } + + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + } + +#if !USING_WIDTH_NON_PERCENT + private float GetVisibleFactor() + { + var visibleCount = 0; + var sum = 0.0f; + + for (var i = 0; i < this.Count; i++) + { + if (!this[i].IsVisible) + { + continue; + } + + sum += this[i].WidthPercentage; + visibleCount++; + } + + float result = (float) this.Count / visibleCount; + + sum *= result; + + result *= 1.0f / sum; + + return result; + } +#endif + public void ResizeToFit(float targetWidth) + { + var count = 0; + + for (var i = 0; i < this.Count; i++) + { + if (this[i].IsPinned || !this[i].IsVisible) + { + continue; + } + + count++; + } + + if (count < 1) + { + return; + } + + int averageSize = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH * count; + + float scaleFactor = targetWidth / averageSize; + + for (var i = 0; i < this.Count; i++) + { + if (!this[i].IsVisible || this[i].IsPinned) + { + continue; + } + + this[i].Width = OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH * scaleFactor; + } + } + + public void ResizePinnedToFit(float targetWidth) + { + var currentTotalWidth = 0.0f; + + for (var i = 0; i < this.Count; i++) + { + if (!this[i].IsPinned || !this[i].IsVisible) + { + continue; + } + + currentTotalWidth += this[i].Width; + } + + if (currentTotalWidth < 1.0f) + { + return; + } + + float scaleFactor = targetWidth / currentTotalWidth; + + for (var i = 0; i < this.Count; i++) + { + if (!this[i].IsVisible || !this[i].IsPinned) + { + continue; + } + + this[i].Width *= scaleFactor; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs.meta new file mode 100644 index 000000000..d34ca8724 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinGUITableCollection.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3a739bb40d31496a9591094d81fd2d19 +timeCreated: 1706411492 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs new file mode 100644 index 000000000..705c1a1f2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs @@ -0,0 +1,441 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.Localization; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinSharedEntryCollection + { + private class StringComparer : IComparer + { + public bool IsAscending = true; + + public int Compare(string self, string other) + { + if (string.IsNullOrEmpty(self) && string.IsNullOrEmpty(other)) + { + return 0; + } + + if (string.IsNullOrEmpty(self)) + { + return this.IsAscending ? 1 : -1; + } + + if (string.IsNullOrEmpty(other)) + { + return this.IsAscending ? -1 : 1; + } + + return string.Compare(self, other, StringComparison.InvariantCulture); + } + } + + public enum SortOrderState + { + Unsorted, + Ascending, + Descending + } + + public bool IsSearching; + + public bool IsSorted => this.CurrentSortOrderState != SortOrderState.Unsorted; + + public int Length => this.Entries.Count; + + private string _searchTerm = string.Empty; + + private StringComparer stringComparer = new StringComparer(); + + public string SearchTerm + { + get => this._searchTerm; + private set + { + this._searchTerm = value; + + this.IsSearching = !string.IsNullOrEmpty(value); + } + } + + public List Entries => this.IsSorted ? this.SortedEntries : this.Collection.SharedData.Entries; + + public List SortedEntries; + public readonly HashSet FilteredEntries; + + public readonly LocalizationTableCollection Collection; + + public SortOrderState CurrentSortOrderState = SortOrderState.Unsorted; + + public OdinSharedEntryCollection(LocalizationTableCollection collection) + { + this.Collection = collection; + + this.FilteredEntries = new HashSet(); + } + + public SharedTableData.SharedTableEntry this[int index] => this.Entries[index]; + + public bool IsVisible(SharedTableData.SharedTableEntry sharedEntry) + { + return !this.IsSearching || (this.IsSearching && this.FilteredEntries.Contains(sharedEntry)); + } + + public bool UpdateSearchTerm(string value, + OdinGUITableCollection tables, + LocalizationTableCollection collection, + bool forceUpdate = false) where TTable : LocalizationTable + { + if (this.SearchTerm == value && !forceUpdate) + { + return false; + } + + this.SearchTerm = value; + + if (string.IsNullOrEmpty(this.SearchTerm)) + { + return true; + } + + this.FilteredEntries.Clear(); + + for (var i = 0; i < tables.Count; i++) + { + OdinGUITable table = tables[i]; + + switch (table.Type) + { + case OdinGUITable.GUITableType.Default: + switch (table.Asset) + { + case AssetTable assetTable: + var assetCollection = collection as AssetTableCollection; + + for (var j = 0; j < this.Length; j++) + { + SharedTableData.SharedTableEntry sharedEntry = this[j]; + + Type assetType = assetCollection.GetEntryAssetType(sharedEntry.Id); + + UnityEngine.Object asset = OdinLocalizationAssetCache.Get(sharedEntry, assetTable, assetType); + + if (asset == null) + { + continue; + } + + if (FuzzySearch.Contains(this.SearchTerm, asset.name)) + { + this.FilteredEntries.Add(sharedEntry); + } + } + + break; + + case StringTable stringTable: + for (var j = 0; j < this.Length; j++) + { + SharedTableData.SharedTableEntry sharedEntry = this[j]; + + StringTableEntry entry = stringTable.GetEntry(sharedEntry.Id); + + if (entry is null || string.IsNullOrEmpty(entry.Value)) + { + continue; + } + + if (FuzzySearch.Contains(this.SearchTerm, entry.Value)) + { + this.FilteredEntries.Add(sharedEntry); + } + } + + break; + } + + break; + + case OdinGUITable.GUITableType.Key: + for (var j = 0; j < this.Entries.Count; j++) + { + if (FuzzySearch.Contains(this.SearchTerm, this.Entries[j].Key)) + { + this.FilteredEntries.Add(this.Entries[j]); + } + } + + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + + return true; + } + + public void SortByKeys(bool preserveCurrentOrder) + { + switch (this.CurrentSortOrderState) + { + case SortOrderState.Ascending: + this.stringComparer.IsAscending = true; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries.OrderBy(entry => entry.Key, this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Collection.SharedData.Entries.OrderBy(entry => entry.Key, this.stringComparer).ToList(); + } + + return; + + case SortOrderState.Descending: + this.stringComparer.IsAscending = false; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries.OrderByDescending(entry => entry.Key, this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Collection.SharedData.Entries.OrderByDescending(entry => entry.Key, this.stringComparer).ToList(); + } + + return; + } + } + + public void SortByAssetTable(AssetTableCollection collection, AssetTable table, bool preserveCurrentOrder) + { + switch (this.CurrentSortOrderState) + { + case SortOrderState.Ascending: + this.stringComparer.IsAscending = true; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries + .OrderBy(entry => GetAssetNameFromEntry(entry, table, collection), this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Collection.SharedData.Entries.OrderBy(entry => GetAssetNameFromEntry(entry, table, collection), this.stringComparer) + .ToList(); + } + + return; + + case SortOrderState.Descending: + this.stringComparer.IsAscending = false; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries + .OrderByDescending(entry => GetAssetNameFromEntry(entry, table, collection), + this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Entries.OrderByDescending(entry => GetAssetNameFromEntry(entry, table, collection), this.stringComparer).ToList(); + } + + return; + } + } + + public void SortByStringTable(StringTable table, bool preserveCurrentOrder) + { + switch (this.CurrentSortOrderState) + { + case SortOrderState.Ascending: + this.stringComparer.IsAscending = true; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries + .OrderBy(entry => GetStringFromEntry(entry, table), this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Collection.SharedData.Entries.OrderBy(entry => GetStringFromEntry(entry, table), this.stringComparer).ToList(); + } + + return; + + case SortOrderState.Descending: + this.stringComparer.IsAscending = false; + + if (preserveCurrentOrder) + { + List result = this.Collection.SharedData.Entries + .OrderByDescending(entry => GetStringFromEntry(entry, table), this.stringComparer) + .ThenBy(this.GetOrderIndex) + .ToList(); + + this.SortedEntries = result; + } + else + { + this.SortedEntries = this.Entries.OrderByDescending(entry => GetStringFromEntry(entry, table), this.stringComparer).ToList(); + } + + return; + } + } + + private static string GetStringFromEntry(SharedTableData.SharedTableEntry sharedEntry, StringTable table) + { + StringTableEntry entry = table.GetEntry(sharedEntry.Id); + + return entry?.Value; + } + + private static string GetAssetNameFromEntry(SharedTableData.SharedTableEntry sharedEntry, AssetTable table, AssetTableCollection collection) + { + AssetTableEntry entry = table.GetEntry(sharedEntry.Id); + + if (entry == null || entry.IsEmpty) + { + return null; + } + + Type type = collection.GetEntryAssetType(sharedEntry.Id); + + UnityEngine.Object asset = OdinLocalizationAssetCache.Get(entry.Guid, type); + + return asset == null ? null : asset.name; + } + + public void MoveEntry(int from, int to) + { + if (from < 0 || from >= this.Entries.Count) + { + return; + } + + if (to < 0 || to > this.Entries.Count) + { + return; + } + + if (from == to) + { + return; + } + + SharedTableData.SharedTableEntry fromEntry = this.Collection.SharedData.Entries[from]; + + if (to > from) + { + to -= 1; + } + + //to = afterTo ? to + 1 : to; + + this.Collection.SharedData.Entries.RemoveAt(from); + + this.Collection.SharedData.Entries.Insert(to, fromEntry); + + OdinLocalizationEvents.RaiseTableEntryModified(this.Collection.SharedData.Entries[from]); + OdinLocalizationEvents.RaiseTableEntryModified(this.Collection.SharedData.Entries[to]); + + EditorUtility.SetDirty(this.Collection.SharedData); + } + + public void GotoNextSortOrderState() + { + switch (this.CurrentSortOrderState) + { + case SortOrderState.Unsorted: + this.CurrentSortOrderState = SortOrderState.Ascending; + break; + + case SortOrderState.Ascending: + this.CurrentSortOrderState = SortOrderState.Descending; + break; + + case SortOrderState.Descending: + this.CurrentSortOrderState = SortOrderState.Unsorted; + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + + public int GetIndex(SharedTableData.SharedTableEntry sharedEntry) + { + for (var i = 0; i < this.Length; i++) + { + if (this[i].Id == sharedEntry.Id) + { + return i; + } + } + + return -1; + } + + public int GetOrderIndex(SharedTableData.SharedTableEntry sharedEntry) + { + if (this.IsSorted && this.SortedEntries.Count == this.Length) + { + for (var i = 0; i < this.SortedEntries.Count; i++) + { + if (this.SortedEntries[i].Id == sharedEntry.Id) + { + return i; + } + } + + return -1; + } + + for (var i = 0; i < this.Length; i++) + { + if (this[i].Id == sharedEntry.Id) + { + return i; + } + } + + return -1; + } + } +} diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs.meta new file mode 100644 index 000000000..2bd2fe99e --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinSharedEntryCollection.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a543e4ee8d6d4b629befbccf5aa7b5e6 +timeCreated: 1706407967 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs new file mode 100644 index 000000000..a7b74b0b8 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs @@ -0,0 +1,440 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#define USING_WIDTH_NON_PERCENT + +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinStringTableCollectionEditor : OdinTableCollectionEditor + { + private string currentSyntaxSource; + private string currentSyntaxHighlightedText; + private string currentSyntaxErrorMessage; + private bool currentSyntaxHasErrors; + + public OdinStringTableCollectionEditor(StringTableCollection collection, OdinMenuEditorWindow relatedWindow, + OdinLocalizationEditorWindow.WindowState windowState) : + base(collection, relatedWindow, windowState) { } + + protected override void OnInitialize() + { + for (var i = 0; i < this.SharedEntries.Length; i++) + { + SharedTableData.SharedTableEntry sharedEntry = this.SharedEntries[i]; + + this.MeasureEntry(sharedEntry); + } + + //this.SharedEntries.OnSharedEntryAdded += (i, sharedEntry) => { this.MeasureEntry(sharedEntry); }; + + //this.SharedEntries.OnSharedEntryRemoved += (i, sharedEntry) => { this.SharedEntryHeights.Remove(sharedEntry.Id); }; + + this.OnTableEntryModified = sharedEntry => + { + if (!this.Collection.SharedData.Contains(sharedEntry.Id)) + { + return; + } + + int index = this.SharedEntries.GetIndex(sharedEntry); + + this.MeasureEntry(sharedEntry); + + this.EntryScrollView.ReallocateRect(index, this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + }; + } + + protected override void AllocateItems() + { + for (var i = 0; i < this.SharedEntries.Length; i++) + { + SharedTableData.SharedTableEntry sharedEntry = this.SharedEntries[i]; + + if (!this.SharedEntries.IsVisible(sharedEntry)) + { + continue; + } + + if (!this.SharedEntryHeights.ContainsKey(sharedEntry.Id)) + { + this.MeasureEntry(sharedEntry); + } + + this.EntryScrollView.AllocateRect(this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + +#if false + this.ControlIds[sharedEntry] = GUIUtility.GetControlID(FocusType.Keyboard); + + for (var j = 0; j < this.GUITables.Count; j++) + { + OdinGUITable table = this.GUITables[j]; + + if (table.Type == OdinGUITable.GUITableType.Key) + { + continue; + } + + StringTableEntry entry = table.Table.GetEntry(sharedEntry.Id); + + if (entry is null) + { + table.Table.AddEntry(sharedEntry.Id, string.Empty); + + entry = table.Table.GetEntry(sharedEntry.Id); + } + + this.ControlIds[entry] = GUIUtility.GetControlID(FocusType.Keyboard); + } +#endif + } + } + + protected override void DrawItems(ref OdinGUIScrollView.VisibleItems visibleItems) + { + this.MeasureVisibleEntries(ref visibleItems); + + float scrollSpeed = OdinLocalizationConfig.Instance.scrollSpeed; + + this.EntryScrollView.BeginScrollView(offset: new Vector2(this.PinnedWidth, OdinLocalizationConstants.COLUMN_HEIGHT), + addViewSize: new Vector2(-this.PinnedWidth, 0), + scrollSpeed: scrollSpeed); + { + this.DrawEntries(ref visibleItems, false); + } + this.EntryScrollView.EndScrollView(); + + this.EntryScrollView.BeginClip(offset: new Vector2(0.0f, OdinLocalizationConstants.COLUMN_HEIGHT), ignoreScrollX: true); + { + this.DrawEntries(ref visibleItems, true); + } + this.EntryScrollView.EndClip(); + } + + private void DrawEntries(ref OdinGUIScrollView.VisibleItems visibleItems, bool pinned) + { + for (var i = 0; i < visibleItems.Length; i++) + { + if (!visibleItems.HasAssociatedData(i)) + { + continue; + } + + int hint = visibleItems.Offset + i + this.ControlIdHint; + + Rect position = visibleItems.GetRect(i); + + var sharedEntry = visibleItems.GetAssociatedData(i); + + bool isEven = (visibleItems.Offset + i) % 2 == 0; + + for (var j = 0; j < this.GUITables.Count; j++) + { + OdinGUITable table = this.GUITables[j]; + + if (!table.IsVisible) + { + continue; + } + + if (table.IsPinned != pinned) + { + continue; + } + + if (!this.GUITables.TablesWithinVisibleBounds.Contains(table)) + { + GUIUtility.GetControlID(hint, FocusType.Keyboard); + position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); + continue; + } + + +#if USING_WIDTH_NON_PERCENT + Rect entryRect = position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); +#else + Rect entryRect = position.TakeFromLeft(table.Width).Padding(OdinLocalizationConstants.ENTRY_PADDING); +#endif + + bool isCellPressed, isSelected; + + switch (table.Type) + { + case OdinGUITable.GUITableType.Key: + isSelected = this.IsSharedEntrySelected(sharedEntry); + + if (isSelected) + { + this.SelectionAnimFloat.Move(1 / 0.18f, Easing.InSine); + + FancyColor start = FancyColor.Gray; + + var end = OdinLocalizationGUI.Selected; + + FancyColor.PushBlend(start.Lerp(end, this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + + isCellPressed = DrawCell(entryRect, isEven); + + this.DrawKey(entryRect, sharedEntry, GUIUtility.GetControlID(hint, FocusType.Keyboard)); + + if (isSelected) + { + FancyColor.PopBlend(); + } + + if (isCellPressed) + { + this.SelectSharedEntry(sharedEntry); + } + + break; + + case OdinGUITable.GUITableType.Default: + StringTableEntry entry = table.Asset.GetEntry(sharedEntry.Id); + + isSelected = this.IsEntrySelected(entry); + + if (isSelected) + { + this.SelectionAnimFloat.Move(1 / 0.18f, Easing.InSine); + + FancyColor start = FancyColor.Gray; + + FancyColor end = OdinLocalizationGUI.Selected; + + if (entry.IsSmart && OdinLocalizationConfig.Instance.useSyntaxHighlighter) + { + if (this.currentSyntaxSource != entry.Value) + { + this.currentSyntaxHighlightedText = OdinLocalizationSyntaxHighlighter.HighlightAsRichText(entry.Value); + this.currentSyntaxErrorMessage = OdinLocalizationSyntaxHighlighter.GetErrorMessage(entry.Value, out bool foundError); + this.currentSyntaxHasErrors = foundError; + this.currentSyntaxSource = entry.Value; + } + + if (this.currentSyntaxHasErrors) + { + FancyColor.PushBlend(start.Lerp(new FancyColor(0.68f, 0.2f, 0.2f), this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + else + { + FancyColor.PushBlend(start.Lerp(end, this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + } + else + { + FancyColor.PushBlend(start.Lerp(end, this.SelectionAnimFloat), FancyColor.BlendMode.Overlay); + } + } + + isCellPressed = DrawCell(entryRect, isEven); + + this.DrawEntry(entryRect, entry, GUIUtility.GetControlID(hint, FocusType.Keyboard), table, sharedEntry); + + if (isSelected) + { + if (OdinLocalizationConfig.Instance.useSyntaxHighlighter && entry.IsSmart && this.currentSyntaxHasErrors) + { + Rect errorRect = entryRect.AlignLeft(OdinLocalizationConstants.ROW_MENU_WIDTH).AlignMiddle(16); + + SdfIcons.DrawIcon(errorRect, SdfIconType.ExclamationOctagonFill, + Event.current.IsMouseOver(errorRect) ? new Color(1, 1, 1, 1f) : new Color(1, 1, 1, 0.6f)); + + if (Event.current.OnMouseDown(errorRect, 0)) + { + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.ExclamationOctagonFill, + this.currentSyntaxErrorMessage, + new Color(0.68f, 0.2f, 0.2f), + 20.0f); + } + } + + FancyColor.PopBlend(); + } + + if (isCellPressed) + { + if (entry is null) + { + entry = table.Asset.AddEntry(sharedEntry.Id, string.Empty); + } + + this.SelectEntry(entry); + } + + break; + } + } + } + } + + private void DrawEntry(Rect position, StringTableEntry entry, int id, OdinGUITable table, SharedTableData.SharedTableEntry sharedEntry) + { + bool changed; + string value; + + Rect smartToggleRect = position.TakeFromRight(OdinLocalizationConstants.ROW_MENU_WIDTH); + position.TakeFromLeft(OdinLocalizationConstants.ROW_MENU_WIDTH); + + if (entry?.Value is null) + { + value = OdinLocalizationGUI.TextField(position, string.Empty, out changed, id); + } + else if (OdinLocalizationConfig.Instance.useSyntaxHighlighter && entry.IsSmart && entry == this.CurrentSelectedEntry) + { + value = OdinLocalizationGUI.TextFieldSyntaxHighlighted(position, entry.Value, this.currentSyntaxHighlightedText, out changed, id); + + if (changed) + { + this.currentSyntaxHighlightedText = OdinLocalizationSyntaxHighlighter.HighlightAsRichText(value); + this.currentSyntaxErrorMessage = OdinLocalizationSyntaxHighlighter.GetErrorMessage(value, out bool foundError); + this.currentSyntaxHasErrors = foundError; + this.currentSyntaxSource = value; + } + } + else + { + value = OdinLocalizationGUI.TextField(position, entry.Value, out changed, id); + } + + if (changed) + { + if (entry == null) + { + entry = table.Asset.AddEntry(sharedEntry.Id, value); + } + + Undo.RecordObject(entry.Table, "Modified String Table Entry Text"); + entry.Value = value; + OdinLocalizationEvents.RaiseTableEntryModified(entry.SharedEntry); + EditorUtility.SetDirty(entry.Table); + } + + smartToggleRect = smartToggleRect.AlignMiddle(16); + + if (entry == null) + { + SdfIcons.DrawIcon(smartToggleRect, SdfIconType.Lightbulb, new Color(1, 1, 1, Event.current.IsMouseOver(smartToggleRect) ? 0.8f : 0.3f)); + + if (Event.current.OnMouseDown(smartToggleRect, 0)) + { + Undo.RecordObject(table.Asset, "Added String Table Entry By Smart Toggle"); + entry = table.Asset.AddEntry(sharedEntry.Id, string.Empty); + + entry.IsSmart = !entry.IsSmart; + EditorUtility.SetDirty(table.Asset); + } + } + else + { + SdfIcons.DrawIcon(smartToggleRect, + entry.IsSmart ? SdfIconType.LightbulbFill : SdfIconType.Lightbulb, + new Color(1, 1, 1, Event.current.IsMouseOver(smartToggleRect) ? 0.8f : 0.3f)); + + if (Event.current.OnMouseDown(smartToggleRect, 0)) + { + Undo.RecordObject(entry.Table, "Toggled Smart Flag On String Entry"); + entry.IsSmart = !entry.IsSmart; + EditorUtility.SetDirty(entry.Table); + } + } + + GUI.Label(smartToggleRect, GUIHelper.TempContent(string.Empty, "Toggle Smart String")); + } + + protected override void MeasureAllEntries() + { + for (var i = 0; i < this.SharedEntries.Length; i++) + { + this.MeasureEntry(this.SharedEntries[i]); + } + + this.HasGUIChanged = true; + } + + protected override void MeasureVisibleEntries(ref OdinGUIScrollView.VisibleItems visibleItems) + { + int dataOffset = visibleItems.Offset; + + for (var i = 0; i < visibleItems.Length; i++) + { + if (!visibleItems.HasAssociatedData(i)) + { + continue; + } + + var sharedEntry = visibleItems.GetAssociatedData(i); + + this.MeasureEntry(sharedEntry); + + this.EntryScrollView.ReallocateRect(dataOffset + i, this.SharedEntryHeights[sharedEntry.Id], sharedEntry); + } + } + + private void MeasureEntry(SharedTableData.SharedTableEntry sharedEntry) + { + float height = OdinLocalizationConstants.ROW_HEIGHT; + + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable currentTable = this.GUITables[i]; + + switch (currentTable.Type) + { + case OdinGUITable.GUITableType.Default: + StringTableEntry strEntry = currentTable.Asset.GetEntry(sharedEntry.Id); + + if (strEntry is null) + { + continue; + } + +#if USING_WIDTH_NON_PERCENT + float strEntryHeight = MeasureText(strEntry.Value, currentTable.Width); +#else + float strEntryHeight = MeasureText(strEntry.Value, currentTable.Width); +#endif + + if (strEntryHeight > height) + { + height = strEntryHeight; + } + + break; + + case OdinGUITable.GUITableType.Key: +#if USING_WIDTH_NON_PERCENT + float keyHeight = MeasureText(sharedEntry.Key, currentTable.Width); +#else + float keyHeight = MeasureText(sharedEntry.Key, currentTable.Width); +#endif + + if (keyHeight > height) + { + height = keyHeight; + } + + break; + } + } + + this.SharedEntryHeights[sharedEntry.Id] = height; + } + + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs.meta new file mode 100644 index 000000000..695cbff7e --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinStringTableCollectionEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8803d1557464e9a9d34713c9c9755af +timeCreated: 1704811189 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs new file mode 100644 index 000000000..81cdfcc10 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs @@ -0,0 +1,2719 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#define USING_WIDTH_NON_PERCENT +//#undef USING_WIDTH_NON_PERCENT + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Serialization; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public enum OdinTableSelectionType + { + None, + SharedEntry, + SharedTable, + Table, + TableEntry + } + + public abstract class OdinTableCollectionEditor where TCollection : LocalizationTableCollection + where TTable : LocalizationTable + where TEntry : TableEntry + { + public const int SELECTOR_ID = Int32.MinValue + 14085; + + internal struct DragInfo + { + public static DragInfo None => new DragInfo {Index = -1}; + + public bool IsNone => this.Index == -1; + + public int Index; + } + + [HideInInspector] + public TCollection Collection; + + [HideInInspector] + public OdinGUITableCollection GUITables; + + [HideInInspector] + public OdinSharedEntryCollection SharedEntries; + + [HideInInspector] + public Dictionary SharedEntryHeights; + + [HideInInspector] + public OdinGUIScrollView EntryScrollView; + + [HideInInspector] + public Dictionary> LocaleTableMap; + + [HideInInspector] + public SearchField SearchField = new SearchField(); + + [HideInInspector] + public OdinTableSelectionType SelectionType = OdinTableSelectionType.None; + + [HideInInspector] + public OdinGUITable CurrentSelectedTable; + + [HideInInspector] + public SharedTableData.SharedTableEntry CurrentSelectedSharedEntry; + + [HideInInspector] + public TEntry CurrentSelectedEntry; + + [HideInInspector] + public OdinMenuItem MenuItem; + + protected OdinMenuEditorWindow RelatedWindow; + protected int RelatedWindowId; + protected OdinLocalizationEditorWindow.WindowState WindowState; + + protected float PinnedWidth; + + protected OdinGUITable KeyTable; + + protected SirenixAnimationUtility.InterpolatedFloat SelectionAnimFloat = 0.0f; + + protected int ControlIdHint = "Odin_LocalizationEditor_Control".GetHashCode(); + protected int DragDropIdHint = "Odin_LocalizationEditor_DropId".GetHashCode(); + + private bool isForceDeleteKey; + private SharedTableData.SharedTableEntry keyToRemove; + //private bool isDraggingNonHandle; + + protected Action OnTableEntryModified; + + protected Action OnAssetTableEntryAdded; + + protected Action OnAssetTableEntryRemoved; + + //protected Dictionary guiIDs; + //protected Dictionary ControlIds; + + protected bool HasHandledCurrentModifiedEntry; + protected TEntry CurrentModifiedEntry; + + private Action OnTableAddedToCollection; + + private Action OnTableRemovedFromCollection; + + private Undo.UndoRedoCallback OnUndoRedoPerformed; + + private float rightMenuWidth; + + private OdinGUITable sortedTable; + + protected readonly List LooseTables = new List(); + + public OdinTableCollectionEditor(TCollection collection, OdinMenuEditorWindow relatedWindow, OdinLocalizationEditorWindow.WindowState windowState) + { + this.Collection = collection; + this.WindowState = windowState; + + this.GUITables = new OdinGUITableCollection(this.Collection.Tables.Count); + +#if USING_WIDTH_NON_PERCENT + this.GUITables.AddKeyTable(); +#else + float averageWidthPercent = 1.0f / (this.Collection.Tables.Count + 1); + + this.GUITables.AddKeyTable(averageWidthPercent); +#endif + this.KeyTable = this.GUITables.Last(); + + this.LocaleTableMap = new Dictionary>(this.Collection.Tables.Count); + + for (var i = 0; i < this.Collection.Tables.Count; i++) + { + var tableAsset = (TTable) this.Collection.Tables[i].asset; + + Locale tableLocale = LocalizationEditorSettings.GetLocale(tableAsset.LocaleIdentifier); + + if (tableLocale == null) + { + Debug.LogWarning($"No locale found for {tableAsset.name} in {this.Collection.name}, searched for: {tableAsset.LocaleIdentifier}"); + continue; + } + +#if USING_WIDTH_NON_PERCENT + OdinGUITable table = OdinGUITable.CreateTable(tableAsset, tableLocale); +#else + OdinGUITable table = OdinGUITable.CreateTable(tableAsset, averageWidthPercent); +#endif + + this.GUITables.Add(table); + + this.LocaleTableMap[LocalizationEditorSettings.GetLocale(tableAsset.LocaleIdentifier)] = table; + } + + this.SharedEntries = new OdinSharedEntryCollection(this.Collection); + + //this.ControlIds = new Dictionary(this.SharedEntries.Length + 64); + + this.EntryScrollView = new OdinGUIScrollView(this.SharedEntries.Length + 64, adjustViewForVerticalScrollBar: false); + + this.RelatedWindow = relatedWindow; + this.RelatedWindowId = this.RelatedWindow.GetInstanceID(); + this.keyToRemove = null; + this.isForceDeleteKey = false; + + this.LooseTables.Clear(); + LocalizationEditorSettings.FindLooseStringTablesUsingSharedTableData(this.Collection.SharedData, this.LooseTables); + this.rightMenuWidth = EditorPrefs.GetFloat("OdinTableCollectionEditor_RightMenuWidth", 300.0f); + + this.OnUndoRedoPerformed += () => + { + this.Collection.RefreshAddressables(); + this.MenuItem.Name = this.Collection.SharedData.TableCollectionName; + }; + } + + protected abstract void OnInitialize(); + + private bool hasInitialized; + + public void Initialize() + { + if (this.hasInitialized) + { + return; + } + + this.SharedEntryHeights = new Dictionary(this.SharedEntries.Length + 128); + + this.OnTableAddedToCollection += (collection, table) => + { + if (this.Collection != collection) + { + return; + } + + Locale locale = LocalizationEditorSettings.GetLocale(table.LocaleIdentifier); + + if (locale == null) + { + Debug.LogWarning($"No locale found for {table.name} in {collection.name}, searched for: {table.LocaleIdentifier}"); + return; + } + + if (this.LocaleTableMap.ContainsKey(locale)) + { + return; + } + +#if USING_WIDTH_NON_PERCENT + OdinGUITable guiTable = OdinGUITable.CreateTable((TTable) table, locale); +#else + float lastAveragePercent = 1.0f / this.GUITables.Count; + + float newAveragePercent = 1.0f / (this.GUITables.Count + 1); + + for (var i = 0; i < this.GUITables.Count; i++) + { + this.GUITables[i].WidthPercentage *= newAveragePercent / lastAveragePercent; + } + + OdinGUITable guiTable = OdinGUITable.CreateTable((TTable) table, newAveragePercent); +#endif + + this.GUITables.Add(guiTable); + + this.LocaleTableMap[locale] = guiTable; + + this.LooseTables.Clear(); + LocalizationEditorSettings.FindLooseStringTablesUsingSharedTableData(this.Collection.SharedData, this.LooseTables); + }; + + this.OnTableRemovedFromCollection += (collection, table) => + { + if (this.Collection != collection) + { + return; + } + +#if !USING_WIDTH_NON_PERCENT + float lastAveragePercent = 1.0f / this.GUITables.Count; +#endif + + Locale locale = LocalizationEditorSettings.GetLocale(table.LocaleIdentifier); + + this.GUITables.Remove(this.LocaleTableMap[locale]); + + this.LocaleTableMap.Remove(locale); + +#if !USING_WIDTH_NON_PERCENT + float newAveragePercent = 1.0f / this.GUITables.Count; + + for (var i = 0; i < this.GUITables.Count; i++) + { + this.GUITables[i].WidthPercentage *= newAveragePercent / lastAveragePercent; + } +#endif + + this.LooseTables.Clear(); + LocalizationEditorSettings.FindLooseStringTablesUsingSharedTableData(this.Collection.SharedData, this.LooseTables); + }; + +#if false + this.UndoHandler = () => + { + switch (Undo.GetCurrentGroupName()) + { + case "Add table to collection": + for (var i = 0; i < this.Collection.Tables.Count; i++) + { + LocalizationTable tableAsset = this.Collection.Tables[i].asset; + Locale locale = LocalizationEditorSettings.GetLocale(tableAsset.LocaleIdentifier); + + if (locale == null) + { + Debug.LogWarning($"No locale found for {tableAsset.name} in {this.Collection.name}, searched for: {tableAsset.LocaleIdentifier}"); + continue; + } + + if (this.LocaleTableMap.ContainsKey(locale)) + { + continue; + } + + OdinGUITable table = OdinGUITable.CreateTable((TTable) tableAsset, locale); + + this.GUITables.Add(table); + + this.LocaleTableMap.Add(locale, table); + + this.Collection.RemoveTable(tableAsset); + this.Collection.AddTable(tableAsset); + } + + var localesToRemove = new Stack(); + + foreach (KeyValuePair> kvp in this.LocaleTableMap) + { + if (!this.Collection.ContainsTable(kvp.Key.Identifier)) + { + localesToRemove.Push(kvp.Key); + } + } + + while (localesToRemove.Count > 0) + { + Locale locale = localesToRemove.Pop(); + OdinGUITable table = this.LocaleTableMap[locale]; + + this.GUITables.Remove(table); + this.LocaleTableMap.Remove(locale); + } + + break; + } + }; +#endif + + this.OnInitialize(); + + this.hasInitialized = true; + } + + private bool needsToCheckForErrors = false; + + public void OnSelectInWindow() + { + this.needsToCheckForErrors = true; + + this.Initialize(); + + this.AttachEvents(); + } + + private bool hasAttachedEvents; + + public void AttachEvents() + { + if (this.hasAttachedEvents) + { + return; + } + + // this.SharedEntries.AttachEvents(); + + if (this.OnTableEntryModified != null) + { + LocalizationEditorSettings.EditorEvents.TableEntryModified += this.OnTableEntryModified; + } + + if (this.OnAssetTableEntryAdded != null) + { + LocalizationEditorSettings.EditorEvents.AssetTableEntryAdded += this.OnAssetTableEntryAdded; + } + + if (this.OnAssetTableEntryRemoved != null) + { + LocalizationEditorSettings.EditorEvents.AssetTableEntryRemoved += this.OnAssetTableEntryRemoved; + } + + if (this.OnTableAddedToCollection != null) + { + LocalizationEditorSettings.EditorEvents.TableAddedToCollection += this.OnTableAddedToCollection; + } + + if (this.OnTableRemovedFromCollection != null) + { + LocalizationEditorSettings.EditorEvents.TableRemovedFromCollection += this.OnTableRemovedFromCollection; + } + + if (this.OnUndoRedoPerformed != null) + { + Undo.undoRedoPerformed += this.OnUndoRedoPerformed; + } + + this.hasAttachedEvents = true; + } + + public void DetachEvents() + { + if (!this.hasAttachedEvents) + { + return; + } + + // this.SharedEntries.DetachEvents(); + + if (this.OnTableEntryModified != null) + { + LocalizationEditorSettings.EditorEvents.TableEntryModified -= this.OnTableEntryModified; + } + + if (this.OnAssetTableEntryAdded != null) + { + LocalizationEditorSettings.EditorEvents.AssetTableEntryAdded -= this.OnAssetTableEntryAdded; + } + + if (this.OnAssetTableEntryRemoved != null) + { + LocalizationEditorSettings.EditorEvents.AssetTableEntryRemoved -= this.OnAssetTableEntryRemoved; + } + + if (this.OnTableAddedToCollection != null) + { + LocalizationEditorSettings.EditorEvents.TableAddedToCollection -= this.OnTableAddedToCollection; + } + + if (this.OnTableRemovedFromCollection != null) + { + LocalizationEditorSettings.EditorEvents.TableRemovedFromCollection -= this.OnTableRemovedFromCollection; + } + + if (this.OnUndoRedoPerformed != null) + { + Undo.undoRedoPerformed -= this.OnUndoRedoPerformed; + } + + this.hasAttachedEvents = false; + } + + public virtual void RemoveKey(SharedTableData.SharedTableEntry sharedEntry) + { + this.SharedEntryHeights.Remove(sharedEntry.Id); + + this.GUITables.UndoRecordCollection(this.Collection.SharedData, "Removed Shared Table Entry from Collection"); + + this.Collection.RemoveEntry(sharedEntry.Id); + + this.GUITables.SetDirty(this.Collection.SharedData); + } + + public void SelectEntry(TEntry entry) + { +#if false + if (this.Collection.SharedData.Metadata.HasMetadata()) + { + var templateMetadata = this.Collection.SharedData.Metadata.GetMetadata(); + + if (templateMetadata.MetadataExpected.Count > 0) + { + for (var i = 0; i < templateMetadata.MetadataExpected.Count; i++) + { + if (this.HasMetadataAmountOfType(entry.MetadataEntries, templateMetadata.MetadataExpected[i], templateMetadata)) + { + continue; + } + + entry.AddMetadata((IMetadata) templateMetadata.MetadataExpected[i].InstantiateDefault(false)); + } + } + } +#endif + + OdinTableSelectionType lastSelectionType = this.SelectionType; + + this.SelectionType = OdinTableSelectionType.TableEntry; + + TEntry lastSelection = this.CurrentSelectedEntry; + + this.CurrentSelectedEntry = entry; + + if (lastSelection == entry && this.SelectionType == lastSelectionType) + { + return; + } + + this.SelectionAnimFloat = 0.0f; + this.SelectionAnimFloat.Destination = 1.0f; + + if (this.WindowState.CurrentTopTab != OdinLocalizationEditorWindow.RightMenuTopTabs.Metadata) + { + return; + } + + this.WindowState.ShowSharedMetadata = false; + + this.UpdateMetadataViewForEntry(entry); + } + + public void SelectSharedEntry(SharedTableData.SharedTableEntry sharedEntry) + { + this.SelectionType = OdinTableSelectionType.SharedEntry; + + if (this.CurrentSelectedSharedEntry != sharedEntry) + { + this.SelectionAnimFloat = 0.0f; + this.SelectionAnimFloat.Destination = 1.0f; + } + + this.CurrentSelectedSharedEntry = sharedEntry; + + if (this.WindowState.CurrentTopTab != OdinLocalizationEditorWindow.RightMenuTopTabs.Metadata) + { + return; + } + + this.WindowState.ShowSharedMetadata = true; + + this.WindowState.MetadataTree?.Dispose(); + + this.WindowState.MetadataTree = PropertyTree.Create(sharedEntry); + } + + public void SelectTable(OdinGUITable table) + { + this.SelectionType = table.Type == OdinGUITable.GUITableType.Key + ? OdinTableSelectionType.SharedTable + : OdinTableSelectionType.Table; + this.CurrentSelectedTable = table; + } + + public void UpdateMetadataViewForEntry(TEntry entry) + { + this.WindowState.MetadataTree?.Dispose(); + + object metadataData = null; + + if (this.WindowState.ShowSharedMetadata) + { + metadataData = entry.SharedEntry; + } + else + { + if (typeof(TEntry) == typeof(AssetTableEntry)) + { + metadataData = OdinLocalizationReflectionValues.AssetTableEntry_Data_Property.GetValue(entry); + } + + if (typeof(TEntry) == typeof(StringTableEntry)) + { + metadataData = OdinLocalizationReflectionValues.StringTableEntry_Data_Property.GetValue(entry); + } + } + + if (metadataData != null) + { + this.WindowState.MetadataTree = PropertyTree.Create(metadataData); + } + } + + public bool IsSharedEntrySelected(SharedTableData.SharedTableEntry sharedEntry) + { + return this.SelectionType == OdinTableSelectionType.SharedEntry && this.CurrentSelectedSharedEntry == sharedEntry; + } + + public bool IsEntrySelected(TEntry entry) + { + if (entry == null) + { + return false; + } + + return this.SelectionType == OdinTableSelectionType.TableEntry && this.CurrentSelectedEntry == entry; + } + + public bool IsTableSelected(OdinGUITable table) + { + + return (this.SelectionType == OdinTableSelectionType.Table || + this.SelectionType == OdinTableSelectionType.SharedTable) && this.CurrentSelectedTable == table; + } + + public void ClearSelection() + { + GUIUtility.hotControl = 0; + GUIUtility.keyboardControl = 0; + this.SelectionType = OdinTableSelectionType.None; + this.WindowState.MetadataTree?.Dispose(); + this.WindowState.MetadataTree = null; + } + + public void ClearFocus() + { + GUIUtility.hotControl = 0; + GUIUtility.keyboardControl = 0; + } + + protected bool HasGUIChanged = true; + private int lastGUIEntryCount; + + + private bool firstTimeSeeingTable = true; + + private AddressableEntryNotFoundException tableAddressableException; + private string exceptionHeaderMsg = string.Empty; + private string exceptionMsg = string.Empty; + + + [OnInspectorGUI] + public void DrawAndHandleExceptions() + { + if (this.tableAddressableException != null) + { + const float SPACING = 10; + + Rect rect = GUILayoutUtility.GetRect(0, 0, GUILayoutOptions.ExpandWidth().ExpandHeight()); + + rect = rect.AlignCenter(520, 200); + + Color shadowColor = EditorGUIUtility.isProSkin ? new Color(1, 0, 0, 0.2588235f) : new Color(1, 0, 0, 0.3137255f); + + OdinLocalizationGUI.DrawRoundBlur20(rect, shadowColor); + + Color backgroundColor = EditorGUIUtility.isProSkin ? new Color(0.6037736f, 0.1566394f, 0.1566394f) : new Color(0.8301887f, 0.238875f, 0.238875f); + + SirenixEditorGUI.DrawRoundRect(rect, backgroundColor, 7.5f); + + rect = rect.Padding(14); + + Rect buttonsArea = rect.TakeFromBottom(32); + + GUI.BeginClip(rect.Expand(14)); + { + Rect watermarkPosition = rect.SetPosition(Vector2.zero).AlignRight(80).Expand(34).AddX(30).SubY(20); + + SdfIcons.DrawIcon(watermarkPosition, SdfIconType.ExclamationDiamondFill, new Color(1, 1, 1, 0.075f)); + } + GUI.EndClip(); + + rect.height -= SPACING; + + float msgHeight = OdinLocalizationGUI.CardTitleWhite.CalcHeight(this.exceptionHeaderMsg, rect.width); + GUI.Label(rect.TakeFromTop(msgHeight), this.exceptionHeaderMsg, OdinLocalizationGUI.CardTitleWhite); + + rect.yMin += SPACING; + + GUI.Label(rect, this.exceptionMsg, SirenixGUIStyles.MultiLineWhiteLabel); + + if (OdinLocalizationGUI.OverlaidButton(buttonsArea.TakeFromRight(120), "Fix All", SdfIconType.Tools)) + { + this.Collection.RefreshAddressables(); + this.tableAddressableException = null; + + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Tools, + $"Refreshed Addressables for '{this.Collection.name}'.", + new Color(0.26f, 0.51f, 0.44f), + 12.0f); + } + + buttonsArea.width -= SPACING; + + if (OdinLocalizationGUI.OverlaidButton(buttonsArea.TakeFromRight(160), "Fix And Preload All", SdfIconType.Tools)) + { + this.Collection.RefreshAddressables(); + this.Collection.SetPreloadTableFlag(true); + this.tableAddressableException = null; + + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Tools, + $"Refreshed Addressables and Preloaded All Tables for '{this.Collection.name}'.", + new Color(0.26f, 0.51f, 0.44f), + 12.0f); + } + + return; + } + + try + { + this.Draw(); + + if (this.needsToCheckForErrors) + { + // NOTE: this attempts to catch any AddressableEntryNotFoundException errors, by fetching the Addressables for every table. + this.Collection.IsPreloadTableFlagSet(); + + this.needsToCheckForErrors = false; + } + } + catch (AddressableEntryNotFoundException e) + { + this.tableAddressableException = e; + + this.exceptionHeaderMsg = e.Message; + this.exceptionMsg = $"There could be multiple other tables facing the same issue in '{this.Collection.name}', " + + "this can potentially be resolved by refreshing the Addressables."; + + GUIHelper.ExitGUI(false); + } + } + + public void Draw() + { + if (Event.current.type == EventType.MouseUp) + { + SharedUniqueControlId.SetInactive(); + } + + if (this.EntryScrollView.IsDraggingMouse) + { + EditorGUIUtility.AddCursorRect(this.EntryScrollView.InteractRect, MouseCursor.Pan); + } + + if (this.HasHandledCurrentModifiedEntry) + { + this.CurrentModifiedEntry = null; + } + + // if (Event.current.type == EventType.MouseUp) + // { + // this.isDraggingNonHandle = false; + // } + // + bool shouldClearSelection = Event.current.OnKeyDown(KeyCode.Escape, false); + + //this.SharedEntries.UpdateIfChangesArePresent(); + + Rect position = GUILayoutUtility.GetRect(0, 0, GUILayoutOptions.ExpandWidth().ExpandHeight()); + + position = this.RelatedWindow.position.SetPosition(Vector2.zero); + position.TakeFromRight(this.RelatedWindow.MenuWidth); + + var leftMenuSliderRect = position.TakeFromLeft(10).SubX(1); + var rightMenuRect = position.TakeFromRight(this.WindowState.RightMenuWidth); + var rightMenuSliderRect = position.TakeFromRight(11); + + this.RelatedWindow.MenuWidth += this.VerticalSlideRect(leftMenuSliderRect.AddXMax(1), false); + this.RelatedWindow.MenuWidth = Mathf.Max(this.RelatedWindow.MenuWidth, 1); + + if (Event.current.clickCount > 1 && Event.current.IsMouseOver(leftMenuSliderRect)) + { + this.RelatedWindow.MenuWidth = 1; + + if (Event.current.control || Event.current.alt || Event.current.shift) + { + this.WindowState.RightMenuWidth = 0; + } + } + + if (Event.current.clickCount > 1 && Event.current.IsMouseOver(rightMenuSliderRect)) + { + if (Event.current.control || Event.current.alt || Event.current.shift) + { + if (this.WindowState.RightMenuWidth > 0) + { + this.WindowState.RightMenuWidth = 0; + this.WindowState.LeftMenuWidth = 0; + } + else + { + this.WindowState.RightMenuWidth = this.WindowState.LastOpenRightMenuWidth; + this.RelatedWindow.MenuWidth = this.WindowState.LastOpenRightMenuWidth; + } + } + else + { + if (this.WindowState.RightMenuWidth > 0) + { + this.WindowState.RightMenuWidth = 0; + } + else + { + this.WindowState.RightMenuWidth = this.WindowState.LastOpenRightMenuWidth; + } + } + } + + Rect toolbarRect = position.TakeFromTop(OdinLocalizationConstants.TOOLBAR_HEIGHT); + + Rect dragHandleRect = position.TakeFromLeft(OdinLocalizationConstants.DRAG_HANDLE_WIDTH); + + this.DrawToolbar(toolbarRect); + + this.GUITables.Sort(); + +#if USING_WIDTH_NON_PERCENT + for (var i = 0; i < this.GUITables.Count; i++) + { + this.GUITables[i].Width = this.GUITables[i].Width; + } +#endif + + float viewWidth = position.width; + +#if USING_WIDTH_NON_PERCENT + float columnsWidth = this.GUITables.GetVisibleWidth(); + + if (columnsWidth >= viewWidth) + { + viewWidth = columnsWidth; + } +#else + int columnsMinTotalWidth = this.GUITables.GetVisibleCount() * OdinLocalizationConstants.DEFAULT_COLUMN_WIDTH; + + if (columnsMinTotalWidth > viewWidth) + { + viewWidth = columnsMinTotalWidth; + } +#endif + + if (position != this.EntryScrollView.InteractRect) + { + this.HasGUIChanged = true; + } + + bool isEntryCountChanged = this.Collection.SharedData.Entries.Count != this.lastGUIEntryCount; + + if (this.HasGUIChanged || isEntryCountChanged) + { +#if false + if (isEntryCountChanged) + { + if (this.SharedEntries.IsSorted) + { + this.Resort(); + } + + if (this.SharedEntries.IsSearching) + { + this.SharedEntries.UpdateSearchTerm(this.SharedEntries.SearchTerm, this.GUITables, this.Collection); + } + } +#endif + + this.HasGUIChanged = false; + + if (isEntryCountChanged) + { + if (this.SharedEntries.IsSorted) + { + switch (this.sortedTable.Type) + { + case OdinGUITable.GUITableType.Default: + switch (this.sortedTable.Asset) + { + case AssetTable assetTable: + this.SharedEntries.SortByAssetTable(this.Collection as AssetTableCollection, assetTable, false); + break; + + case StringTable stringTable: + this.SharedEntries.SortByStringTable(stringTable, false); + break; + } + + break; + + case OdinGUITable.GUITableType.Key: + this.SharedEntries.SortByKeys(false); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + + if (this.SharedEntries.IsSearching) + { + this.SharedEntries.UpdateSearchTerm(this.SharedEntries.SearchTerm, this.GUITables, this.Collection, true); + } + } + + this.lastGUIEntryCount = this.Collection.SharedData.Entries.Count; + + float previousY = this.EntryScrollView.PositionY; + + this.EntryScrollView.SetBounds(position, viewWidth); + + this.EntryScrollView.BeginAllocations(); + { + this.AllocateItems(); + } + this.EntryScrollView.EndAllocations(); + + if (this.adjustViewForSeparatorChange && + this.lastViewHeight != 0.0f && + Math.Abs(this.lastViewHeight - this.EntryScrollView.ViewRect.height) > 0.01f) + { + float newHeight = this.EntryScrollView.ViewRect.height; + + float change = previousY / this.lastViewHeight; + + this.EntryScrollView.PositionY = change * newHeight; + + this.adjustViewForSeparatorChange = false; + } + } + else + { + this.EntryScrollView.SetBoundsForCurrentAllocations(position, viewWidth); + } + +#if !USING_WIDTH_NON_PERCENT + this.GUITables.CalcWidths(this.EntryScrollView); +#endif + + this.PinnedWidth = 0.0f; + + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable table = this.GUITables[i]; + + if (!table.IsVisible || !table.IsPinned) + { + continue; + } + +#if USING_WIDTH_NON_PERCENT + this.PinnedWidth += table.Width; +#else + this.PinnedWidth += this.GUITables[i].Width; +#endif + } + + if (this.PinnedWidth > this.EntryScrollView.Bounds.width) + { + this.PinnedWidth = this.EntryScrollView.Bounds.width; + this.GUITables.ResizePinnedToFit(this.EntryScrollView.Bounds.width); + } + + this.GUITables.UpdateVisibleTables(this.EntryScrollView, this.PinnedWidth); + + if (this.firstTimeSeeingTable && columnsWidth < viewWidth) + { + this.GUITables.ResizeToFit(this.EntryScrollView.Bounds.width - this.PinnedWidth); + this.firstTimeSeeingTable = false; + } + + + OdinGUIScrollView.VisibleItems visibleItems = this.EntryScrollView.GetVisibleItems(); + + this.DrawRows(ref visibleItems); + + this.DrawPseudoRows(); + + this.DrawItems(ref visibleItems); + + this.DrawColumnsAndSeparators(ref visibleItems); + + this.DrawDragHandles(dragHandleRect, ref visibleItems); + + this.DrawRightMenu(rightMenuRect); + + if (this.keyToRemove != null) + { + if (this.isForceDeleteKey || + EditorUtility.DisplayDialog("Odin Table Collection Editor", $"Are you sure you want to remove entry: {this.keyToRemove.Key}?", "Yes", "No")) + { + this.RemoveKey(this.keyToRemove); + } + + this.keyToRemove = null; + this.isForceDeleteKey = false; + } + + if (shouldClearSelection) + { + this.ClearSelection(); + } + + this.EntryScrollView.HandleMiddleMouseDrag(inverted: OdinLocalizationConfig.Instance.invertMouseDragNavigation, + speed: OdinLocalizationConfig.Instance.mouseDragSpeed); + + + this.WindowState.RightMenuWidth -= this.VerticalSlideRect(rightMenuSliderRect, true); + this.WindowState.RightMenuWidth = Mathf.Max(this.WindowState.RightMenuWidth, 0); + + if (this.WindowState.RightMenuWidth > 338) + { + this.WindowState.LastOpenRightMenuWidth = this.WindowState.RightMenuWidth; + } + } + + protected abstract void AllocateItems(); + + protected abstract void DrawItems(ref OdinGUIScrollView.VisibleItems visibleItems); + + protected abstract void MeasureAllEntries(); + + protected abstract void MeasureVisibleEntries(ref OdinGUIScrollView.VisibleItems visibleItems); + + // NOTE: returns true if pressed, TODO add xml comments later + protected static bool DrawCell(Rect rect, bool isEven) + { + Color background = isEven ? OdinLocalizationGUI.RowEvenBackground2 : OdinLocalizationGUI.RowOddBackground2; + + GUI.DrawTexture(rect, Texture2D.whiteTexture, ScaleMode.StretchToFill, false, 1, background, 0, 2.5f); + + if (Event.current.IsMouseOver(rect) && !DragAndDropUtilities.IsDragging) + { + GUI.DrawTexture(rect, Texture2D.whiteTexture, ScaleMode.StretchToFill, false, 1, OdinLocalizationGUI.RowBorderHover, 1, 2.5f); + } + else + { + GUI.DrawTexture(rect, Texture2D.whiteTexture, ScaleMode.StretchToFill, false, 1, OdinLocalizationGUI.RowBorder, 1, 2.5f); + } + + rect.x += OdinLocalizationConstants.ROW_MENU_WIDTH; + rect.width -= OdinLocalizationConstants.ROW_MENU_WIDTH + OdinLocalizationConstants.ROW_MENU_WIDTH; + bool isPressed = Event.current.OnMouseDown(rect, 0, false); + + return isPressed; + } + + protected void DrawKey(Rect rect, SharedTableData.SharedTableEntry sharedEntry, int id) + { + Rect removeRect = rect.TakeFromLeft(OdinLocalizationConstants.ROW_MENU_WIDTH); + Rect copyKeyIdRect = rect.TakeFromRight(OdinLocalizationConstants.ROW_MENU_WIDTH); + + Color removeBgColor = Event.current.IsMouseOver(removeRect) ? new Color(0.8f, 0.1f, 0.1f, 0.8f) : new Color(0, 0, 0, 0.2f); + + GUI.DrawTexture(removeRect, Texture2D.whiteTexture, ScaleMode.StretchToFill, false, 1.0f, removeBgColor, Vector4.zero, + new Vector4(2.5f, 0.0f, 0.0f, 2.5f)); + + if (Event.current.OnMouseDown(removeRect, 0)) + { + this.keyToRemove = sharedEntry; + + if (Event.current.modifiers == EventModifiers.Shift) + { + this.isForceDeleteKey = true; + } + + this.ClearSelection(); + + return; + } + + Color removeFgColor = Event.current.IsMouseOver(removeRect) ? new Color(1, 1, 1, 0.8f) : new Color(1, 1, 1, 0.5f); + + removeRect = removeRect.AlignCenter(14, 14); + + SdfIcons.DrawIcon(removeRect, SdfIconType.X, removeFgColor); + + // copyKeyIdRect.x -= 20; + + copyKeyIdRect = copyKeyIdRect.AlignCenter(16, 16); + + var isMouseOverKeyRect = Event.current.IsMouseOver(copyKeyIdRect); + + Matrix4x4 m = GUI.matrix; + GUIUtility.RotateAroundPivot(45.0f, copyKeyIdRect.center); + SdfIcons.DrawIcon(copyKeyIdRect, SdfIconType.KeyFill, new Color(1, 1, 1, isMouseOverKeyRect ? 0.8f : 0.3f)); + GUI.matrix = m; + + if (isMouseOverKeyRect) + { + GUI.Label(copyKeyIdRect, GUIHelper.TempContent(string.Empty, sharedEntry.Id.ToString())); + } + + if (Event.current.OnMouseDown(copyKeyIdRect, 0)) + { + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Clipboard, + $"Copied Key ID '{sharedEntry.Id}' to the clipboard.", + new Color(0.23f, 0.36f, 0.68f), + 8.0f); + + Clipboard.Copy(sharedEntry.Id.ToString()); + + this.ClearSelection(); + } + + string result = OdinLocalizationGUI.TextField(rect, sharedEntry.Key, out bool changed, id); + + if (!changed) + { + return; + } + + if (this.Collection.SharedData.Contains(result) && result != sharedEntry.Key) + { + this.RelatedWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.ExclamationOctagonFill, + $"Key '{result}' already exists in the collection.", + new Color(0.68f, 0.2f, 0.2f), + 8.0f); + } + else + { + Undo.RecordObject(this.Collection.SharedData, "Renamed Shared Table Entry Key"); + this.Collection.SharedData.RenameKey(sharedEntry.Id, result); + OdinLocalizationEvents.RaiseTableEntryModified(sharedEntry); + EditorUtility.SetDirty(this.Collection.SharedData); + } + } + + protected static float MeasureText(string text, float width) + { + // TODO: get rid of this magic number + width -= 20 + 20 + 8 + 16; + + float rowHeightWithoutText = OdinLocalizationConstants.ROW_HEIGHT - SirenixGUIStyles.MultiLineCenteredLabel.lineHeight; + + float heightOfText = SirenixGUIStyles.MultiLineCenteredLabel.CalcHeight(text, width) - SirenixGUIStyles.MultiLineCenteredLabel.padding.vertical; + + return rowHeightWithoutText + heightOfText; + } + + private void DrawToolbar(Rect position) + { + Rect originalPosition = position; + + Rect resizeToFitButtonRect = position.TakeFromRight(180f); + Rect addButtonRect = position.TakeFromRight(180f); + + position = position.Padding(4); + + if (GUI.Button(resizeToFitButtonRect, "Resize Columns To Fit", SirenixGUIStyles.ToolbarButton)) + { + this.GUITables.ResizeToFit(this.EntryScrollView.Bounds.width - this.PinnedWidth); + this.HasGUIChanged = true; + } + + if (GUI.Button(addButtonRect, "Add Shared Entry", SirenixGUIStyles.ToolbarButton)) + { + this.GUITables.UndoRecordCollection(this.Collection.SharedData, "Added Shared Entry To Collection"); + SharedTableData.SharedTableEntry sharedEntry = this.Collection.SharedData.AddKey(); + + OdinLocalizationEvents.RaiseTableEntryAdded(this.Collection, sharedEntry); + this.GUITables.SetDirty(this.Collection.SharedData); + } + + string searchTerm = this.SearchField.Draw(position, this.SharedEntries.SearchTerm, "Search for item(s)..."); + + if (this.SharedEntries.UpdateSearchTerm(searchTerm, this.GUITables, this.Collection)) + { + this.HasGUIChanged = true; + } + + if (!EditorGUIUtility.isProSkin) + { + EditorGUI.DrawRect(originalPosition, new Color(0, 0, 0, 0.05f)); + } + } + + private void DrawRows(ref OdinGUIScrollView.VisibleItems visibleItems) + { + Rect clipRect = this.EntryScrollView.GetClipRect(); + + clipRect.x -= OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + clipRect.width += OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + + this.EntryScrollView.BeginClip(clipRect, offset: new Vector2(0, OdinLocalizationConstants.COLUMN_HEIGHT)); + { + for (var i = 0; i < visibleItems.Length; i++) + { + Rect rect = visibleItems.GetRect(i); + + Rect dropZoneRect = rect; + + rect.width += OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + + bool isEven = (visibleItems.Offset + i) % 2 == 0; + + EditorGUI.DrawRect(rect, isEven ? OdinLocalizationGUI.RowEvenBackground : OdinLocalizationGUI.RowOddBackground); + + this.HandleDropZone(dropZoneRect, visibleItems.Offset + i); + } + } + this.EntryScrollView.EndClip(); + } + + private void DrawPseudoRows() + { + if (this.EntryScrollView.IsBeyondVerticalBounds) + { + return; + } + + var remainderRect = new Rect(this.EntryScrollView.Bounds.x - OdinLocalizationConstants.DRAG_HANDLE_WIDTH, + this.EntryScrollView.Bounds.y + this.EntryScrollView.ViewRect.height + OdinLocalizationConstants.COLUMN_HEIGHT, + this.EntryScrollView.Bounds.width + OdinLocalizationConstants.DRAG_HANDLE_WIDTH, + this.EntryScrollView.Bounds.height - this.EntryScrollView.ViewRect.height - OdinLocalizationConstants.COLUMN_HEIGHT); + + Rect maintainedRemainderRect = remainderRect; + + bool isNextEven = this.SharedEntries.Length % 2 == 0; + + while (remainderRect.height > 0) + { + Rect rect = remainderRect.TakeFromTop(OdinLocalizationConstants.ROW_HEIGHT); + Color color = isNextEven ? OdinLocalizationGUI.RowEvenBackground : OdinLocalizationGUI.RowOddBackground; + + EditorGUI.DrawRect(rect, color); + + isNextEven = !isNextEven; + } + + EditorGUI.DrawRect(maintainedRemainderRect, new Color(0, 0, 0, 0.25f)); + } + + private void DrawColumnsAndSeparators(ref OdinGUIScrollView.VisibleItems visibleItems) + { + EditorGUI.DrawRect(this.EntryScrollView.Bounds.AlignTop(OdinLocalizationConstants.COLUMN_HEIGHT), OdinLocalizationGUI.ColumnBackground); + + Rect columnArea = this.EntryScrollView.ViewRect; + + if (!this.EntryScrollView.IsBeyondVerticalBounds) + { + columnArea.height = this.EntryScrollView.Bounds.height; + } + + int lastIndex = this.GUITables.GetLastVisibleIndex(); + + this.EntryScrollView.BeginClip(offset: new Vector2(this.PinnedWidth, 0), ignoreScrollY: true); + { + this.DrawColumns(ref visibleItems, columnArea.AlignRight(columnArea.width), false, lastIndex); + } + this.EntryScrollView.EndClip(); + + int lastPinnedIndex = this.GUITables.GetLastVisiblePinnedIndex(); + + this.EntryScrollView.BeginClip(ignoreScrollX: true, ignoreScrollY: true); + { + this.DrawColumns(ref visibleItems, columnArea, true, lastPinnedIndex); + } + this.EntryScrollView.EndClip(); + + if (this.PinnedWidth > 0.0f && this.PinnedWidth + 20 <= this.EntryScrollView.Bounds.width) + { + Rect shadowRect = this.EntryScrollView.Bounds; + + shadowRect.x += this.PinnedWidth; + shadowRect.width = 24; + + GUI.DrawTexture(shadowRect, OdinLocalizationGUITextures.LeftToRightFade, ScaleMode.StretchToFill, true, 1.0f, new Color(0, 0, 0, 0.35f), 0, 0); + } + } + + private void DrawColumns(ref OdinGUIScrollView.VisibleItems visibleItems, Rect columnArea, bool pinned, int lastIndex) + { + for (var i = 0; i < this.GUITables.Count; i++) + { + OdinGUITable table = this.GUITables[i]; + + if (table.IsPinned != pinned) + { + continue; + } + + if (!this.GUITables.TablesWithinVisibleBounds.Contains(table)) + { + columnArea.TakeFromLeft(table.Width); + continue; + } + +#if USING_WIDTH_NON_PERCENT + Rect columnRect = columnArea.TakeFromLeft(table.Width); +#else + Rect columnRect = columnArea.TakeFromLeft(table.Width); +#endif + + Rect columnHeaderRect = columnRect.AlignTop(OdinLocalizationConstants.COLUMN_HEIGHT); + + bool isSelected = this.IsTableSelected(table); + + if (isSelected) + { + FancyColor.PushBlend(FancyColor.Gray.Lerp(OdinLocalizationGUI.Selected, 0.5f), FancyColor.BlendMode.Overlay); + EditorGUI.DrawRect(columnHeaderRect, OdinLocalizationGUI.ColumnBackground); + } + + Rect interactColumnRect = columnHeaderRect.Padding(4, 0); + + if (Event.current.IsMouseOver(interactColumnRect)) + { + EditorGUI.DrawRect(columnHeaderRect, new Color(1.0f, 1.0f, 1.0f, 0.035f)); + } + + Rect pinRect = columnHeaderRect.TakeFromRight(30).SubXMax(10).AlignMiddle(18); + SdfIconType pinIcon = table.IsPinned ? SdfIconType.PinAngleFill : SdfIconType.PinAngle; + + GUI.Label(pinRect, GUIHelper.TempContent(string.Empty, "Pin Table")); + + if (Event.current.IsMouseOver(pinRect)) + { + SdfIcons.DrawIcon(pinRect, pinIcon, Color.white); + } + else + { + SdfIcons.DrawIcon(pinRect, pinIcon); + } + + if (Event.current.OnMouseDown(pinRect, 0)) + { + table.IsPinned = !table.IsPinned; + + this.ClearFocus(); + } + + float columnTextWidth = SirenixGUIStyles.LabelCentered.CalcWidth(table.DisplayName); + + Rect minSortRect = columnHeaderRect.TakeFromLeft(30).AddXMin(10); + + Rect sortRect = columnHeaderRect.AlignCenter(20, 18); + + sortRect.x -= columnTextWidth * 0.5f + 12.0f; + + if (sortRect.x < minSortRect.x) + { + sortRect = minSortRect.AlignMiddle(18); + } + + sortRect = sortRect.AlignCenter(16, 16); + + if (EditorGUIUtility.isProSkin) + { + GUI.Label(columnHeaderRect, table.DisplayName, SirenixGUIStyles.LabelCentered); + } + else + { + var t = SirenixGUIStyles.LabelCentered.normal.textColor; + SirenixGUIStyles.LabelCentered.normal.textColor = new Color(0, 0, 0, 0.7f); + GUI.Label(columnHeaderRect, table.DisplayName, SirenixGUIStyles.LabelCentered); + SirenixGUIStyles.LabelCentered.normal.textColor = t; + } + + SdfIconType sortIcon; + + if (this.sortedTable == table) + { + switch (this.SharedEntries.CurrentSortOrderState) + { + case OdinSharedEntryCollection.SortOrderState.Unsorted: + sortIcon = SdfIconType.ArrowDownUp; + break; + + case OdinSharedEntryCollection.SortOrderState.Ascending: + sortIcon = SdfIconType.ArrowDown; + break; + + case OdinSharedEntryCollection.SortOrderState.Descending: + sortIcon = SdfIconType.ArrowUp; + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + else + { + sortIcon = SdfIconType.ArrowDownUp; + } + + if (Event.current.IsMouseOver(sortRect)) + { + SdfIcons.DrawIcon(sortRect, sortIcon, Color.white); + } + else + { + SdfIcons.DrawIcon(sortRect, sortIcon); + } + + GUI.Label(sortRect, GUIHelper.TempContent(string.Empty, "Sort Table")); + + if (Event.current.OnMouseDown(sortRect, 0)) + { + bool wasSorted = this.SharedEntries.IsSorted && this.sortedTable != table; + + if (this.sortedTable == table || this.SharedEntries.CurrentSortOrderState == OdinSharedEntryCollection.SortOrderState.Unsorted) + { + this.SharedEntries.GotoNextSortOrderState(); + } + + switch (table.Type) + { + case OdinGUITable.GUITableType.Default: + switch (table.Asset) + { + case AssetTable assetTable: + this.SharedEntries.SortByAssetTable(this.Collection as AssetTableCollection, assetTable, wasSorted); + break; + + case StringTable stringTable: + this.SharedEntries.SortByStringTable(stringTable, wasSorted); + break; + } + + break; + + case OdinGUITable.GUITableType.Key: + this.SharedEntries.SortByKeys(wasSorted); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + this.sortedTable = table; + + this.ClearFocus(); + + this.HasGUIChanged = true; + } + + if (Event.current.OnMouseDown(interactColumnRect, 0)) + { + this.SelectTable(table); + } + + if (isSelected) + { + FancyColor.PopBlend(); + } + +#if !USING_WIDTH_NON_PERCENT + if (i == lastIndex) + { + continue; + } +#endif + + this.DrawSeparator(ref visibleItems, columnRect, table, i, lastIndex); + } + } + + private bool hasSeparatorChanged = false; + private bool adjustViewForSeparatorChange = false; + private float lastViewHeight; + + private void DrawSeparator(ref OdinGUIScrollView.VisibleItems visibleItems, Rect columnRect, OdinGUITable table, int index, int lastIndex) + { + Rect separatorRect = columnRect.AlignRight(1); + + EditorGUI.DrawRect(separatorRect, OdinLocalizationGUI.RowBorder); + + Rect separatorMouseRect = separatorRect.Expand(1, 0); + + switch (Event.current.type) + { + case EventType.MouseDown: + if (Event.current.button == 0 && Event.current.IsMouseOver(separatorMouseRect)) + { + //this.isDraggingNonHandle = true; + this.ClearFocus(); + } + + break; + + case EventType.MouseUp: + //if (this.isDraggingNonHandle) + //{ + // NOTE: we only adjust the ones we can see while we drag separators, to avoid unnecessary computations. + if (this.hasSeparatorChanged) + { + this.MeasureAllEntries(); + this.hasSeparatorChanged = false; + + this.adjustViewForSeparatorChange = true; + } + //} + + //this.isDraggingNonHandle = false; + break; + } + + Vector2 slideAmount = table.HandleSlider(separatorMouseRect); + + if (slideAmount.x == 0.0f) + { + return; + } + + if (!this.hasSeparatorChanged) + { + this.lastViewHeight = this.EntryScrollView.ViewRect.height; + } + + + this.hasSeparatorChanged = true; + +#if USING_WIDTH_NON_PERCENT + this.AppendWidth(slideAmount.x, index, lastIndex); +#else + float newWidth = table.Width + slideAmount.x; + + OdinGUITable nextTable = this.GUITables.GetNextVisible(index); + + float nextNewWidth = nextTable.Width - slideAmount.x; + + if (nextNewWidth < OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + float diff = OdinLocalizationConstants.MIN_COLUMN_WIDTH - nextNewWidth; + + newWidth -= diff; + + nextNewWidth += diff; + } + + if (newWidth < OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + float diff = OdinLocalizationConstants.MIN_COLUMN_WIDTH - newWidth; + + newWidth += diff; + + nextNewWidth -= diff; + } + + table.WidthPercentage *= newWidth / table.Width; + + nextTable.WidthPercentage *= nextNewWidth / nextTable.Width; +#endif + this.MeasureVisibleEntries(ref visibleItems); + } + + private void AppendWidth(float change, int index, int lastIndex) + { + OdinGUITable table = this.GUITables[index]; + + table.Width += change; + + if (change < 0.0f && table.Width <= OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + int previousIndex = index - 1; + + while (previousIndex > -1) + { + OdinGUITable previousTable = this.GUITables[previousIndex]; + + if (previousTable.IsPinned != table.IsPinned) + { + break; + } + + previousTable.Width += change; + + if (previousTable.Width <= OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + previousIndex--; + continue; + } + + break; + } + + if (previousIndex == -1) + { + previousIndex = 0; + } + + if (index != lastIndex && this.GUITables[previousIndex].Width > OdinLocalizationConstants.MIN_COLUMN_WIDTH) + { + this.GUITables[index + 1].Width -= change; + } + } + else if (index != lastIndex) + { + this.GUITables[index + 1].Width -= change; + } + } + + private void DrawDragHandles(Rect position, ref OdinGUIScrollView.VisibleItems visibleItems) + { + if (this.EntryScrollView.IsBeyondHorizontalBounds) + { + OdinGUIScrollView.ScrollBackground(position.AlignBottom(OdinGUIScrollView.SCROLL_BAR_SIZE), false); + } + + Rect clipRect = this.EntryScrollView.GetClipRect(); + + clipRect.x -= position.width; + clipRect.width = position.width; + + this.EntryScrollView.BeginClip(clipRect, offset: new Vector2(0, OdinLocalizationConstants.COLUMN_HEIGHT), ignoreScrollX: true); + { + if (this.SharedEntries.IsSorted || this.SharedEntries.IsSearching) //(this.isDraggingNonHandle) + { + for (var i = 0; i < visibleItems.Length; i++) + { + Rect dragHandleRect = visibleItems.GetRect(i); + + dragHandleRect.width = OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + + dragHandleRect.x += 2; + dragHandleRect.width -= 4; + + if (EditorGUIUtility.isProSkin) + { + SdfIcons.DrawIcon(dragHandleRect.AlignMiddle(16), SdfIconType.GripVertical, new Color(0.35f, 0.35f, 0.35f, 1.0f)); + } + else + { + SdfIcons.DrawIcon(dragHandleRect.AlignMiddle(16), SdfIconType.GripVertical, new FancyColor(0.66f)); + } + } + } + else + { + bool isDraggingAnything = this.IsDraggingAnything(); + + for (var i = 0; i < visibleItems.Length; i++) + { + Rect dragHandleRect = visibleItems.GetRect(i); + + dragHandleRect.width = OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + + bool isMouseOver = Event.current.IsMouseOver(dragHandleRect); + + if (!isDraggingAnything) + { + var dragData = new DragInfo {Index = visibleItems.Offset + i}; + DragAndDropUtilities.DragZone(dragHandleRect, dragData, false, false); + } + + dragHandleRect.x += 2; + dragHandleRect.width -= 4; + + if (EditorGUIUtility.isProSkin) + { + SdfIcons.DrawIcon(dragHandleRect.AlignMiddle(16), SdfIconType.GripVertical, new Color(1, 1, 1, isMouseOver ? 0.8f : 0.6f)); + } + else + { + SdfIcons.DrawIcon(dragHandleRect.AlignMiddle(16), SdfIconType.GripVertical, new Color(0, 0, 0, isMouseOver ? 0.6f : 0.4f)); + } + } + } + } + this.EntryScrollView.EndClip(); + + EditorGUI.DrawRect(position.TakeFromTop(OdinLocalizationConstants.COLUMN_HEIGHT), OdinLocalizationGUI.ColumnBackground); + } + + // NOTE: for now we pass by index, since you can't drag stuff around when you're searching or sorting + private void HandleDropZone(Rect position, int indexTo) + { + position.x += OdinLocalizationConstants.DRAG_HANDLE_WIDTH; + + float halfHeight = position.height * 0.5f; + + Rect topDropRect = position.AlignTop(halfHeight); + Rect bottomDropRect = position.AlignBottom(halfHeight); + + int topId = this.DragDropIdHint + indexTo; + + DragInfo topValue = DragAndDropUtilities.DropZone(topDropRect, DragInfo.None, this.DragDropIdHint + indexTo); + + int bottomId = this.DragDropIdHint + indexTo + this.SharedEntries.Length; + + DragInfo bottomValue = DragAndDropUtilities.DropZone(bottomDropRect, DragInfo.None, bottomId); + + if (DragAndDropUtilities.IsDragging) + { + if (DragAndDropUtilities.HoveringAcceptedDropZone == topId) + { + if (EditorGUIUtility.isProSkin) + { + GUI.DrawTexture(topDropRect.AlignTop(40.0f).SubXMin(OdinLocalizationConstants.DRAG_HANDLE_WIDTH), + OdinLocalizationGUITextures.TopToBottomFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0.16f, 0.7f, 1f, 0.25f), + Vector4.zero, + Vector4.zero); + } + else + { + GUI.DrawTexture(topDropRect.AlignTop(40.0f).SubXMin(OdinLocalizationConstants.DRAG_HANDLE_WIDTH), + OdinLocalizationGUITextures.TopToBottomFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0.8f, 0.8f, 1, 0.7f), + Vector4.zero, + Vector4.zero); + } + //EditorGUI.DrawRect(topDropRect.AlignTop(1), new Color(0, 1, 1, 0.5f)); + } + + if (DragAndDropUtilities.HoveringAcceptedDropZone == bottomId) + { + if (EditorGUIUtility.isProSkin) + { + GUI.DrawTexture(bottomDropRect.AlignBottom(40.0f).SubXMin(OdinLocalizationConstants.DRAG_HANDLE_WIDTH), + OdinLocalizationGUITextures.BottomToTopFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0.16f, 0.7f, 1f, 0.25f), + Vector4.zero, + Vector4.zero); + } + else + { + GUI.DrawTexture(bottomDropRect.AlignBottom(40.0f).SubXMin(OdinLocalizationConstants.DRAG_HANDLE_WIDTH), + OdinLocalizationGUITextures.BottomToTopFade, + ScaleMode.StretchToFill, + true, + 1.0f, + new Color(0.8f, 0.8f, 1, 0.7f), + Vector4.zero, + Vector4.zero); + } + //EditorGUI.DrawRect(bottomDropRect.AlignBottom(1), new Color(0, 1, 1, 0.5f)); + } + } + + if (!topValue.IsNone) + { + this.SharedEntries.MoveEntry(topValue.Index, indexTo); + + this.HasGUIChanged = true; + + return; + } + + if (!bottomValue.IsNone) + { + this.SharedEntries.MoveEntry(bottomValue.Index, indexTo + 1); + + this.HasGUIChanged = true; + } + } + + protected void MoveScrollPositionToTable(OdinGUITable table) + { + var x = 0.0f; + +#if USING_WIDTH_NON_PERCENT + for (var i = 0; i < this.GUITables.Count; i++) + { + if (this.GUITables[i] == table) + { + x += this.GUITables[i].Width * 0.5f; + break; + } + + if (!this.GUITables[i].IsVisible || this.GUITables[i].IsPinned) + { + continue; + } + + x += this.GUITables[i].Width; + } +#else + for (var i = 0; i < this.GUITables.Count; i++) + { + if (this.GUITables[i] == table) + { + x += this.GUITables[i].Width * 0.5f; + break; + } + + if (!this.GUITables[i].IsVisible || this.GUITables[i].IsPinned) + { + continue; + } + + x += this.GUITables[i].Width; + } +#endif + + x -= this.EntryScrollView.Bounds.width * 0.5f; + + x += this.PinnedWidth * 0.5f; + + this.EntryScrollView.ScrollTo(1.0f / 0.35f, xPosition: x, easing: Easing.OutQuad); + } + + private float rightMenuTopPanelHeight; + private Rect topPanelRect = Rect.zero; + private Rect bottomPanelRect = Rect.zero; + + private void DrawRightMenu(Rect position) + { + EditorGUI.DrawRect(position, OdinLocalizationGUI.WindowBackground); + + var topPanelMaxHeight = position.height - 32; + this.topPanelRect = position.TakeFromTop(this.WindowState.RightMenuTopPanelHeight); + var topSlideRect = this.topPanelRect.TakeFromBottom(14); + this.bottomPanelRect = position; + + this.WindowState.RightMenuTopPanelHeight += this.HorizontalSlideRect(topSlideRect); + // 183 is enough height to show exactly 3 collapsed entries. + this.WindowState.RightMenuTopPanelHeight = Mathf.Clamp(this.WindowState.RightMenuTopPanelHeight, 183, topPanelMaxHeight); + + EditorGUI.DrawRect(this.topPanelRect, OdinLocalizationGUI.Panel); + EditorGUI.DrawRect(this.bottomPanelRect, OdinLocalizationGUI.Panel); + + + EditorGUI.DrawRect(this.topPanelRect.AlignTop(32), OdinLocalizationGUI.TabsBackground); + EditorGUI.DrawRect(this.bottomPanelRect.AlignTop(32), OdinLocalizationGUI.TabsBackground); + + this.WindowState.CurrentTopTab = OdinLocalizationGUI.Tabs(this.topPanelRect.TakeFromTop(32), this.WindowState.CurrentTopTab, 115); + + this.WindowState.CurrentBottomTab = OdinLocalizationGUI.Tabs(this.bottomPanelRect.TakeFromTop(32), this.WindowState.CurrentBottomTab, 115); + + switch (this.WindowState.CurrentTopTab) + { + case OdinLocalizationEditorWindow.RightMenuTopTabs.Metadata: + this.DrawTopTabMetadata(this.topPanelRect); + break; + + case OdinLocalizationEditorWindow.RightMenuTopTabs.Settings: + this.DrawTopTabSettings(this.topPanelRect); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + switch (this.WindowState.CurrentBottomTab) + { + case OdinLocalizationEditorWindow.RightMenuBottomTabs.Locale: + this.DrawBottomTabLocale(this.bottomPanelRect); + break; + +#if false + case OdinLocalizationEditorWindow.RightMenuBottomTabs.Template: + this.DrawBottomTabTemplate(this.bottomPanelRect); + break; +#endif + + case OdinLocalizationEditorWindow.RightMenuBottomTabs.Settings: + this.DrawBottomTabSettings(this.bottomPanelRect); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + if (Event.current.type == EventType.MouseUp && Event.current.button == 0) + { + this.dragging = false; + GUIHelper.RequestRepaint(); + } + } + + private string metadataSearchTerm = string.Empty; + private SearchField metadataSearchField = new SearchField(); + + public InspectorProperty[] GetMetadataProperties() + { + InspectorProperty metadataCollection = + this.WindowState?.MetadataTree?.RootProperty?.Children[ + OdinLocalizationReflectionValues.TABLE_ENTRY_DATA__METADATA__PATH]; + + InspectorProperty items = + metadataCollection?.Children[OdinLocalizationReflectionValues.METADATA_COLLECTION__ITEMS__PATH]; + + return items?.Children.OrderBy(c => c.ValueEntry.TypeOfValue.Name).ToArray(); + } + + private LocalizationMetadata localizationMetadata; + + private void DrawTopTabMetadata(Rect rect) + { + if (Event.current.OnMouseDown(rect, 0, false)) + { + GUIHelper.RemoveFocusControl(); + } + + if (this.SelectionType == OdinTableSelectionType.None) + { + return; + } + + if (this.localizationMetadata == null) + { + this.localizationMetadata = new LocalizationMetadata(this.Collection, this.WindowState); + } + + switch (this.SelectionType) + { + case OdinTableSelectionType.None: + break; + case OdinTableSelectionType.SharedEntry: + this.localizationMetadata.Target = this.CurrentSelectedSharedEntry; + break; + case OdinTableSelectionType.SharedTable: + this.localizationMetadata.Target = this.Collection; + break; + case OdinTableSelectionType.Table: + this.localizationMetadata.Target = this.CurrentSelectedTable.Asset; + break; + case OdinTableSelectionType.TableEntry: + this.localizationMetadata.Target = this.CurrentSelectedEntry; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + this.localizationMetadata.Draw(rect); + } + + private void DrawTopTabSettings(Rect position) + { + position = position.Padding(4); + + GUILayout.BeginArea(position); + { + bool value; + + switch (this.SelectionType) + { + case OdinTableSelectionType.Table: + EditorGUI.BeginChangeCheck(); + + value = GUILayout.Toggle(LocalizationEditorSettings.GetPreloadTableFlag(this.CurrentSelectedTable.Asset), "Preload Table"); + + if (EditorGUI.EndChangeCheck()) + { + LocalizationEditorSettings.SetPreloadTableFlag(this.CurrentSelectedTable.Asset, value, true); + } + + break; + + case OdinTableSelectionType.TableEntry: + if (this.CurrentSelectedEntry is StringTableEntry stringTableEntry) + { + EditorGUI.BeginChangeCheck(); + + value = GUILayout.Toggle(stringTableEntry.IsSmart, "Smart"); + + if (EditorGUI.EndChangeCheck()) + { + stringTableEntry.IsSmart = value; + EditorUtility.SetDirty(stringTableEntry.Table); + } + + break; + } + + goto default; + + default: + GUILayout.Label("No item with settings selected.", SirenixGUIStyles.LabelCentered); + break; + } + } + GUILayout.EndArea(); + } + + private Vector2 bottomTabLocaleScrollPosition = Vector2.zero; + + private List toggles; + private static FancyColor ThumbColorGrayscale = FancyColor.White; + private static FancyColor BackgroundColorGrayscale = FancyColor.Gray; + private static FancyColor BorderColorGrayscale = new FancyColor(0.91f, 0.91f, 0.91f); + private static readonly FancyColor EnabledColor = new FancyColor(EditorGUIUtility.isProSkin ? 0.66f : 0.86f); + private static readonly FancyColor DisabledColor = new FancyColor(EditorGUIUtility.isProSkin ? 0.46f : 0.66f); + private bool dragging; + private Toggle lastChangedToggle; + private bool newValue; + private Vector2 localeTabScrollPosition; + private void DrawBottomTabLocale(Rect position) + { + position = position.Padding(4); + + GUILayout.BeginArea(position); + { + ReadOnlyCollection projectLocales = LocalizationEditorSettings.GetLocales(); + + if (this.toggles == null) + { + this.toggles = new List + { + new Toggle + { + Label = "Key", + Toggled = this.KeyTable.IsVisible, + } + }; + this.toggles.AddRange(projectLocales.Select(locale => + { + this.LocaleTableMap.TryGetValue(locale, out var table); + + return new Toggle + { + Label = locale.LocaleName, + Toggled = table?.IsVisible ?? false, + }; + })); + } + + bool hasAllLocales = projectLocales.Count == this.LocaleTableMap.Count; + + if (!hasAllLocales) + { + if (SirenixEditorGUI.Button("Add Missing Locales", ButtonSizes.Large)) + { + for (var i = 0; i < projectLocales.Count; i++) + { + Locale locale = projectLocales[i]; + + if (this.LocaleTableMap.ContainsKey(locale)) + { + continue; + } + + LocalizationTable table = this.Collection.GetTable(locale.Identifier); + + if (table != null) + { + this.Collection.AddTable(table, true); + } + else + { + this.Collection.AddNewTable(locale.Identifier); + } + } + } + + GUILayout.Space(4); + SirenixEditorGUI.HorizontalLineSeparator(); + GUILayout.Space(4); + } + + const float LINE_HEIGHT = 20.0f; + const float LOCALE_SPACING = 2.0f; + + this.localeTabScrollPosition = GUILayout.BeginScrollView(this.localeTabScrollPosition /*, GUILayoutOptions.MaxHeight(MAX_HEIGHT)*/); + { + var keyRect = GUILayoutUtility.GetRect(0, LINE_HEIGHT, GUILayoutOptions.ExpandWidth()); + this.KeyTable.IsVisible = this.DrawLocaleToggle(ref keyRect, this.toggles[0], this.KeyTable); + + if (this.EntryScrollView.IsBeyondHorizontalBounds && this.KeyTable.IsVisible && + !this.KeyTable.IsPinned) + { + if (Event.current.OnMouseDown(keyRect, 0)) + { + this.MoveScrollPositionToTable(this.KeyTable); + } + } + + var lastLocaleIndex = projectLocales.Count - 1; + + for (var i = 0; i < projectLocales.Count; i++) + { + var locale = projectLocales[i]; + var toggle = this.toggles[i + 1]; + + var totalRect = GUILayoutUtility.GetRect( + width: 0, + height: LINE_HEIGHT, + options: GUILayoutOptions.ExpandWidth().ExpandHeight(false)); + + if (locale != null && !this.LocaleTableMap.ContainsKey(locale)) + { + GUIHelper.PushGUIEnabled(false); + { + this.DrawLocaleToggle(ref totalRect, toggle, null); + } + GUIHelper.PopGUIEnabled(); + + LocalizationTable looseTable = null; + + foreach (LocalizationTable localizationTable in this.LooseTables) + { + if (localizationTable.LocaleIdentifier == locale.Identifier) + { + looseTable = localizationTable; + break; + } + } + + var buttonRect = totalRect.TakeFromRight(80); + + if (looseTable != null) + { + if (GUI.Button(buttonRect, "Add")) + { + this.Collection.AddTable(looseTable, createUndo: false); + Undo.ClearUndo(looseTable); + Undo.ClearUndo(this.Collection); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + else + { + if (GUI.Button(buttonRect, "Create")) + { + this.Collection.AddNewTable(locale.Identifier); + Undo.ClearUndo(this.Collection); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + + if (i != lastLocaleIndex) + { + GUILayout.Space(LOCALE_SPACING); + } + + continue; + } + + + OdinGUITable table = locale == null ? this.KeyTable : this.LocaleTableMap[locale]; + + table.IsVisible = this.DrawLocaleToggle(ref totalRect, toggle, table); + + if (table.Type != OdinGUITable.GUITableType.Key) + { + Rect removeLocaleRect = totalRect.TakeFromRight(80); + + if (GUI.Button(removeLocaleRect, "Remove")) + { + if (EditorUtility.DisplayDialog("Odin Localization Editor", + $"Are you sure you want to remove the locale '{locale.Identifier.CultureInfo.EnglishName}' from '{this.Collection.name}'?\n" + + "This can have side effects that can't be undone.", + "Yes", + "No")) + { + this.Collection.RemoveTable(table.Asset, createUndo: false); + Undo.ClearUndo(table.Asset); + Undo.ClearUndo(this.Collection); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + } + + if (this.EntryScrollView.IsBeyondHorizontalBounds && table.IsVisible && !table.IsPinned) + { + if (Event.current.OnMouseDown(totalRect, 0)) + { + this.MoveScrollPositionToTable(table); + } + } + + if (i != lastLocaleIndex) + { + GUILayout.Space(LOCALE_SPACING); + } + } + } + GUILayout.EndScrollView(); + + GUILayout.Space(4); + SirenixEditorGUI.HorizontalLineSeparator(); + GUILayout.Space(4); + + if (SirenixEditorGUI.Button("Manage Locales", ButtonSizes.Medium)) + { + try + { + TwoWaySerializationBinder.Default.BindToType("UnityEditor.Localization.UI.LocaleGeneratorWindow, Unity.Localization.Editor")? + .GetMethod("ShowWindow", BindingFlags.Static | BindingFlags.Public)?.Invoke(null, null); + } + catch (NullReferenceException nullReferenceException) + { + Debug.LogError($"[Odin]: Failed to find LocaleGeneratorWindow.ShowWindow.\n{nullReferenceException.Message}"); + } + } + } + GUILayout.EndArea(); + } + + private bool DrawLocaleToggle(ref Rect rect, Toggle toggle, OdinGUITable table) + { + const int toggleWidth = 35; + + var toggleRect = rect.TakeFromLeft(toggleWidth).SubXMax(4).VerticalPadding(2).AddY(1); + var color = GUI.enabled ? toggle.CurrentColor : new Color(0.35f, 0.35f, 0.35f); + toggle.Enabled = GUI.enabled; + + // Draw toggle background + GUI.DrawTexture( + position: toggleRect, + image: Texture2D.whiteTexture, + scaleMode: ScaleMode.StretchToFill, + alphaBlend: false, + imageAspect: 1f, + color: BackgroundColorGrayscale.Blend(color, FancyColor.BlendMode.Multiply), + borderWidth: 0, + borderRadius: float.MaxValue); + + // Draw toggle thumb + GUI.DrawTexture( + position: toggle.CurrentThumbRect, + image: Texture2D.whiteTexture, + scaleMode: ScaleMode.StretchToFill, + alphaBlend: false, + imageAspect: 1f, + color: ThumbColorGrayscale.Blend(color, FancyColor.BlendMode.Multiply), + borderWidth: 0, + borderRadius: float.MaxValue); + + AnimateThumb(toggleRect, toggle); + + GUI.Label(rect, toggle.Label, + GUI.enabled && Event.current.IsMouseOver(rect) ? SirenixGUIStyles.WhiteLabel : SirenixGUIStyles.Label); + + if (GUI.enabled && Event.current.OnMouseDown(toggleRect, 0)) + { + this.dragging = true; + this.lastChangedToggle = toggle; + this.newValue = !toggle.Toggled; + toggle.Toggled = this.newValue; + + switch (Event.current.modifiers) + { + case EventModifiers.Control: + for (var i = 0; i < this.toggles.Count; i++) + { + if (!this.toggles[i].Enabled) continue; + this.toggles[i].Toggled = this.newValue; + } + + break; + case EventModifiers.Shift: + for (var i = 0; i < this.toggles.Count; i++) + { + if (!this.toggles[i].Enabled) continue; + this.toggles[i].Toggled = table.IsVisible; + } + + break; + case EventModifiers.Alt: + for (var i = 0; i < this.toggles.Count; i++) + { + if (!this.toggles[i].Enabled) continue; + this.toggles[i].Toggled = this.toggles[i] == toggle; + } + + break; + } + } + + if (GUI.enabled && this.dragging) + { + var mp = Event.current.mousePosition; + if (toggle != this.lastChangedToggle && toggleRect.y < mp.y && toggleRect.yMax > mp.y) + { + this.lastChangedToggle = toggle; + toggle.Toggled = this.newValue; + } + + GUIHelper.RequestRepaint(); + } + + if (Event.current.type == EventType.MouseUp && Event.current.button == 0) + { + this.dragging = false; + GUIHelper.RequestRepaint(); + } + + return toggle.Toggled; + } + + private static void AnimateThumb(Rect toggleRect, Toggle toggle) + { + const float thumbAnimationDurationInSeconds = 0.07f; + const float thumbAnimationSpeed = 1f / (thumbAnimationDurationInSeconds / 2f); // divided by 2 since the animation is split into 2 phases. + const float colorAnimationDurationInSeconds = 0.6f; + const float colorAnimationSpeed = 1f / colorAnimationDurationInSeconds; + + var targetRect = toggle.Toggled + ? toggleRect.AlignRight(toggleRect.height).AlignCenterY(toggleRect.height).Padding(2) + : toggleRect.AlignLeft(toggleRect.height).AlignCenterY(toggleRect.height).Padding(2); + + var targetColor = toggle.Toggled ? EnabledColor : DisabledColor; + + if (toggle.CurrentColor != (Color)targetColor) + { + if (toggle.T1.IsDone) + { + toggle.T1.Reset(0f); + } + + toggle.T1.Move(colorAnimationSpeed, Easing.InOutExpo); + toggle.CurrentColor = Color.Lerp(toggle.StartColor, targetColor, toggle.T1.GetValue()); + } + + if (Event.current.type == EventType.Repaint && toggle.CurrentThumbRect == Rect.zero) + { + toggle.CurrentThumbRect = targetRect; + toggle.CurrentColor = targetColor; + GUIHelper.RequestRepaint(); + } + + if (Event.current.type == EventType.Repaint && toggle.CurrentThumbRect != targetRect) + { + if (toggle.Toggled) + { + if (toggle.CurrentThumbRect.xMax < targetRect.xMax) + { + if (toggle.T2.IsDone) + { + toggle.T2.Reset(0f); + } + + toggle.T2.Move(thumbAnimationSpeed); + var xMax = Mathf.Lerp(toggle.StartXMax, targetRect.xMax, toggle.T2.GetValue()); + toggle.CurrentThumbRect.xMax = xMax; + } + else if (toggle.CurrentThumbRect.xMin < targetRect.xMin) + { + if (toggle.T2.IsDone) + { + toggle.T2.Reset(0f); + } + + toggle.T2.Move(thumbAnimationSpeed); + var xMin = Mathf.Lerp(toggle.StartXMin, targetRect.xMin, toggle.T2.GetValue()); + toggle.CurrentThumbRect.xMin = xMin; + } + } + else + { + if (toggle.CurrentThumbRect.xMin > targetRect.xMin) + { + if (toggle.T2.IsDone) + { + toggle.T2.Reset(0f); + } + + toggle.T2.Move(thumbAnimationSpeed); + var xMin = Mathf.Lerp(toggle.StartXMin, targetRect.xMin, toggle.T2.GetValue()); + toggle.CurrentThumbRect.xMin = xMin; + } + else if (toggle.CurrentThumbRect.xMax > targetRect.xMax) + { + if (toggle.T2.IsDone) + { + toggle.T2.Reset(0f); + } + + toggle.T2.Move(thumbAnimationSpeed); + var xMax = Mathf.Lerp(toggle.StartXMax, targetRect.xMax, toggle.T2.GetValue()); + toggle.CurrentThumbRect.xMax = xMax; + } + } + + GUIHelper.RequestRepaint(); + } + } + + private void LocaleToggle(Rect position, Locale locale) + { + if (locale != null && !this.LocaleTableMap.ContainsKey(locale)) + { + Rect createLocaleRect = position.TakeFromRight(80); + + GUIHelper.PushGUIEnabled(false); + { + GUI.Toggle(position.TakeFromLeft(GUI.skin.toggle.padding.left), false, GUIContent.none); + + GUI.Label(position, locale.LocaleName, SirenixGUIStyles.Label); + } + GUIHelper.PopGUIEnabled(); + + LocalizationTable looseTable = null; + + foreach (LocalizationTable localizationTable in this.LooseTables) + { + if (localizationTable.LocaleIdentifier == locale.Identifier) + { + looseTable = localizationTable; + break; + } + } + + if (looseTable != null) + { + if (GUI.Button(createLocaleRect, "Add")) + { + this.Collection.AddTable(looseTable, createUndo: true); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + else + { + if (GUI.Button(createLocaleRect, "Create")) + { + this.Collection.AddNewTable(locale.Identifier); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + + return; + } + + OdinGUITable table = locale == null ? this.KeyTable : this.LocaleTableMap[locale]; + + EditorGUI.BeginChangeCheck(); + { + table.IsVisible = GUI.Toggle(position.TakeFromLeft(GUI.skin.toggle.padding.left), table.IsVisible, GUIContent.none); + } + if (EditorGUI.EndChangeCheck()) + { + switch (Event.current.modifiers) + { + case EventModifiers.Shift: + for (var i = 0; i < this.GUITables.Count; i++) + { + this.GUITables[i].IsVisible = table.IsVisible; + } + + break; + + case EventModifiers.Alt: + for (var i = 0; i < this.GUITables.Count; i++) + { + this.GUITables[i].IsVisible = this.GUITables[i] == table; + } + + break; + } + } + + if (table.Type != OdinGUITable.GUITableType.Key) + { + Rect removeLocaleRect = position.TakeFromRight(80); + + if (GUI.Button(removeLocaleRect, "Remove")) + { + this.Collection.RemoveTable(table.Asset, createUndo: true); + FancyColor.PopBlend(); + GUIHelper.ExitGUI(false); + } + } + + if (this.EntryScrollView.IsBeyondHorizontalBounds && table.IsVisible && !table.IsPinned) + { + bool isMouseOver = Event.current.IsMouseOver(position); + + GUI.Label(position, table.DisplayName, isMouseOver ? SirenixGUIStyles.WhiteLabel : SirenixGUIStyles.Label); + + if (Event.current.OnMouseDown(position, 0)) + { + this.MoveScrollPositionToTable(table); + } + } + else + { + GUI.Label(position, table.DisplayName, SirenixGUIStyles.Label); + } + } + + protected bool IsDraggingAnything() + { + if (this.EntryScrollView.IsDraggingMouse || + this.EntryScrollView.IsDraggingHorizontalScrollBar || + this.EntryScrollView.IsDraggingVerticalScrollBar) + { + return true; + } + + for (var i = 0; i < this.GUITables.Count; i++) + { + if (this.GUITables[i].IsDraggingSlider) + { + return true; + } + } + + return false; + } + +#if false + private void DrawBottomTabTemplate(Rect position) + { + if (!this.Collection.SharedData.Metadata.HasMetadata()) + { + this.Collection.SharedData.Metadata.AddMetadata(new OdinTemplateMetadata()); + EditorUtility.SetDirty(this.Collection.SharedData); + } + + var templateMetadata = this.Collection.SharedData.Metadata.GetMetadata(); + + GUILayout.BeginArea(position); + { + GUILayout.BeginScrollView(Vector2.zero); + + int removedItemIndex = -1; + + for (var i = 0; i < templateMetadata.MetadataExpected.Count; i++) + { + if (OdinLocalizationStyles.Metadata(templateMetadata.MetadataExpected[i], i == 0)) + { + removedItemIndex = i; + } + } + + GUILayout.EndScrollView(); + + if (removedItemIndex != -1) + { + templateMetadata.MetadataExpected.RemoveAt(removedItemIndex); + EditorUtility.SetDirty(this.Collection.SharedData); + } + + Rect addMetadataRect = GUILayoutUtility.GetRect(0, (int) ButtonSizes.Large); + + if (GUI.Button(addMetadataRect, "Add Metadata")) + { + this.ShowAddMetadataTemplateSelector(addMetadataRect, templateMetadata); + } + + GUILayoutUtility.GetRect(0, 5); + } + GUILayout.EndArea(); + } + + private void ShowAddMetadataTemplateSelector(Rect rect, OdinTemplateMetadata templateMetadata) + { + TypeSelector selector = this.MakeMetadataSelector(); + + selector.SelectionConfirmed += types => + { + foreach (Type type in types) + { + if (templateMetadata.MetadataExpected.Contains(type) && !OdinLocalizationMetadataRegistry.MetadataAllowsMultiple[type]) + { + continue; + } + + templateMetadata.MetadataExpected.Add(type); + + EditorUtility.SetDirty(this.Collection.SharedData); + } + }; + + selector.ShowInPopup(rect); + } + + private TypeSelector MakeMetadataSelector() + { + TypeSelector selector; + + switch (this.Collection) + { + case AssetTableCollection _: + selector = new TypeSelector(OdinLocalizationMetadataRegistry.AssetEntryMetadataTypes, excludeInheritors: true); + break; + + case StringTableCollection _: + selector = new TypeSelector(OdinLocalizationMetadataRegistry.StringEntryMetadataTypes, excludeInheritors: true); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + return selector; + } + + protected bool HasMetadataAmountOfType(IList metadata, Type metadataType, OdinTemplateMetadata templateMetadata) + { + int count = CountMetadataType(metadata, metadataType); + + var expectedCount = 0; + + for (var i = 0; i < templateMetadata.MetadataExpected.Count; i++) + { + if (templateMetadata.MetadataExpected[i] == metadataType) + { + expectedCount++; + } + } + + return count >= expectedCount; + } + + protected static int CountMetadataType(IList metadata, Type metadataType) + { + var result = 0; + + for (var i = 0; i < metadata.Count; i++) + { + if (metadata[i].GetType() == metadataType) + { + result++; + } + } + + return result; + } +#endif + + + private void DrawBottomTabSettings(Rect position) + { + position = position.Padding(6); + + GUILayout.BeginArea(position); + { + // Table Collection Name + { + Rect namePosition = EditorGUILayout.GetControlRect(); + + GUI.Label(namePosition.TakeFromLeft(130), "Collection Name"); + + EditorGUI.BeginChangeCheck(); + + string value = SirenixEditorFields.DelayedTextField(namePosition, this.Collection.SharedData.TableCollectionName); + + if (EditorGUI.EndChangeCheck()) + { + if (!string.IsNullOrEmpty(value) && OdinLocalizationEditorSettings.IsTableNameValid(this.Collection.GetType(), value)) + { + this.Collection.SetTableCollectionName(value, true); + this.MenuItem.Name = this.Collection.SharedData.TableCollectionName; + this.MenuItem.Select(); + } + } + } + + // Preload All Tables + { + EditorGUI.BeginChangeCheck(); + + bool value = GUILayout.Toggle(this.Collection.IsPreloadTableFlagSet(), "Preload All Tables"); + + if (EditorGUI.EndChangeCheck()) + { + this.Collection.SetPreloadTableFlag(value, true); + } + } + + GUILayout.Space(4); + SirenixEditorGUI.HorizontalLineSeparator(); + GUILayout.Space(4); + + if (SirenixEditorGUI.Button("Manage Collection", ButtonSizes.Large)) + { + GUIHelper.OpenInspectorWindow(this.Collection); + } + } + GUILayout.EndArea(); + } + + private float VerticalSlideRect(Rect rect, bool connect) + { + var offset = SirenixEditorGUI.SlideRect(rect, MouseCursor.SplitResizeLeftRight).x; + + var slideThumbColor = Event.current.IsMouseOver(rect) + ? EditorGUIUtility.isProSkin ? new Color(0.5f, 0.5f, 0.5f) : new Color(1f, 1f, 1f) + : this.WindowState.RightMenuWidth > 0 + ? EditorGUIUtility.isProSkin ? new Color(0.25f, 0.25f, 0.25f) : new Color(0.8f, 0.8f, 0.8f) + : EditorGUIUtility.isProSkin + ? new Color(0.4f, 0.4f, 0.4f) + : new Color(1f, 1f, 1f); + + EditorGUI.DrawRect(rect, Event.current.IsMouseOver(rect) + ? EditorGUIUtility.isProSkin ? new Color(0.26f, 0.26f, 0.26f) : new Color(0.7f, 0.7f, 0.7f) + : EditorGUIUtility.isProSkin + ? new Color(0.2f, 0.2f, 0.2f) + : new Color(0.6f, 0.6f, 0.6f)); + + var h2 = connect ? this.WindowState.RightMenuTopPanelHeight : rect.height / 2f - 40; + + EditorGUI.DrawRect(rect.AlignLeft(1), new Color(0, 0, 0, 0.4f)); + var left = new Rect(rect.center.x - 1, 0, 1, rect.height); + EditorGUI.DrawRect(left, slideThumbColor); + + if (!connect) + { + var right = new Rect(rect.center.x + 1, rect.y, 1, rect.height); + EditorGUI.DrawRect(right, slideThumbColor); + EditorGUI.DrawRect(rect.AlignRight(1), new Color(0, 0, 0, 0.4f)); + } + else if (this.WindowState.RightMenuWidth > 0) + { + var crossTop = new Rect(rect.AlignCenterX(1).AddX(2).x, this.WindowState.RightMenuTopPanelHeight - (14 / 2 + 1), 4, 1); + var crossBottom = crossTop.AddY(2); + var rightTop = new Rect(rect.center.x + 1, 0, 1, crossTop.y + 1); + var rightBottom = new Rect(rect.center.x + 1, crossBottom.y, 1, rect.height - crossBottom.y); + EditorGUI.DrawRect(crossTop, slideThumbColor); + EditorGUI.DrawRect(crossBottom, slideThumbColor); + EditorGUI.DrawRect(rightTop, slideThumbColor); + EditorGUI.DrawRect(rightBottom, slideThumbColor); + EditorGUI.DrawRect(rect.AlignRight(1).SetHeight(connect ? h2 - 13 : rect.height), new Color(0, 0, 0, 0.4f)); + EditorGUI.DrawRect(rect.AlignRight(1).AddY(connect ? h2 - 1 : 0), new Color(0, 0, 0, 0.4f)); + } + else + { + var right = new Rect(rect.center.x + 1, 0, 1, rect.height); + EditorGUI.DrawRect(right, slideThumbColor); + EditorGUI.DrawRect(rect.AlignRight(1), new Color(0, 0, 0, 0.4f)); + } + + return offset; + } + + private float HorizontalSlideRect(Rect rect) + { + var offset = SirenixEditorGUI.SlideRect(rect, MouseCursor.SplitResizeUpDown).y; + + var slideThumbColor = Event.current.IsMouseOver(rect) + ? EditorGUIUtility.isProSkin ? new Color(0.5f, 0.5f, 0.5f) : new Color(1f, 1f, 1f) + : this.WindowState.RightMenuWidth > 0 + ? EditorGUIUtility.isProSkin ? new Color(0.25f, 0.25f, 0.25f) : new Color(0.8f, 0.8f, 0.8f) + : EditorGUIUtility.isProSkin + ? new Color(0.4f, 0.4f, 0.4f) + : new Color(1f, 1f, 1f); + + EditorGUI.DrawRect(rect, Event.current.IsMouseOver(rect) + ? EditorGUIUtility.isProSkin ? new Color(0.26f, 0.26f, 0.26f) : new Color(0.7f, 0.7f, 0.7f) + : EditorGUIUtility.isProSkin + ? new Color(0.2f, 0.2f, 0.2f) + : new Color(0.6f, 0.6f, 0.6f)); + + var top = new Rect(rect.x, rect.center.y - 1, rect.width, 1); + var bottom = new Rect(rect.x, rect.center.y + 1, rect.width, 1); + + EditorGUI.DrawRect(top, slideThumbColor); + EditorGUI.DrawRect(bottom, slideThumbColor); + EditorGUI.DrawRect(rect.AlignTop(1), new Color(0, 0, 0, 0.4f)); + EditorGUI.DrawRect(rect.AlignBottom(1), new Color(0, 0, 0, 0.4f)); + + return offset; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs.meta new file mode 100644 index 000000000..dc9f6bdee --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTableCollectionEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8f34a530ab34e11b148c6c45d14fd12 +timeCreated: 1704797131 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs new file mode 100644 index 000000000..f7d091f80 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs @@ -0,0 +1,23 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Localization.Metadata; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ +#if false + [HideInInspector] // ReadOnly + [Metadata(AllowedTypes = MetadataType.SharedTableData, AllowMultiple = false)] + public class OdinTemplateMetadata : IMetadata + { + public Type TableAssetType; + public List MetadataExpected = new List(); + } +#endif +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs.meta new file mode 100644 index 000000000..1c71ccfd9 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/OdinTemplateMetadata.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 50bcb1c3eb1c42b3b6a84c57b1c240dd +timeCreated: 1707729097 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs new file mode 100644 index 000000000..ef3a34da3 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs @@ -0,0 +1,38 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using Sirenix.OdinInspector.Editor.Internal; +using UnityEngine; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class Toggle + { + public string Label; + public float StartXMin; + public float StartXMax; + public Color StartColor; + public Rect CurrentThumbRect; + public Color CurrentColor; + public bool Enabled; + public SirenixAnimationUtility.InterpolatedFloat T1 = new SirenixAnimationUtility.InterpolatedFloat {Destination = 1f}; + public SirenixAnimationUtility.InterpolatedFloat T2 = new SirenixAnimationUtility.InterpolatedFloat {Destination = 1f}; + + private bool _toggled; + + public bool Toggled + { + get => this._toggled; + set + { + this._toggled = value; + this.StartXMin = this.CurrentThumbRect.xMin; + this.StartXMax = this.CurrentThumbRect.xMax; + this.StartColor = this.CurrentColor; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs.meta new file mode 100644 index 000000000..352c7047b --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/GUI/Toggle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4e8615bf94265a4a96bf4c23380de7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal.meta new file mode 100644 index 000000000..52a89ad72 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7cf3a6e0f9c8495d843c313b4437232b +timeCreated: 1704797609 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs new file mode 100644 index 000000000..f31f9bba7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using Sirenix.Config; +using UnityEditor; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationAssetCache + { + private readonly struct AssetIdentifier + { + public readonly Type AssetType; + public readonly string Guid; + + public AssetIdentifier(Type assetType, string guid) + { + this.AssetType = assetType; + this.Guid = guid; + } + } + + private static readonly Dictionary Assets = new Dictionary(); + + public static UnityEngine.Object Get(string guid, Type assetType) + { + if (string.IsNullOrEmpty(guid)) + { + return null; + } + + var identifier = new AssetIdentifier(assetType, guid); + + if (Assets.TryGetValue(identifier, out UnityEngine.Object result)) + { + return result; + } + + string path = AssetDatabase.GUIDToAssetPath(guid); + + result = AssetDatabase.LoadAssetAtPath(path, assetType); + + Assets.Add(identifier, result); + + return result; + } + + public static UnityEngine.Object Get(SharedTableData.SharedTableEntry sharedEntry, AssetTable assetTable, Type assetType) + { + AssetTableEntry entry = assetTable.GetEntry(sharedEntry.Id); + + if (entry == null || entry.IsEmpty) + { + return null; + } + + return Get(entry.Guid, assetType); + } + + public static void Clear() => Assets.Clear(); + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs.meta new file mode 100644 index 000000000..d1fed8a05 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationAssetCache.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f5b97d1f7b884ac99cc8ebcdeb3363a7 +timeCreated: 1704809501 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs new file mode 100644 index 000000000..f3aef0612 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using UnityEditor; +using UnityEditor.AddressableAssets.Settings; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization.Settings; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationEditorSettings + { + public static LocalizationEditorSettings Instance => + (LocalizationEditorSettings) OdinLocalizationReflectionValues.LocalizationEditorSettings_Instance.GetValue(null); + + public static AddressableAssetSettings GetAddressableAssetSettings(bool create) + { + return OdinLocalizationReflectionValues.LocalizationEditorSettings_GetAddressableAssetSettingsFunc(create); + } + + public static bool IsTableNameValid(Type collectionType, string name, out string errorMessage) + { + errorMessage = (string) OdinLocalizationReflectionValues.LocalizationEditorSettings_IsTableNameValid.Invoke(Instance, + new object[] {collectionType, name}); + + return string.IsNullOrEmpty(errorMessage); + } + + public static bool IsTableNameValid(Type collectionType, string name) + { + return IsTableNameValid(collectionType, name, out string _); + } + + public static bool CreateDefaultLocalizationSettingsAsset() + { + if (LocalizationEditorSettings.ActiveLocalizationSettings != null) + { + return false; + } + + string localizationSettingsPath = EditorUtility.SaveFilePanelInProject("Create Localization Settings", + "Localization Settings", + "asset", + "Create the Localization Settings asset"); + + if (string.IsNullOrEmpty(localizationSettingsPath)) + { + return false; + } + + var settings = ScriptableObject.CreateInstance(); + settings.name = "Default Localization Settings"; + + + AssetDatabase.CreateAsset(settings, localizationSettingsPath); + AssetDatabase.SaveAssets(); + + LocalizationEditorSettings.ActiveLocalizationSettings = settings; + + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs.meta new file mode 100644 index 000000000..5f1e3a86c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEditorSettings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 645f3592e85448d7a963218911547f3c +timeCreated: 1706732179 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs new file mode 100644 index 000000000..f0e27ca45 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using UnityEditor.Localization; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationEvents + { + private static readonly Action RaiseTableEntryModifiedAction; + + private static readonly Action RaiseTableEntryAddedAction; + + private static readonly Action RaiseTableEntryRemovedAction; + + private static readonly Action RaiseAssetTableEntryAddedAction; + + private static readonly Action RaiseAssetTableEntryRemovedAction; + + static OdinLocalizationEvents() + { + RaiseTableEntryModifiedAction = OdinLocalizationReflectionValues.Create_RaiseTableEntryModified_Method_Delegate(LocalizationEditorSettings.EditorEvents); + RaiseTableEntryAddedAction = OdinLocalizationReflectionValues.Create_RaiseTableEntryAdded_Method_Delegate(LocalizationEditorSettings.EditorEvents); + RaiseTableEntryRemovedAction = OdinLocalizationReflectionValues.Create_RaiseTableEntryRemoved_Method_Delegate(LocalizationEditorSettings.EditorEvents); + RaiseAssetTableEntryAddedAction = + OdinLocalizationReflectionValues.Create_AssetTableEntryAdded_Method_Delegate(LocalizationEditorSettings.EditorEvents); + RaiseAssetTableEntryRemovedAction = + OdinLocalizationReflectionValues.Create_AssetTableEntryRemoved_Method_Delegate(LocalizationEditorSettings.EditorEvents); + } + + public static void RaiseTableEntryModified(SharedTableData.SharedTableEntry sharedEntry) => RaiseTableEntryModifiedAction(sharedEntry); + + public static void RaiseTableEntryAdded(LocalizationTableCollection collection, SharedTableData.SharedTableEntry sharedEntry) => + RaiseTableEntryAddedAction(collection, sharedEntry); + + public static void RaiseTableEntryRemoved(LocalizationTableCollection collection, SharedTableData.SharedTableEntry sharedEntry) => + RaiseTableEntryRemovedAction(collection, sharedEntry); + + public static void RaiseAssetTableEntryAdded(AssetTableCollection assetCollection, AssetTable table, AssetTableEntry entry) => + RaiseAssetTableEntryAddedAction(assetCollection, table, entry); + + public static void RaiseAssetTableEntryRemoved(AssetTableCollection assetCollection, AssetTable table, AssetTableEntry entry, string guid) => + RaiseAssetTableEntryRemovedAction(assetCollection, table, entry, guid); + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs.meta new file mode 100644 index 000000000..e7bebbb72 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationEvents.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a7cf7883289c4de29b6e2ae8a072c3bd +timeCreated: 1705050052 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs new file mode 100644 index 000000000..46b432666 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs @@ -0,0 +1,438 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.Reflection.Editor; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEngine; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + // TODO: update name + public static class OdinLocalizationGUI + { + public static GUIStyle RichLabelTextCenteredMultiLine + { + get + { + if (_richLabelTextCenteredMultiLine == null) + { + _richLabelTextCenteredMultiLine = new GUIStyle(SirenixGUIStyles.MultiLineCenteredLabel) + { + richText = true + }; + } + + return _richLabelTextCenteredMultiLine; + } + } + + public static GUIStyle CardTitleWhite + { + get + { + if (_cardTitleWhite == null) + { + _cardTitleWhite = new GUIStyle(SirenixGUIStyles.MultiLineWhiteLabel) + { + fontSize = 12, + fontStyle = FontStyle.Bold + }; + } + + return _cardTitleWhite; + } + } + + public static FancyColor Background => EditorGUIUtility.isProSkin ? Color.black : Color.white; + + // TODO: LIGHT MODE + public static FancyColor MenuBackground => EditorGUIUtility.isProSkin ? DarkMenuBackground : LightMenuBackground; + public static FancyColor WindowBackground => EditorGUIUtility.isProSkin ? DarkWindowBackground : LightWindowBackground; + public static FancyColor Panel => EditorGUIUtility.isProSkin ? DarkPanel : LightPanel; + public static FancyColor PanelGap => EditorGUIUtility.isProSkin ? DarkPanelGap : LightPanelGap; + + public static FancyColor Selected => EditorGUIUtility.isProSkin ? DarkSelected : LightSelected; + + public static FancyColor TabsBackground => EditorGUIUtility.isProSkin ? DarkTabsBackground : LightTabsBackground; + + public static FancyColor ColumnBackground => EditorGUIUtility.isProSkin ? DarkColumnBackground : LightColumnBackground; + + public static FancyColor RowEvenBackground => EditorGUIUtility.isProSkin ? DarkRowEvenBackground : LightRowEvenBackground; + public static FancyColor RowEvenBackground2 => EditorGUIUtility.isProSkin ? DarkRowEvenBackground2 : LightRowEvenBackground2; + public static FancyColor RowOddBackground => EditorGUIUtility.isProSkin ? DarkRowOddBackground : LightRowOddBackground; + public static FancyColor RowOddBackground2 => EditorGUIUtility.isProSkin ? DarkRowOddBackground2 : LightRowOddBackground2; + public static FancyColor RowBorder => EditorGUIUtility.isProSkin ? DarkRowBorder : LightRowBorder; + public static FancyColor RowBorderHover => EditorGUIUtility.isProSkin ? DarkRowBorderHover : LightRowBorderHover; + + public static FancyColor Tab => EditorGUIUtility.isProSkin ? DarkTab : LightTab; + public static FancyColor TabHover => EditorGUIUtility.isProSkin ? DarkTabHover : LightTabHover; + public static FancyColor TabSelected => EditorGUIUtility.isProSkin ? DarkTabSelected : LightTabSelected; + + public static FancyColor Checkerboard => DarkCheckerboard; + public static FancyColor CheckerboardBorder => DarkCheckerboardBorder; + + public static FancyColor DarkMenuBackground; + + public static FancyColor DarkWindowBackground; + public static FancyColor DarkPanel; + public static FancyColor DarkPanelGap; + + public static FancyColor DarkSelected; + + public static FancyColor DarkTabsBackground; + + public static FancyColor DarkColumnBackground; + + public static FancyColor DarkRowEvenBackground; + public static FancyColor DarkRowEvenBackground2; + public static FancyColor DarkRowOddBackground; + public static FancyColor DarkRowOddBackground2; + public static FancyColor DarkRowBorder; + public static FancyColor DarkRowBorderHover; + + public static FancyColor DarkTab; + public static FancyColor DarkTabHover; + public static FancyColor DarkTabSelected; + + public static FancyColor LightMenuBackground; + + public static FancyColor LightWindowBackground; + public static FancyColor LightPanel; + public static FancyColor LightPanelGap; + + public static FancyColor LightSelected; + + public static FancyColor LightTabsBackground; + + public static FancyColor LightColumnBackground; + + public static FancyColor LightRowEvenBackground; + public static FancyColor LightRowEvenBackground2; + public static FancyColor LightRowOddBackground; + public static FancyColor LightRowOddBackground2; + public static FancyColor LightRowBorder; + public static FancyColor LightRowBorderHover; + + public static FancyColor LightTab; + public static FancyColor LightTabHover; + public static FancyColor LightTabSelected; + + + public static FancyColor DarkCheckerboard; + public static FancyColor DarkCheckerboardBorder; + + private static GUIStyle DefaultTextStyle; + + private static GUIStyle _richLabelTextCenteredMultiLine; + private static GUIStyle _cardTitleWhite; + + static OdinLocalizationGUI() + { + DarkWindowBackground = new Color(0.15f, 0.15f, 0.15f, 1.0f); + LightWindowBackground = new Color(0.358f, 0.358f, 0.358f, 1.0f); + + DarkPanel = new Color(0.2156863f, 0.2156863f, 0.2156863f, 1.0f); + DarkPanelGap = new Color(0.0856863f, 0.0856863f, 0.0856863f, 1.0f); + + LightPanel = new Color(0.761f, 0.761f, 0.761f, 1.0f); + LightPanelGap = new Color(0.532f, 0.532f, 0.532f, 1.0f); + + DarkSelected = new Color(0.7076807f, 0.8213042f, 0.8773585f, 1.0f); + LightSelected = new Color(0.358f, 0.446f, 0.509f, 1.0f); + + DarkTabsBackground = new Color(0.1886792f, 0.1886792f, 0.1886792f, 1.0f); + LightTabsBackground = new Color(0.538f, 0.538f, 0.538f, 1.0f); + + DarkColumnBackground = new Color(0.099f, 0.099f, 0.099f, 1.0f); + LightColumnBackground = new FancyColor(0.84f); + + var rowBaseBlend = new FancyColor(0.42f); + +#region DARK_ROW + + var darkRowEvenBackground = new FancyColor(0.2f); + var darkRowOddBackground = new FancyColor(0.16f); + + DarkRowEvenBackground = darkRowEvenBackground; + DarkRowOddBackground = darkRowOddBackground; + + DarkRowEvenBackground2 = darkRowEvenBackground.Blend(rowBaseBlend, FancyColor.BlendMode.Overlay); + DarkRowOddBackground2 = darkRowOddBackground.Blend(rowBaseBlend, FancyColor.BlendMode.Overlay); + + DarkRowBorder = new Color(0, 0, 0, 0.3607843f); + DarkRowBorderHover = new Color(1, 1, 1, 0.2470588f); + +#endregion + +#region LIGHT_ROW + + var lightRowEvenBackground = new FancyColor(0.711f); + var lightRowOddBackground = new FancyColor(0.611f); + + LightRowEvenBackground = lightRowEvenBackground; + LightRowOddBackground = lightRowOddBackground; + + LightRowEvenBackground2 = lightRowEvenBackground.Blend(rowBaseBlend, FancyColor.BlendMode.Overlay); + LightRowOddBackground2 = lightRowOddBackground.Blend(rowBaseBlend, FancyColor.BlendMode.Overlay); + + LightRowBorder = new Color(0, 0, 0, 0.2f); + LightRowBorderHover = new Color(1, 1, 1, 0.4f); + +#endregion + + DarkTab = new Color(0.254717f, 0.254717f, 0.254717f, 1.0f); + DarkTabHover = new Color(0.277f, 0.277f, 0.277f, 1.0f); + DarkTabSelected = new Color(0.312f, 0.312f, 0.312f, 1.0f); + + float scalar = 0.925f; + LightTab = new FancyColor(0.85f * scalar); + LightTabHover = new FancyColor(0.915f * scalar); + LightTabSelected = new FancyColor(0.95f * scalar); + + DarkCheckerboard = new Color(0.298f, 0.298f, 0.298f, 1.0f); + DarkCheckerboardBorder = new Color(0, 0, 0, 0.5529412f); + + DefaultTextStyle = new GUIStyle(SirenixGUIStyles.MultiLineCenteredLabel); + DefaultTextStyle.focused.textColor = DefaultTextStyle.normal.textColor; + + DarkMenuBackground = DarkPanel; + + LightMenuBackground = new FancyColor(0.84f); + } + + public static string TextField(Rect position, string text, out bool changed, int id) + { + if (id == 0) + { + GUI.Label(position, text, SirenixGUIStyles.MultiLineCenteredLabel); + changed = false; + return text; + } + + Color lastCursorColor = GUI.skin.settings.cursorColor; + + bool isMouseDown = Event.current.type == EventType.MouseDown; + + if (isMouseDown) + { + GUI.skin.settings.cursorColor = Color.clear; + } + + text = EditorGUI_Internals.DoTextField(id, position, text, DefaultTextStyle, null, out changed, false, true, false); + + if (isMouseDown) + { + GUI.skin.settings.cursorColor = lastCursorColor; + } + + return text; + } + + public static string TextFieldSyntaxHighlighted(Rect position, string text, string syntaxRichText, out bool changed, int id) + { + if (string.IsNullOrEmpty(syntaxRichText)) + { + return TextField(position, text, out changed, id); + } + + GUIHelper.PushContentColor(Color.clear); + text = EditorGUI_Internals.DoTextField(id, position, text, SirenixGUIStyles.MultiLineCenteredLabel, null, out changed, false, true, false); + GUIHelper.PopContentColor(); + + GUI.Label(position, syntaxRichText, RichLabelTextCenteredMultiLine); + + return text; + } + + public static bool ObjectPickerButton(Rect position) + { + bool isMouseOver = Event.current.IsMouseOver(position); + + var c1 = EditorGUIUtility.isProSkin + ? new Color(1, 1, 1, isMouseOver ? 0.8f : 0.3f) + : new Color(0, 0, 0, isMouseOver ? 0.8f : 0.3f); + + SdfIcons.DrawIcon(position, SdfIconType.StopCircle, c1); + + return Event.current.OnMouseDown(position, 0); + } + + public static TEnum Tabs(Rect rect, TEnum value, float width) where TEnum : Enum + { + EnumTypeUtilities.EnumMember[] infos = EnumTypeUtilities.VisibleEnumMemberInfos; + + for (var i = 0; i < infos.Length; i++) + { + Rect itemRect = rect.TakeFromLeft(width); + + bool isMouseOver = Event.current.IsMouseOver(itemRect); + bool isSelected = value.Equals(infos[i].Value); + bool isPressed = Event.current.OnMouseDown(itemRect, 0); + + Color tabColor; + + if (isSelected) + { + tabColor = TabSelected; + } + else if (isMouseOver) + { + tabColor = TabHover; + } + else + { + tabColor = Tab; + } + + SirenixEditorGUI.DrawSolidRect(itemRect, tabColor); + + Vector2 textSize = EditorStyles.label.CalcSize(GUIHelper.TempContent(infos[i].NiceName)); + float iconSize = textSize.y; + float size = iconSize + 2.0f + textSize.x + 1.0f; + + if (size > itemRect.width) + { + if (iconSize > itemRect.width) + { + continue; + } + + SdfIcons.DrawIcon(itemRect.AlignCenter(iconSize), infos[i].Icon); + } + else + { + Rect contentRect = itemRect.AlignCenter(size); + + Rect iconRect = contentRect.TakeFromLeft(iconSize).AlignMiddle(iconSize); + SdfIcons.DrawIcon(iconRect, infos[i].Icon); + + contentRect.TakeFromLeft(2); + + GUI.Label(contentRect, infos[i].NiceName); + } + + if (isPressed) + { + value = infos[i].Value; + } + } + + return value; + } + + public static bool OverlaidButton(Rect position, string text, SdfIconType icon = SdfIconType.None, GUIStyle labelStyle = null, bool invert = false) + { + const float ICON_SIZE = 18; + const float SPACE = 4; + + bool isMouseOver = Event.current.IsMouseOver(position); + + ref SirenixAnimationUtility.InterpolatedFloat t = ref SirenixAnimationUtility.GetTemporaryFloat(position, isMouseOver ? 1.0f : 0.0f); + + t.ChangeDestination(isMouseOver ? 1.0f : 0.0f); + + t.Move(1.0f / 0.15f, Easing.OutQuad); + + float value = t.GetValue(); + float inverseValue = 1.0f - value; + + if (invert) + { + SirenixEditorGUI.DrawRoundRect(position, new Color(0, 0, 0, 0.2f * inverseValue), 5.0f, new Color(0, 0, 0, 0.05f * inverseValue), 1); + SirenixEditorGUI.DrawRoundRect(position, new Color(0, 0, 0, 0.4f * value), 5.0f, new Color(1.0f, 1.0f, 1.0f, 0.05f * value), 1); + } + else + { + SirenixEditorGUI.DrawRoundRect(position, new Color(1, 1, 1, 0.2f * inverseValue), 5.0f, new Color(0, 0, 0, 0.05f * inverseValue), 1); + SirenixEditorGUI.DrawRoundRect(position, new Color(1, 1, 1, 0.4f * value), 5.0f, new Color(1.0f, 1.0f, 1.0f, 0.05f * value), 1); + } + + labelStyle = labelStyle ?? SirenixGUIStyles.WhiteLabelCentered; + + if (icon == SdfIconType.None) + { + GUI.Label(position, text, labelStyle); + } + else + { + float textWidth = SirenixGUIStyles.WhiteLabelCentered.CalcWidth(text); + + Rect contentPosition = position.AlignCenter(ICON_SIZE + SPACE + textWidth); + + SdfIcons.DrawIcon(contentPosition.AlignLeft(ICON_SIZE), icon, Color.white); + + GUI.Label(contentPosition.AlignRight(textWidth), text, labelStyle); + } + + return Event.current.OnMouseDown(position, 0); + } + + public static bool Metadata(Type metadataType, bool isFirst) + { + var isRemoved = false; + + if (isFirst) + { + EditorGUI.DrawRect(GUILayoutUtility.GetRect(0, 1), new FancyColor(0.06603771f)); + } + + Vector2 padding = new Vector2(4, 4); + Rect rect = GUILayoutUtility.GetRect(0, 24); + + if (Event.current.IsMouseOver(rect)) + { + EditorGUI.DrawRect(rect, new FancyColor(0.2784314f)); + } + else + { + EditorGUI.DrawRect(rect, new FancyColor(0.2431373f)); + } + + + EditorGUI.DrawRect(GUILayoutUtility.GetRect(0, 1), new FancyColor(0.06603771f)); + + var iconWidth = 16.0f; + var iconPadding = new Vector2(2, 2); + + SdfIcons.DrawIcon(rect.TakeFromLeft(iconWidth).Padding(iconPadding.x, iconPadding.y), SdfIconType.GripVertical); + + rect = rect.Padding(padding.x, 0); + + SdfIcons.DrawIcon(rect.TakeFromLeft(iconWidth).Padding(iconPadding.x, iconPadding.y), SdfIconType.Braces); + + rect.TakeFromLeft(5); + GUI.Label(rect, metadataType.GetNiceName(), SirenixGUIStyles.BoldLabel); + + var removeRect = rect.TakeFromRight(iconWidth).Padding(iconPadding.x, iconPadding.y); + + SdfIcons.DrawIcon(removeRect, SdfIconType.X); + + if (GUI.Button(removeRect, GUIContent.none, GUIStyle.none)) + { + isRemoved = true; + } + + return isRemoved; + } + + public static void DrawRoundBlur20(Rect position, Color color) + { + position = position.Expand(63); + SirenixEditorGUI.DrawTextureSliced(position, OdinLocalizationGUITextures.RoundBlur20, color, 63); + } + + public static void DrawRoundBlur6(Rect position, Color color) + { + position = position.Expand(10); + SirenixEditorGUI.DrawTextureSliced(position, OdinLocalizationGUITextures.RoundBlur6, color, 10); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs.meta new file mode 100644 index 000000000..e85c5679d --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUI.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 12ea4fb9c8db4471801a31e2e0b353de +timeCreated: 1704803170 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs new file mode 100644 index 000000000..882f4c724 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs @@ -0,0 +1,310 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using Sirenix.Utilities.Editor; +using UnityEngine; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationGUITextures + { + private const float FADE_STRENGTH = 0.4f; + + public static Texture2D LeftToRightFade + { + get + { + if (leftToRightFade != null) + { + return leftToRightFade; + } + + leftToRightFade = new Texture2D(32, 32) + { + hideFlags = HideFlags.HideAndDontSave + }; + + var pixels = new Color[32 * 32]; + + var index = 0; + + for (var x = 0; x < 32; x++) + { + for (var y = 0; y < 32; y++) + { + pixels[index++] = Color.Lerp(Color.white, Color.clear, Mathf.Pow(y / 31.0f, FADE_STRENGTH)); + } + } + + leftToRightFade.SetPixels(pixels); + + leftToRightFade.Apply(); + + CleanupUtility.DestroyObjectOnAssemblyReload(leftToRightFade); + + return leftToRightFade; + } + } + + public static Texture2D TopToBottomFade + { + get + { + if (topToBottomFade != null) + { + return topToBottomFade; + } + + topToBottomFade = new Texture2D(32, 32) + { + hideFlags = HideFlags.HideAndDontSave + }; + + var pixels = new Color[32 * 32]; + + var index = 0; + + for (var x = 0; x < 32; x++) + { + for (var y = 0; y < 32; y++) + { + pixels[index++] = Color.Lerp(Color.white, Color.clear, Mathf.Pow(1.0f - x / 31.0f, FADE_STRENGTH)); + } + } + + topToBottomFade.SetPixels(pixels); + + topToBottomFade.Apply(); + + CleanupUtility.DestroyObjectOnAssemblyReload(topToBottomFade); + + return topToBottomFade; + } + } + + public static Texture2D BottomToTopFade + { + get + { + if (bottomToTopFade != null) + { + return bottomToTopFade; + } + + bottomToTopFade = new Texture2D(32, 32) + { + hideFlags = HideFlags.HideAndDontSave + }; + + var pixels = new Color[32 * 32]; + + var index = 0; + + for (var x = 0; x < 32; x++) + { + for (var y = 0; y < 32; y++) + { + pixels[index++] = Color.Lerp(Color.white, Color.clear, Mathf.Pow(x / 31.0f, FADE_STRENGTH)); + } + } + + bottomToTopFade.SetPixels(pixels); + + bottomToTopFade.Apply(); + + CleanupUtility.DestroyObjectOnAssemblyReload(bottomToTopFade); + + return bottomToTopFade; + } + } + + public static Texture2D RoundBlur6 + { + get + { + if (roundBlur6 == null) + { + const string BASE64 = + "iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAYAAAA53+RiAAAFDElEQVR4Ae2dzZIURRSFaQFBDGBBsHGB76Ju0BfxkXwRZaXvIgs3BhEiIT/DYHu+pG+R3XN6mDa6uZuTEacr61ZWVcb3kVXFaq5dSwuBELg6gVUN" + + "Xa/X1a1tHWO7G8bU8RqfrSdQYNnuhjPq+Dh7tXqP9cbY2/4p4J+pTK5PqRrbGqdu2iUEAP/vlHfqV6rO6VuCdsUAm5SQm+p/vgl9wjklSN3RIqlIvN/OkAv+uQ693eRMW8I+khhDW87bFcNBoFO/pdxW7ihfbML+" + + "LCdCBOSSVqulpLzW2FebvNSW/TcKxxG0tFnMvFKQgpC7yn3l3qZPreTkcSYYH2klhpWBBGS8UJ4r/AOHIY1xNZbtWBlsqzGQE4CPlAfKQ+Vb5XvlkcKjLe1wAjy6nio/K78pcKbxGKvHWT3SPrzA9VWGFKCzKlgl" + + "SPlK+VF5rKQdj8ATXeon5Q/lmcIKYjWd6atsyKmlpNqQxBcYcninIOcbJVIE4cgNpjyFYAxrmMN+eWc7MSwxBvMo+0FJOw0BXg0whjXMLxWDqHrH8Eh7pKSdhgBsYWw/pnZXDPt8qZUclljaaQjAtqTAHPb2Ucbt" + + "OTjLoZZ2OgIsgJIC96XNO9iq/8uUoGVgOichUJzZFv9xo1nMfOetQfOB9I9KYC/nfWKOevdc7HACTgwW0z4tgQvMnZhPO6XczRKIGIulvxgx/Q7sDCLGYukvRky/AzuDiLFY+osR0+/AziBiLJb+YsT0O7AziBiL" + + "pb8YMf0O7AwixmLpL0ZMvwM7g4ixWPqLEdPvwM4gYiyW/mLE9DuwM4gYi6W/GDH9DuwMIsZi6S9GTL8DO4OIsVj6ixHT78DOIGIslv5ixPQ7sDOIGIulvxgx/Q7sDCLGYukvRky/AzuDiLFY+osR0+/AziBiLJb+" + + "YsT0O7AziBiLpb8YMf0O7AwixmLpL0ZMvwM7g4ixWPqLEdPvwM4gYiyW/mLE9DuwM4gYi6W/GDH9DuwMIsZi6S9GTL8DO4OIsVj6ixHT78DOIGIslv5ixPQ7sDOIGIulvxgx/Q7sDCLGYukvRky/AzuDiLFY+osR" + + "0+/AziBiLJb+YsT0O7AziBiLpb8YMf0O7AwixmLpL0ZMvwM7g4ixWPqLEdPvwM4gYiyW/mLE9DuwM4gYi6W/GDH9DuwMnJjxZ8vt6BRPReACcyfmVDfPdQ8gsE8MBi9YPOC6GXo1Ans5z2JqEH9PvnK1y2fU/yVQ" + + "nNkW/3GtWQyFGniu/tsxIj+nJABjWBf35V6zGIwxoKS8Vv9sGZnOsQnAFsazHByM5sQwkBNeKk/HqPycggBsYVxy6nE27rUr5p2qiHmlvFB+UdJOQwC2MIY1zGG/d8VwkCXG4L+VX5UnStpxCcAUtjCGNcy3xCx/" + + "fHm9XtO/odxSvlTuKw+Uh8p3ymPla+WmknY4AVbF7worBSl/Ks+U58o/yhvlfLVajVWzK4ZHG3JuK3eUuwqC7m361DiGHMYu56ufdpEAkHl3zO9tHl+sFITQr/fM+DorMUioVhdhSWGPVhfF6F9KSeG8iBGEj7Ri" + + "On/p8ugiJQTWMN96+c9idGw0BnAhLsoJ9THAKiElZf5wyMoRmKnBrho8iyksCe8UQr+kqPuhLUD1jqlq1QBPrk+pGtsap27aJQRq1ZQgRFSqxulDgB5l41IL3EnMOKCfOsZ2N4yp4/TT9hOof/Fsd8NZdXxcocSM" + + "nfyEQAhckcB/Z2rwteNGzXsAAAAASUVORK5CYII="; + + byte[] bytes = Convert.FromBase64String(BASE64); + + roundBlur6 = TextureUtilities.LoadImage(102, 102, bytes); + + roundBlur6.hideFlags = HideFlags.HideAndDontSave; + + CleanupUtility.DestroyObjectOnAssemblyReload(roundBlur6); + } + + return roundBlur6; + } + } + + public static Texture2D RoundBlur20 + { + get + { + if (roundBlur20 == null) + { + const string BASE64 = + "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"; + + byte[] bytes = Convert.FromBase64String(BASE64); + + roundBlur20 = TextureUtilities.LoadImage(193, 193, bytes); + + roundBlur20.hideFlags = HideFlags.HideAndDontSave; + + CleanupUtility.DestroyObjectOnAssemblyReload(roundBlur20); + } + + return roundBlur20; + } + } + + private static Texture2D leftToRightFade; + private static Texture2D topToBottomFade; + private static Texture2D bottomToTopFade; + private static Texture2D roundBlur6; + private static Texture2D roundBlur20; + + public static void Clear() + { + if (leftToRightFade != null) + { + UnityEngine.Object.Destroy(leftToRightFade); + } + + if (topToBottomFade != null) + { + UnityEngine.Object.Destroy(topToBottomFade); + } + + if (bottomToTopFade != null) + { + UnityEngine.Object.Destroy(bottomToTopFade); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs.meta new file mode 100644 index 000000000..1fb902d6e --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationGUITextures.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 78842ff15d254d9b8994383880b759f1 +timeCreated: 1704903394 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs new file mode 100644 index 000000000..9a70db77f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs @@ -0,0 +1,55 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine.Localization.Metadata; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public class OdinLocalizationMetadataRegistry + { + public static readonly List AssetEntryMetadataTypes = new List(); + + public static readonly List StringEntryMetadataTypes = new List(); + + public static readonly Dictionary MetadataAllowsMultiple = new Dictionary(); + + static OdinLocalizationMetadataRegistry() + { + TypeCache.TypeCollection metadataTypes = TypeCache.GetTypesDerivedFrom(typeof(IMetadata)); + + for (var i = 0; i < metadataTypes.Count; i++) + { + Type currentType = metadataTypes[i]; + + var attr = currentType.GetCustomAttribute(); + + if (attr is null) + { + MetadataAllowsMultiple[currentType] = true; + continue; + } + + MetadataAllowsMultiple[currentType] = attr.AllowMultiple; + + MetadataType currentAllowedTypes = attr.AllowedTypes; + + if (currentAllowedTypes.HasFlag(MetadataType.StringTableEntry)) + { + StringEntryMetadataTypes.Add(currentType); + } + + if (currentAllowedTypes.HasFlag(MetadataType.AssetTableEntry)) + { + AssetEntryMetadataTypes.Add(currentType); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs.meta new file mode 100644 index 000000000..e47018072 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationMetadataRegistry.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7deb6e0b5f6c4579ba2ead2af5620d3e +timeCreated: 1706509329 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs new file mode 100644 index 000000000..54e3fc26f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if SIRENIX_INTERNAL +using System.Collections; +using System.Reflection; +using Sirenix.OdinInspector.Editor.Validation; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; + +[assembly: RegisterValidator(typeof(OdinLocalizationReflectionValidator))] +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public class OdinLocalizationReflectionValidator : GlobalValidator + { + public override IEnumerable RunValidation(ValidationResult result) + { + OdinLocalizationReflectionValues.EnsureInit(); + + FieldInfo[] fields = typeof(OdinLocalizationReflectionValues).GetFields(BindingFlags.Static | BindingFlags.Public); + + for (var i = 0; i < fields.Length; i++) + { + if (fields[i].IsLiteral) + { + continue; + } + + if (fields[i].GetValue(null) != null) + { + continue; + } + + result.AddError($"[Odin Localization Module]: {fields[i].Name} was not found."); + } + + return null; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs.meta new file mode 100644 index 000000000..bb30c80b5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValidator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c12d37dc91fe4285bd661d45717bf34a +timeCreated: 1704797628 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs new file mode 100644 index 000000000..62426c162 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Reflection; +using Sirenix.Serialization; +using UnityEditor.AddressableAssets.Settings; +using UnityEditor.Localization; +using UnityEngine.Localization; +using UnityEngine.Localization.Metadata; +using UnityEngine.Localization.Tables; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationReflectionValues + { + public const string TABLE_ENTRY_DATA__METADATA__PATH = "m_Metadata"; + public const string METADATA_COLLECTION__ITEMS__PATH = "m_Items"; + public const string TABLE_ENTRY__DATA__PATH = "Data"; + + public static readonly bool HasAPIForCustomUndo = false; + + public static readonly PropertyInfo TableEntry_Data_Property; + public static readonly PropertyInfo AssetTableEntry_Data_Property; + public static readonly PropertyInfo StringTableEntry_Data_Property; + + public static readonly FieldInfo TableEntryData_m_Metadata_Field; + public static readonly FieldInfo MetadataCollection_m_Items_Field; + + public static readonly PropertyInfo LocalizationEditorSettings_Instance; + public static readonly MethodInfo LocalizationEditorSettings_GetAddressableAssetSettings; + public static readonly MethodInfo LocalizationEditorSettings_IsTableNameValid; + + public static readonly MethodInfo RaiseTableEntryModified_Method; + public static readonly MethodInfo RaiseTableEntryAdded_Method; + public static readonly MethodInfo RaiseTableEntryRemoved_Method; + public static readonly MethodInfo RaiseAssetTableEntryAdded_Method; + public static readonly MethodInfo RaiseAssetTableEntryRemoved_Method; + public static readonly MethodInfo AssetTableCollection_SetEntryAssetType_PrivateMethod; + public static readonly MethodInfo AssetTableCollection_RemoveEntryAssetType_PrivateMethod; + + public static readonly Type AddressHelper; + public static readonly MethodInfo FormatAssetLabelMethod; + public static readonly MethodInfo UpdateAssetGroupMethod; + + private const BindingFlags INSTANCE_ALL = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + private const BindingFlags INSTANCE_NON_PUBLIC = BindingFlags.Instance | BindingFlags.NonPublic; + private const BindingFlags STATIC_NON_PUBLIC = BindingFlags.Static | BindingFlags.NonPublic; + + internal static Func LocalizationEditorSettings_GetAddressableAssetSettingsFunc; + + static OdinLocalizationReflectionValues() + { + TableEntry_Data_Property = typeof(TableEntry).GetProperty(TABLE_ENTRY__DATA__PATH, INSTANCE_ALL); + AssetTableEntry_Data_Property = typeof(AssetTableEntry).BaseType.GetProperty(TABLE_ENTRY__DATA__PATH, INSTANCE_ALL); + StringTableEntry_Data_Property = typeof(StringTableEntry).BaseType.GetProperty(TABLE_ENTRY__DATA__PATH, INSTANCE_ALL); + + Type tableEntryDataType = TwoWaySerializationBinder.Default.BindToType("UnityEngine.Localization.Tables.TableEntryData, Unity.Localization"); + + TableEntryData_m_Metadata_Field = tableEntryDataType?.GetField(TABLE_ENTRY_DATA__METADATA__PATH, INSTANCE_ALL); + MetadataCollection_m_Items_Field = typeof(MetadataCollection).GetField(METADATA_COLLECTION__ITEMS__PATH, INSTANCE_ALL); + + LocalizationEditorSettings_Instance = typeof(LocalizationEditorSettings).GetProperty("Instance", STATIC_NON_PUBLIC); + LocalizationEditorSettings_GetAddressableAssetSettings = typeof(LocalizationEditorSettings).GetMethod("GetAddressableAssetSettings", + INSTANCE_NON_PUBLIC); + LocalizationEditorSettings_IsTableNameValid = typeof(LocalizationEditorSettings).GetMethod("IsTableNameValid", INSTANCE_NON_PUBLIC); + + + RaiseTableEntryModified_Method = LocalizationEditorSettings.EditorEvents.GetType().GetMethod("RaiseTableEntryModified", INSTANCE_ALL); + RaiseTableEntryAdded_Method = LocalizationEditorSettings.EditorEvents.GetType().GetMethod("RaiseTableEntryAdded", INSTANCE_ALL); + RaiseTableEntryRemoved_Method = LocalizationEditorSettings.EditorEvents.GetType().GetMethod("RaiseTableEntryRemoved", INSTANCE_ALL); + RaiseAssetTableEntryAdded_Method = LocalizationEditorSettings.EditorEvents.GetType().GetMethod("RaiseAssetTableEntryAdded", INSTANCE_ALL); + RaiseAssetTableEntryRemoved_Method = LocalizationEditorSettings.EditorEvents.GetType().GetMethod("RaiseAssetTableEntryRemoved", INSTANCE_ALL); + AssetTableCollection_SetEntryAssetType_PrivateMethod = typeof(AssetTableCollection).GetMethod("SetEntryAssetType", INSTANCE_NON_PUBLIC); + AssetTableCollection_RemoveEntryAssetType_PrivateMethod = typeof(AssetTableCollection).GetMethod("RemoveEntryAssetType", INSTANCE_NON_PUBLIC); + + if (LocalizationEditorSettings_Instance != null && LocalizationEditorSettings_GetAddressableAssetSettings != null) + { + LocalizationEditorSettings_GetAddressableAssetSettingsFunc = + (Func) Delegate.CreateDelegate(typeof(Func), + LocalizationEditorSettings_Instance.GetValue(null), + LocalizationEditorSettings_GetAddressableAssetSettings); + } + + AddressHelper = TwoWaySerializationBinder.Default.BindToType("UnityEngine.Localization.AddressHelper"); + + FormatAssetLabelMethod = AddressHelper?.GetMethod("FormatAssetLabel", + BindingFlags.Static | BindingFlags.Public, + null, + new[] {typeof(LocaleIdentifier)}, + null); + + UpdateAssetGroupMethod = typeof(AssetTableCollection).GetMethod("UpdateAssetGroup", + BindingFlags.Instance | BindingFlags.NonPublic, + null, + new[] + { + typeof(AddressableAssetSettings), + typeof(AddressableAssetEntry), + typeof(bool) + }, + null); + + HasAPIForCustomUndo = AddressHelper != null && + FormatAssetLabelMethod != null && + UpdateAssetGroupMethod != null && + LocalizationEditorSettings_GetAddressableAssetSettingsFunc != null; + } + + public static Action Create_RaiseTableEntryModified_Method_Delegate(LocalizationEditorEvents events) + { + return (Action) Delegate.CreateDelegate(typeof(Action), + events, + RaiseTableEntryModified_Method); + } + + public static Action Create_RaiseTableEntryAdded_Method_Delegate( + LocalizationEditorEvents events) + { + return (Action) + Delegate.CreateDelegate(typeof(Action), + events, + RaiseTableEntryAdded_Method); + } + + public static Action Create_RaiseTableEntryRemoved_Method_Delegate( + LocalizationEditorEvents events) + { + return (Action) + Delegate.CreateDelegate(typeof(Action), + events, + RaiseTableEntryRemoved_Method); + } + + public static Action Create_AssetTableEntryAdded_Method_Delegate( + LocalizationEditorEvents events) + { + return (Action) + Delegate.CreateDelegate(typeof(Action), + events, + RaiseAssetTableEntryAdded_Method); + } + + public static Action Create_AssetTableEntryRemoved_Method_Delegate( + LocalizationEditorEvents events) + { + return (Action) + Delegate.CreateDelegate(typeof(Action), + events, + RaiseAssetTableEntryRemoved_Method); + } + + public static Action Create_AssetTableCollection_SetEntryAssetType_PrivateMethod_Delegate(AssetTableCollection collection) + { + return (Action) Delegate.CreateDelegate(typeof(Action), + collection, + AssetTableCollection_SetEntryAssetType_PrivateMethod); + } + + public static Action Create_AssetTableCollection_RemoveEntryAssetType_PrivateMethod_Delegate(AssetTableCollection collection) + { + return (Action) Delegate.CreateDelegate(typeof(Action), + collection, + AssetTableCollection_RemoveEntryAssetType_PrivateMethod); + } + +#if SIRENIX_INTERNAL + public static void EnsureInit() { } +#endif + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs.meta new file mode 100644 index 000000000..c6267e259 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationReflectionValues.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b54903c48e344164a8ef89c56ba21f22 +timeCreated: 1704797678 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs new file mode 100644 index 000000000..45fc9a6f4 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs @@ -0,0 +1,196 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System.Runtime.CompilerServices; +using System.Text; +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; +using UnityEditor.Localization.Plugins.XLIFF.V12; +using UnityEngine; +using UnityEngine.Localization.SmartFormat; +using UnityEngine.Localization.SmartFormat.Core.Parsing; +using UnityEngine.Localization.SmartFormat.Core.Settings; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor.Internal +{ + public static class OdinLocalizationSyntaxHighlighter + { + private const string END_RICH_COLOR = ""; + + private static readonly SmartFormatter Formatter; + + private static readonly StringBuilder Buffer; + + // TODO: if this works nicely, maybe implement a custom solution that doesn't rely on SmartFormatter + + static OdinLocalizationSyntaxHighlighter() + { + Formatter = Smart.CreateDefaultSmartFormat(); + Formatter.Settings.ParseErrorAction = ErrorAction.MaintainTokens; + Formatter.Settings.FormatErrorAction = ErrorAction.MaintainTokens; + + Buffer = new StringBuilder(); + } + + public static string HighlightAsRichText(string source) + { + Format format = Formatter.Parser.ParseFormat(source, Formatter.GetNotEmptyFormatterExtensionNames()); + + Buffer.Clear(); + + int expectedSize = source.Length; + AppendToBuffer(format, source, ref expectedSize); + + // NOTE: we fallback to source in-case any obvious discrepancies are happening. + return Buffer.Length != expectedSize ? source : Buffer.ToString(); + } + + public static string GetErrorMessage(string source, out bool foundError) + { + Formatter.Settings.ParseErrorAction = ErrorAction.OutputErrorInResult; + Formatter.Settings.FormatErrorAction = ErrorAction.OutputErrorInResult; + + Format format = Formatter.Parser.ParseFormat(source, Formatter.GetNotEmptyFormatterExtensionNames()); + + Buffer.Clear(); + + int expectedSize = source.Length; + AppendToBuffer(format, source, ref expectedSize); + + foundError = expectedSize != Buffer.Length; + + Formatter.Settings.ParseErrorAction = ErrorAction.MaintainTokens; + Formatter.Settings.FormatErrorAction = ErrorAction.MaintainTokens; + + return Buffer.ToString(); + } + + private static void AppendColorAsRichTag(Color color, ref int expectedSize) + { + var color32 = (Color32) color; + + var richTag = $""; + expectedSize += richTag.Length; + + Buffer.Append(richTag); + } + + private static bool IsLastBufferEqual(string expected) + { + if (expected.Length > Buffer.Length) + { + return false; + } + + int bufferIndex = Buffer.Length - 1; + + for (int i1 = expected.Length - 1; i1 >= 0; i1--, bufferIndex--) + { + if (Buffer[bufferIndex] != expected[i1]) + { + return false; + } + } + + return true; + } + + private static void AppendToBuffer(Format format, string source, ref int expectedSize) + { + for (var i = 0; i < format.Items.Count; i++) + { + if (Buffer.Length == source.Length) + { + break; + } + + FormatItem item = format.Items[i]; + + if (!(item is Placeholder placeholder)) + { + Buffer.Append(item.RawText); + continue; + } + + AppendColorAsRichTag(OdinLocalizationConfig.Instance.placeholderColor, ref expectedSize); + + Buffer.Append('{'); + + for (var j = 0; j < placeholder.Selectors.Count; j++) + { + Selector selector = placeholder.Selectors[j]; + + AppendColorAsRichTag(OdinLocalizationConfig.Instance.selectorColor, ref expectedSize); + + string op = selector.Operator; + + if (!string.IsNullOrEmpty(op)) + { + Buffer.Append(selector.Operator); + } + + Buffer.Append(selector.RawText); + + Buffer.Append(END_RICH_COLOR); + expectedSize += END_RICH_COLOR.Length; + } + + if (placeholder.Alignment != 0) + { + Buffer.Append(','); + + Buffer.Append(placeholder.Alignment); + } + + if (!string.IsNullOrEmpty(placeholder.FormatterName)) + { + Buffer.Append(':'); + + AppendColorAsRichTag(OdinLocalizationConfig.Instance.formatterColor, ref expectedSize); + + Buffer.Append(placeholder.FormatterName); + + if (!string.IsNullOrEmpty(placeholder.FormatterOptions)) + { + Buffer.Append('('); + Buffer.Append(placeholder.FormatterOptions); + Buffer.Append(')'); + } + + Buffer.Append(END_RICH_COLOR); + expectedSize += END_RICH_COLOR.Length; + } + + if (placeholder.Format != null) + { + Format nextFormat = placeholder.Format; + + bool showColon; + + if (nextFormat.startIndex > 0) + { + showColon = nextFormat.baseString[nextFormat.startIndex - 1] == ':'; + } + else + { + showColon = true; + } + + if (showColon) + { + Buffer.Append(':'); + } + + AppendToBuffer(nextFormat, source, ref expectedSize); + } + + Buffer.Append('}'); + + Buffer.Append(END_RICH_COLOR); + expectedSize += END_RICH_COLOR.Length; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs.meta new file mode 100644 index 000000000..b75002cdd --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Internal/OdinLocalizationSyntaxHighlighter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: edfba57bc4284142a39f658cc44f70c6 +timeCreated: 1704797761 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs new file mode 100644 index 000000000..825c069f2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs @@ -0,0 +1,39 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +#if UNITY_EDITOR + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + using UnityEngine.Localization; + using Sirenix.OdinInspector.Editor; + using System; + using Sirenix.Utilities.Editor; + + public class LocalizedReferenceResolver : OdinPropertyResolver + { + public override int ChildNameToIndex(string name) + { + throw new NotSupportedException(); + } + + public override int ChildNameToIndex(ref StringSlice name) + { + throw new NotSupportedException(); + } + + public override InspectorPropertyInfo GetChildInfo(int childIndex) + { + throw new NotSupportedException(); + } + + protected override int GetChildCount(LocalizedReference value) + { + return 0; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs.meta new file mode 100644 index 000000000..347fefe2f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/LocalizationSupport.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 46db7b2a049564544ad19a2e480a1333 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs new file mode 100644 index 000000000..b5c220810 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs @@ -0,0 +1,25 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public static class OdinLocalizationConstants + { + public static int AssetPreviewRowHeight => OdinLocalizationConfig.Instance.assetRowHeight; + public const int DEFAULT_COLUMN_WIDTH = 300; + public const int MIN_COLUMN_WIDTH = 200; + public const int COLUMN_HEIGHT = 38; + public const int ROW_MENU_WIDTH = 28; + public const int ROW_HEIGHT = 30; + public const int EMPTY_ASSET_ROW_HEIGHT = ROW_HEIGHT; //96; + public const int ASSET_ROW_HEIGHT = 104; //96; + public const int ENTRY_PADDING = 4; + public const int TOOLBAR_HEIGHT = 28; + public const int DRAG_HANDLE_WIDTH = 27; + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs.meta new file mode 100644 index 000000000..b314d14f4 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/OdinLocalizationConstants.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cd2728f4c9e842db8d6b5e8c18cce611 +timeCreated: 1706411619 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef new file mode 100644 index 000000000..a33eec9c2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef @@ -0,0 +1,29 @@ +{ + "name": "Sirenix.OdinInspector.Modules.UnityLocalization.Editor", + "references": [ + "Unity.Localization", + "Sirenix.Serialization", + "Sirenix.OdinInspector.Attributes", + "Sirenix.OdinInspector.Editor", + "Sirenix.Utilities.Editor", + "Unity.Localization.Editor", + "Sirenix.Utilities", + "Unity.Addressables.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [ + "Sirenix.Serialization.dll", + "Sirenix.OdinInspector.Attributes.dll", + "Sirenix.OdinInspector.Editor.dll", + "Sirenix.Utilities.Editor.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef.meta new file mode 100644 index 000000000..fd0f63831 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3656feb4b010c5941972fb7b3b9eec3e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows.meta new file mode 100644 index 000000000..03c97b2a1 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 835e118525d8475f939f4105af066578 +timeCreated: 1704796852 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs new file mode 100644 index 000000000..015789d6d --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs @@ -0,0 +1,663 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Sirenix.OdinInspector.Editor; +using Sirenix.OdinInspector.Editor.Internal; +using Sirenix.OdinInspector.Modules.Localization.Editor.Configs; +using Sirenix.OdinInspector.Modules.Localization.Editor.Internal; +using Sirenix.Serialization; +using Sirenix.Utilities; +using Sirenix.Utilities.Editor; +using UnityEditor; +using UnityEditor.Localization; +using UnityEngine; +using UnityEngine.Localization; + +namespace Sirenix.OdinInspector.Modules.Localization.Editor +{ + public class OdinLocalizationCreateTableMenu + { + [Serializable] + public class LocaleItem + { + [HideInInspector] + public Locale Locale; + + [HideLabel] + public bool Enabled; + } + + public enum TableCollectionType + { + StringTableCollection, + AssetTableCollection + } + + private string FolderPath => string.IsNullOrEmpty(this.Folder) ? "Assets" : $"Assets/{this.Folder}"; + + [ValidateInput(nameof(ValidateName), "@this." + nameof(nameErrorMessage))] + [VerticalGroup("Split/Left")] + [PropertySpace(SpaceAfter = 2, SpaceBefore = 2)] + public string Name; + + [EnableIf("@this." + nameof(EnableFolder))] + [InfoBox("The directory is not found, this will create a new directory on creation.", visibleIfMemberName: nameof(ShowFolderInfoBox))] + [HorizontalGroup("Split")] + [VerticalGroup("Split/Left")] + [FolderPath(ParentFolder = "Assets")] + public string Folder; + + [VerticalGroup("Split/Left")] + [PropertySpace(SpaceAfter = 2, SpaceBefore = 2)] + [HideLabel] + [EnumToggleButtons] + public TableCollectionType Type; + + [EnableIf(nameof(EnableCreateIf))] + [VerticalGroup("Split/Left")] + [PropertySpace(SpaceBefore = 4)] + [Button(ButtonSizes.Large)] + public void Create() + { + var localizationWindow = EditorWindow.focusedWindow as OdinLocalizationEditorWindow; + + if (!this.HasAnyLocaleSelected()) + { + if (localizationWindow) + { + localizationWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.ExclamationOctagonFill, + "At least 1 Locale must be selected.", + new Color(0.68f, 0.2f, 0.2f), + 5.0f); + } + + return; + } + + if (!Directory.Exists(this.FolderPath)) + { + Directory.CreateDirectory(this.FolderPath); + } + + var collectionLocales = new List(this.Locales.Count); + + foreach (LocaleItem localeItem in this.Locales) + { + if (localeItem.Enabled) + { + collectionLocales.Add(localeItem.Locale); + } + } + + switch (this.Type) + { + case TableCollectionType.StringTableCollection: + LocalizationEditorSettings.CreateStringTableCollection(this.Name, this.FolderPath, collectionLocales); + break; + + case TableCollectionType.AssetTableCollection: + LocalizationEditorSettings.CreateAssetTableCollection(this.Name, this.FolderPath, collectionLocales); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + if (localizationWindow) + { + string typeNiceName; + + switch (this.Type) + { + case TableCollectionType.StringTableCollection: + typeNiceName = "String Table Collection"; + break; + + case TableCollectionType.AssetTableCollection: + typeNiceName = "Asset Table Collection"; + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + localizationWindow.ShowToast(ToastPosition.BottomLeft, + SdfIconType.Check2, + $"{typeNiceName} '{this.Name}' created at: {this.FolderPath}.", + new Color(0.29f, 0.57f, 0.42f), + 16.0f); + } + } + + [HorizontalGroup("Split")] + [VerticalGroup("Split/Right")] + [InlineProperty] + [ListDrawerSettings(ListElementLabelName = "@this.Locale.LocaleName", + HideAddButton = true, + HideRemoveButton = true, + DefaultExpandedState = true, + ShowFoldout = false, + ShowItemCount = false, + DraggableItems = false)] + public List Locales = new List(); + + [HorizontalGroup("Split/Right/Split")] + [Button] + public void LocaleGenerator() + { + try + { + TwoWaySerializationBinder.Default.BindToType("UnityEditor.Localization.UI.LocaleGeneratorWindow, Unity.Localization.Editor") + .GetMethod("ShowWindow", BindingFlags.Static | BindingFlags.Public) + .Invoke(null, null); + } + catch (NullReferenceException nullReferenceException) + { + Debug.LogError($"[Odin]: Failed to find LocaleGeneratorWindow.ShowWindow.\n{nullReferenceException.Message}"); + } + } + + [HorizontalGroup("Split/Right/Split")] + [Button] + public void SelectNone() + { + for (var i = 0; i < this.Locales.Count; i++) + { + this.Locales[i].Enabled = false; + } + } + + [HorizontalGroup("Split/Right/Split")] + [Button] + public void SelectAll() + { + for (var i = 0; i < this.Locales.Count; i++) + { + this.Locales[i].Enabled = true; + } + } + + [HideInInspector] + internal bool EnableFolder = true; + + private string nameErrorMessage = string.Empty; + + private bool ValidateName(string name) + { + if (string.IsNullOrEmpty(name)) + { + this.nameErrorMessage = $"{nameof(this.Name)} can't be empty."; + return false; + } + + Type collectionType; + + switch (this.Type) + { + case TableCollectionType.StringTableCollection: + collectionType = typeof(StringTableCollection); + break; + + case TableCollectionType.AssetTableCollection: + collectionType = typeof(AssetTableCollection); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + bool isTableNameValid = OdinLocalizationEditorSettings.IsTableNameValid(collectionType, name, out string localizationErrorMsg); + + if (isTableNameValid) + { + return true; + } + + this.nameErrorMessage = localizationErrorMsg; + + return false; + } + + private bool ShowFolderInfoBox() + { + if (string.IsNullOrEmpty(this.Folder)) + { + return false; + } + + return !Directory.Exists(this.FolderPath); + } + + private bool EnableCreateIf() => this.Locales.Count > 0 && this.ValidateName(this.Name); + + private bool HasAnyLocaleSelected() + { + for (var i = 0; i < this.Locales.Count; i++) + { + if (this.Locales[i].Enabled) + { + return true; + } + } + + return false; + } + } + + public class OdinLocalizationEditorWindow : OdinMenuEditorWindow, IDisposable + { + public enum RightMenuTopTabs + { + [LabelText(SdfIconType.Braces)] + Metadata, + + [LabelText(SdfIconType.GearFill)] + Settings + } + + public enum RightMenuBottomTabs + { + [LabelText(SdfIconType.FlagFill)] + Locale, + +#if false + [LabelText(SdfIconType.BorderWidth)] + Template, +#endif + + [LabelText(SdfIconType.GearFill)] + Settings + } + + public class WindowState : IDisposable + { + public static string EditorPrefsKey = "OdinLocalizationEditorWindow_EditorPrefs"; + + public RightMenuTopTabs CurrentTopTab; + public RightMenuBottomTabs CurrentBottomTab; + public PropertyTree MetadataTree = null; + public bool ShowSharedMetadata = true; + + public float LeftMenuWidth; + public float RightMenuWidth; + public float RightMenuTopPanelHeight; + public float LastOpenRightMenuWidth; + + public void Save() + { + EditorPrefs.SetFloat($"{EditorPrefsKey}_LeftMenuWidth", this.LeftMenuWidth); + EditorPrefs.SetFloat($"{EditorPrefsKey}_RightMenuWidth", this.RightMenuWidth); + EditorPrefs.SetFloat($"{EditorPrefsKey}_RightMenuTopHeight", this.RightMenuTopPanelHeight); + EditorPrefs.SetFloat($"{EditorPrefsKey}_LastOpenRightMenuWidth", this.LastOpenRightMenuWidth); + } + + public void Load() + { + this.LeftMenuWidth = EditorPrefs.GetFloat($"{EditorPrefsKey}_LeftMenuWidth", 300); + this.RightMenuWidth = EditorPrefs.GetFloat($"{EditorPrefsKey}_RightMenuWidth", 300); + this.RightMenuTopPanelHeight = EditorPrefs.GetFloat($"{EditorPrefsKey}_RightMenuTopHeight"); + this.LastOpenRightMenuWidth = EditorPrefs.GetFloat($"{EditorPrefsKey}_LastOpenRightMenuWidth"); + } + + public void Dispose() + { + this.MetadataTree?.Dispose(); + this.MetadataTree = null; + } + } + + [MenuItem("Tools/Odin/Localization Editor", priority = 10_100)] + public static void OpenFromMenu() + { + var wnd = GetWindow(); + wnd.MenuWidth = 300.0f; + } + + public WindowState State; + + private object lastSelection; + + protected override void Initialize() + { + this.State = new WindowState(); + this.State.Load(); + } + + protected override void OnDestroy() + { + base.OnDestroy(); + + this.DisposeActiveCollection(); + this.State.Dispose(); + } + + protected override void OnDisable() + { + base.OnDisable(); + this.State.Save(); + + this.DisposeActiveCollection(); + this.State.Dispose(); + } + + protected override void OnImGUI() + { + if (LocalizationEditorSettings.ActiveLocalizationSettings == null) + { + Rect popupPosition = this.position.SetPosition(Vector2.zero).AlignCenter(360, 160); + + if (EditorGUIUtility.isProSkin) + { + //OdinLocalizationGUI.DrawRoundGlowRect(popupPosition.Expand(54), FancyColor.CreateHex(0x323232)); + OdinLocalizationGUI.DrawRoundBlur6(popupPosition, new Color(0, 0, 0, 0.025f)); + SirenixEditorGUI.DrawRoundRect(popupPosition, FancyColor.CreateHex(0x383838), 5.0f); + } + else + { + OdinLocalizationGUI.DrawRoundBlur6(popupPosition, new Color(0, 0, 0, 0.02f)); + SirenixEditorGUI.DrawRoundRect(popupPosition, new FancyColor(0.84f), 5.0f); //, new Color(0, 0, 0, 0.2f), 1); + + SirenixEditorGUI.DrawRoundRect(popupPosition.AlignBottom(32 + 12 + 8 + 6), new Color(1, 1, 1, 0.2f), 0.0f, 0.0f, 5.0f, 5.0f); + } + + popupPosition = popupPosition.Padding(12); + + Rect buttonsArea = popupPosition.TakeFromBottom(32); + + popupPosition.height -= 16; + + GUIStyle labelStyle = EditorGUIUtility.isProSkin ? SirenixGUIStyles.WhiteLabelCentered : SirenixGUIStyles.BlackLabelCentered; + + if (EditorGUIUtility.isProSkin) + { + GUI.Label(popupPosition, "No Localization Settings found in project.", labelStyle); + } + else + { + GUIHelper.PushColor(new Color(1, 1, 1, 0.75f)); + GUI.Label(popupPosition, "No Localization Settings found in project.", SirenixGUIStyles.BlackLabelCentered); + } + + if (OdinLocalizationGUI.OverlaidButton(buttonsArea.AlignCenter(120), "Create", labelStyle: labelStyle, invert: true)) + { + if (OdinLocalizationEditorSettings.CreateDefaultLocalizationSettingsAsset()) + { + this.ShowToast(ToastPosition.BottomLeft, + SdfIconType.GearWide, + "Default Localization Settings created.", + new Color(0.13f, 0.26f, 0.39f), + 8.0f); + } + } + + if (!EditorGUIUtility.isProSkin) + { + GUIHelper.PopColor(); + } + + this.Repaint(); + return; + } + + base.OnImGUI(); + } + + protected override OdinMenuTree BuildMenuTree() + { + var tree = new OdinMenuTree + { + Config = + { + AutoHandleKeyboardNavigation = false, + DrawSearchToolbar = true + }, + DefaultMenuStyle = + { + Height = 28, + AlignTriangleLeft = true, + TrianglePadding = 0.0f + } + }; + + this.MenuBackgroundColor = OdinLocalizationGUI.MenuBackground; + + if (LocalizationEditorSettings.ActiveLocalizationSettings == null) + { + return tree; + } + + var createMenu = new OdinLocalizationCreateTableMenu(); + + tree.Add("Create Table", createMenu, SdfIconType.Plus); + tree.Add("User Config", OdinLocalizationConfig.Instance, SdfIconType.GearFill); + +#if true + tree.Selection.SelectionChanged += type => + { + switch (type) + { + case SelectionChangedType.ItemAdded: + if (this.lastSelection != null) + { + switch (this.lastSelection) + { + case OdinAssetTableCollectionEditor assetCollection: + { + assetCollection.DetachEvents(); + break; + } + + case OdinStringTableCollectionEditor stringCollection: + { + stringCollection.DetachEvents(); + break; + } + } + + this.State.MetadataTree?.Dispose(); + this.State.MetadataTree = null; + } + + switch (tree.Selection.SelectedValue) + { + case OdinAssetTableCollectionEditor assetCollection: + { + assetCollection.OnSelectInWindow(); + + if (assetCollection.SelectionType == OdinTableSelectionType.TableEntry && this.State.CurrentTopTab == RightMenuTopTabs.Metadata) + { + assetCollection.UpdateMetadataViewForEntry(assetCollection.CurrentSelectedEntry); + } + + break; + } + + case OdinStringTableCollectionEditor stringCollection: + { + stringCollection.OnSelectInWindow(); + + if (stringCollection.SelectionType == OdinTableSelectionType.TableEntry && this.State.CurrentTopTab == RightMenuTopTabs.Metadata) + { + stringCollection.UpdateMetadataViewForEntry(stringCollection.CurrentSelectedEntry); + } + + break; + } + + case OdinLocalizationCreateTableMenu createTableMenu: + createTableMenu.Locales.Clear(); + + foreach (Locale locale in LocalizationEditorSettings.GetLocales()) + { + createTableMenu.Locales.Add(new OdinLocalizationCreateTableMenu.LocaleItem {Locale = locale, Enabled = true}); + } + + break; + } + + this.lastSelection = this.MenuTree.Selection.SelectedValue; + + break; + } + }; +#endif + + string[] collectionGUIDs = AssetDatabase.FindAssets($"t:{nameof(LocalizationTableCollection)}"); + + for (var i = 0; i < collectionGUIDs.Length; i++) + { + string assetPath = AssetDatabase.GUIDToAssetPath(collectionGUIDs[i]); + + var collection = AssetDatabase.LoadAssetAtPath(assetPath); + + AssetTableCollection assetTableCollection = LocalizationEditorSettings.GetAssetTableCollection(collection.TableCollectionNameReference); + + if (assetTableCollection != null) + { + var guiCollection = new OdinAssetTableCollectionEditor(assetTableCollection, this, this.State); + + assetPath = assetPath.Replace(".asset", string.Empty); + + if (assetPath.StartsWith("Assets/")) + { + assetPath = assetPath.Remove(0, "Assets/".Length); + } + + tree.Add(assetPath, guiCollection, SdfIconType.Table); + + continue; + } + + StringTableCollection stringTableCollection = LocalizationEditorSettings.GetStringTableCollection(collection.TableCollectionNameReference); + + if (stringTableCollection != null) + { + var guiCollection = new OdinStringTableCollectionEditor(stringTableCollection, this, this.State); + + assetPath = assetPath.Replace(".asset", string.Empty); + + if (assetPath.StartsWith("Assets/")) + { + assetPath = assetPath.Remove(0, "Assets/".Length); + } + + tree.Add(assetPath, guiCollection, SdfIconType.LayoutTextWindow); + + continue; + } + } + + foreach (OdinMenuItem treeMenuItem in tree.EnumerateTree()) + { + if (treeMenuItem.Value != null) + { + if (treeMenuItem.Value is OdinAssetTableCollectionEditor assetEditor) + { + treeMenuItem.Name = assetEditor.Collection.SharedData.TableCollectionName; + + assetEditor.MenuItem = treeMenuItem; + + treeMenuItem.OnDrawItem += item => + { + if (Event.current.OnMouseDown(item.Rect, 0, false)) + { + if (Event.current.clickCount > 1) + { + EditorGUIUtility.PingObject(assetEditor.Collection); + } + } + }; + + continue; + } + + if (treeMenuItem.Value is OdinStringTableCollectionEditor stringEditor) + { + treeMenuItem.Name = stringEditor.Collection.SharedData.TableCollectionName; + + stringEditor.MenuItem = treeMenuItem; + + treeMenuItem.OnDrawItem += item => + { + if (Event.current.OnMouseDown(item.Rect, 0, false)) + { + if (Event.current.clickCount > 1) + { + EditorGUIUtility.PingObject(stringEditor.Collection); + } + } + }; + + continue; + } + + continue; + } + + treeMenuItem.Value = createMenu; + + treeMenuItem.SdfIcon = SdfIconType.FolderFill; + + treeMenuItem.OnDrawItem += item => + { + Rect addTableRect = item.Rect.AlignRight(20).SubX(14); + + bool isMouseOver = Event.current.IsMouseOver(addTableRect); + + if (EditorGUIUtility.isProSkin) + { + SdfIcons.DrawIcon(addTableRect.AlignCenter(16, 16), + SdfIconType.Plus, + isMouseOver ? new Color(1, 1, 1, 0.8f) : new Color(1, 1, 1, 0.4f)); + } + else + { + SdfIcons.DrawIcon(addTableRect.AlignCenter(16, 16), + SdfIconType.Plus, + isMouseOver ? new Color(0, 0, 0, 0.8f) : new Color(0, 0, 0, 0.4f)); + } + + if (Event.current.OnMouseDown(item.Rect, 0, false)) + { + createMenu.Folder = treeMenuItem.GetFullPath(); + } + }; + } + + return tree; + } + + public void Dispose() + { + this.DisposeActiveCollection(); + this.State.Dispose(); + } + + private void DisposeActiveCollection() + { + if (this.MenuTree == null) + { + return; + } + + switch (this.MenuTree.Selection.SelectedValue) + { + case OdinAssetTableCollectionEditor assetCollection: + assetCollection.DetachEvents(); + break; + + case OdinStringTableCollectionEditor stringCollection: + stringCollection.DetachEvents(); + break; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs.meta new file mode 100644 index 000000000..009df3f5a --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Editor/Windows/OdinLocalizationEditorWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a7cd6c96ce4b4c2c98fae9f89eedc690 +timeCreated: 1704796865 \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime.meta new file mode 100644 index 000000000..650a9338c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2477452e56429547b05666cbaaf3502 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs new file mode 100644 index 000000000..6bdeb3c03 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +using Sirenix.Serialization; +using System.Reflection; +using UnityEngine.Localization; +using System; + +#if !ODIN_INSPECTOR_EDITOR_ONLY +[assembly: RegisterFormatter(typeof(Sirenix.OdinInspector.Modules.Localization.LocalizedStringFormatter))] +#endif + +namespace Sirenix.OdinInspector.Modules.Localization +{ + #if !ODIN_INSPECTOR_EDITOR_ONLY + public class LocalizedStringFormatter : ReflectionOrEmittedBaseFormatter + { + private static readonly FieldInfo m_LocalVariables_Field; + + static LocalizedStringFormatter() + { + m_LocalVariables_Field = typeof(LocalizedString).GetField("m_LocalVariables", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + if (m_LocalVariables_Field == null) + { + DefaultLoggers.DefaultLogger.LogError("Could not find field 'UnityEngine.LocalizedString.m_LocalVariables'" + + " - the internals of the Localization package have changed, and deserialization of Odin-serialized" + + " LocalizedString instances may be broken in some cases."); + } + } + + protected override LocalizedString GetUninitializedObject() + { + return new LocalizedString(); + } + + protected override void DeserializeImplementation(ref LocalizedString value, IDataReader reader) + { + base.DeserializeImplementation(ref value, reader); + + if (m_LocalVariables_Field != null && value != null) + { + var localVariablesList = m_LocalVariables_Field.GetValue(value); + + // This list is not allowed to be null! + if (localVariablesList == null) + { + localVariablesList = Activator.CreateInstance(m_LocalVariables_Field.FieldType); + m_LocalVariables_Field.SetValue(value, localVariablesList); + } + } + } + } + #endif +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs.meta new file mode 100644 index 000000000..f0c54924f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/LocalizedStringFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93ff93294e9339b40b68190c779d0009 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef new file mode 100644 index 000000000..661c1e804 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef @@ -0,0 +1,11 @@ +{ + "name": "Sirenix.OdinInspector.Modules.UnityLocalization", + "references": [ "Unity.Localization", "Sirenix.Serialization", "Sirenix.Serialization.Config" ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [ "Sirenix.Serialization.dll", "Sirenix.Serialization.Config.dll" ], + "defineConstraints": [ "!ODIN_INSPECTOR_EDITOR_ONLY" ] +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef.meta new file mode 100644 index 000000000..953108842 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 09320d9ddd505f84d9a6e5203cf75192 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt new file mode 100644 index 000000000..71f575a0c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt @@ -0,0 +1,62 @@ +ManifestVersion: 1 +ModuleID: Unity.Localization +ModuleVersion: 2.0.0.2 +ModuleFiles: + Editor.meta + Runtime.meta + Editor/Configs.meta + Editor/GUI.meta + Editor/Internal.meta + Editor/LocalizationSupport.cs + Editor/LocalizationSupport.cs.meta + Editor/OdinLocalizationConstants.cs + Editor/OdinLocalizationConstants.cs.meta + Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef + Editor/Sirenix.OdinInspector.Modules.UnityLocalization.Editor.asmdef.meta + Editor/Windows.meta + Editor/Configs/OdinLocalizationConfig.asset + Editor/Configs/OdinLocalizationConfig.asset.meta + Editor/Configs/OdinLocalizationConfig.cs + Editor/Configs/OdinLocalizationConfig.cs.meta + Editor/GUI/LocalizationMetadata.cs + Editor/GUI/LocalizationMetadata.cs.meta + Editor/GUI/OdinAssetTableCollectionEditor.cs + Editor/GUI/OdinAssetTableCollectionEditor.cs.meta + Editor/GUI/OdinGUITable.cs + Editor/GUI/OdinGUITable.cs.meta + Editor/GUI/OdinGUITableCollection.cs + Editor/GUI/OdinGUITableCollection.cs.meta + Editor/GUI/OdinSharedEntryCollection.cs + Editor/GUI/OdinSharedEntryCollection.cs.meta + Editor/GUI/OdinStringTableCollectionEditor.cs + Editor/GUI/OdinStringTableCollectionEditor.cs.meta + Editor/GUI/OdinTableCollectionEditor.cs + Editor/GUI/OdinTableCollectionEditor.cs.meta + Editor/GUI/OdinTemplateMetadata.cs + Editor/GUI/OdinTemplateMetadata.cs.meta + Editor/GUI/Toggle.cs + Editor/GUI/Toggle.cs.meta + Editor/Internal/OdinLocalizationAssetCache.cs + Editor/Internal/OdinLocalizationAssetCache.cs.meta + Editor/Internal/OdinLocalizationEditorSettings.cs + Editor/Internal/OdinLocalizationEditorSettings.cs.meta + Editor/Internal/OdinLocalizationEvents.cs + Editor/Internal/OdinLocalizationEvents.cs.meta + Editor/Internal/OdinLocalizationGUI.cs + Editor/Internal/OdinLocalizationGUI.cs.meta + Editor/Internal/OdinLocalizationGUITextures.cs + Editor/Internal/OdinLocalizationGUITextures.cs.meta + Editor/Internal/OdinLocalizationMetadataRegistry.cs + Editor/Internal/OdinLocalizationMetadataRegistry.cs.meta + Editor/Internal/OdinLocalizationReflectionValidator.cs + Editor/Internal/OdinLocalizationReflectionValidator.cs.meta + Editor/Internal/OdinLocalizationReflectionValues.cs + Editor/Internal/OdinLocalizationReflectionValues.cs.meta + Editor/Internal/OdinLocalizationSyntaxHighlighter.cs + Editor/Internal/OdinLocalizationSyntaxHighlighter.cs.meta + Editor/Windows/OdinLocalizationEditorWindow.cs + Editor/Windows/OdinLocalizationEditorWindow.cs.meta + Runtime/LocalizedStringFormatter.cs + Runtime/LocalizedStringFormatter.cs.meta + Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef + Runtime/Sirenix.OdinInspector.Modules.UnityLocalization.asmdef.meta diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt.meta new file mode 100644 index 000000000..ee510fec7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization/manifest.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dc96f962541a9024e9bb1192bdb086dd +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Excel/CardDataTable.xlsx b/Assets/Resources/Excel/CardDataTable.xlsx index 7c701819ea0a2173354f3f62186cd86f6576475c..5549b3f3e21951aa05a3b9e531a35e391a1dfe5d 100644 GIT binary patch delta 5364 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 diff --git a/Assets/Resources/JSON/CardDataTable.json b/Assets/Resources/JSON/CardDataTable.json index f58163b2d..9ceeaf0ef 100644 --- a/Assets/Resources/JSON/CardDataTable.json +++ b/Assets/Resources/JSON/CardDataTable.json @@ -1,7 +1,7 @@ [ { "Idx": "HeartSlotPlus", - "ScriptText": "하트 한칸 추가", + "ScriptText": "하트 한칸을 추가합니다.", "Max": 3, "Ratio": 5, "Type": 0, @@ -10,7 +10,7 @@ }, { "Idx": "HeartRecovery", - "ScriptText": "하트 한칸 회복", + "ScriptText": "하트 한칸을 회복합니다.", "Max": 10, "Ratio": 0, "Type": 0, @@ -19,7 +19,7 @@ }, { "Idx": "FullHeartRecovery", - "ScriptText": "하트 전체 회복", + "ScriptText": "하트 전체를 회복합니다.", "Max": 0, "Ratio": 5, "Type": 0, @@ -28,7 +28,7 @@ }, { "Idx": "AddLiquidB", - "ScriptText": "B 술을 4000ml 추가", + "ScriptText": "B술 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -37,7 +37,7 @@ }, { "Idx": "AddLiquidC", - "ScriptText": "C 술을 4000ml 추가", + "ScriptText": "C술 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -46,7 +46,7 @@ }, { "Idx": "AddLiquidD", - "ScriptText": "D 술을 4000ml 추가", + "ScriptText": "D술 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -55,7 +55,7 @@ }, { "Idx": "AddLiquidE", - "ScriptText": "E 술을 4000ml 추가", + "ScriptText": "E술 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -64,7 +64,7 @@ }, { "Idx": "AddGarnish1", - "ScriptText": "1번 가니쉬를 4000ml 추가", + "ScriptText": "1번 가니쉬 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -73,7 +73,7 @@ }, { "Idx": "AddGarnish2", - "ScriptText": "2번 가니쉬를 4000ml 추가", + "ScriptText": "2번 가니쉬 재료를 4000ml 추가합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -82,7 +82,7 @@ }, { "Idx": "AllLiquidAdd", - "ScriptText": "전체 재료 1000ml 추가", + "ScriptText": "모든 술 재료 1000ml 추가합니다.", "Max": 0, "Ratio": 5, "Type": 0, @@ -91,7 +91,7 @@ }, { "Idx": "ServerNpcAdd", - "ScriptText": "서빙 종업원 추가", + "ScriptText": "서빙 종업원을 추가합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -100,7 +100,7 @@ }, { "Idx": "CleanerNpcAdd", - "ScriptText": "청소 종업원 추가", + "ScriptText": "청소 종업원을 추가합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -109,7 +109,7 @@ }, { "Idx": "BartenderNpcAdd", - "ScriptText": "바텐터 종업원 추가", + "ScriptText": "바텐터 종업원을 추가합니다.", "Max": 6, "Ratio": 5, "Type": 0, @@ -118,7 +118,7 @@ }, { "Idx": "SpeedBoost", - "ScriptText": "플레이어 이동 속도 10% 증가", + "ScriptText": "플레이어의 이동속도가 10% 증가합니다.", "Max": 10, "Ratio": 5, "Type": 0, @@ -127,7 +127,7 @@ }, { "Idx": "ExpBoost", - "ScriptText": "경험치 획득 20% 증가", + "ScriptText": "경험치 획득량이 20% 증가합니다.", "Max": 10, "Ratio": 4, "Type": 0, @@ -136,7 +136,7 @@ }, { "Idx": "GoldBoost", - "ScriptText": "골드 획득 20% 증가", + "ScriptText": "골드 획득 20%이 증가합니다.", "Max": 10, "Ratio": 4, "Type": 0, @@ -145,7 +145,7 @@ }, { "Idx": "AllCleanUp", - "ScriptText": "레스토랑 한번에 청소", + "ScriptText": "레스토랑을 전부 청소합니다.", "Max": 0, "Ratio": 4, "Type": 0, @@ -154,7 +154,7 @@ }, { "Idx": "GaugeReset", - "ScriptText": "모든 손님들의 기다림 초기화", + "ScriptText": "모든 손님들의 기다림 게이지를 초기화합니다.", "Max": 0, "Ratio": 0, "Type": 0, @@ -163,7 +163,7 @@ }, { "Idx": "DashCooldownReduction", - "ScriptText": "대시 쿨타임 감소", + "ScriptText": "플레이어의 대시 쿨타임이 1초 감소합니다.", "Max": 5, "Ratio": 4, "Type": 0, @@ -172,7 +172,7 @@ }, { "Idx": "TipBoost", - "ScriptText": "팁 획득량 20% 증가", + "ScriptText": "팁 획득량이 20% 증가합니다.", "Max": 5, "Ratio": 4, "Type": 0, @@ -181,7 +181,7 @@ }, { "Idx": "EndGoldBoost", - "ScriptText": "게임 오버 후 획득 골드 10% 증가", + "ScriptText": "게임오버 후 획득 골드량이 10% 증가합니다.", "Max": 10, "Ratio": 4, "Type": 0, @@ -190,7 +190,7 @@ }, { "Idx": "AllCustomerPurification", - "ScriptText": "손님들 전부 정화", + "ScriptText": "손님들을 전부 정화시킵니다.", "Max": 0, "Ratio": 4, "Type": 0, @@ -199,7 +199,7 @@ }, { "Idx": "GaugeTimeUp", - "ScriptText": "손님들의 기다림 시간 3초 증가", + "ScriptText": "손님들의 기다림 시간이 3초 증가합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -208,7 +208,7 @@ }, { "Idx": "BarrelAutoSupply", - "ScriptText": "모든 술 재료 자동 충천 (1초에 N리터)", + "ScriptText": "모든 술 재료를 초당 2ml 추가로 자동 충전합니다.", "Max": 10, "Ratio": 5, "Type": 0, @@ -217,7 +217,7 @@ }, { "Idx": "ServerNpcUpgrade", - "ScriptText": "서빙 종업원 업그레이드 (팁 획득 비율 증가)", + "ScriptText": "종업원이 서빙 중 팁 획득량이 20% 증가합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -226,7 +226,7 @@ }, { "Idx": "CleanerNpcUpgrade", - "ScriptText": "청소 종업원 업그레이드 (청소 속도 증가)", + "ScriptText": "종업원의 청소 시간이 1초 감소합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -235,7 +235,7 @@ }, { "Idx": "BartenderNpcUpgrade", - "ScriptText": "바텐터 종업원 업그레이드 (술 제조 속도 증가)", + "ScriptText": "종업원의 술 제조 속도가 1초 감소합니다.", "Max": 5, "Ratio": 5, "Type": 0, @@ -243,8 +243,8 @@ "Price": 300 }, { - "Idx": "DoubleServing", - "ScriptText": "플레이어가 양손에 서빙 가능", + "Idx": "PassiveDoubleServing", + "ScriptText": "플레이어가 양손에 서빙이 가능해집니다.", "Max": 1, "Ratio": 2, "Type": 1, @@ -252,8 +252,8 @@ "Price": 1000 }, { - "Idx": "RandomChange", - "ScriptText": "휴지통을 랜덤 제조통으로 변경", + "Idx": "PassiveRandomChange", + "ScriptText": "특정 휴지통에서 완성된 칵테일 중 랜덤으로 변경 가능해집니다.", "Max": 1, "Ratio": 2, "Type": 1, @@ -261,8 +261,8 @@ "Price": 1000 }, { - "Idx": "GoldAutoGain", - "ScriptText": "자동으로 60초마다 돈통의 골드 회수", + "Idx": "PassiveGoldAutoGain", + "ScriptText": "자동으로 60초마다 계산대의 골드를 회수합니다.", "Max": 1, "Ratio": 2, "Type": 1, @@ -271,7 +271,7 @@ }, { "Idx": "PassiveMakingBonus", - "ScriptText": "술 제조 성공 시 골드 추가 획득", + "ScriptText": "플레이어가 술 제조 성공 시 팁 획득량만큼 추가로 골드를 획득합니다.", "Max": 1, "Ratio": 2, "Type": 1, @@ -280,7 +280,7 @@ }, { "Idx": "PassiveServingBonus", - "ScriptText": "서빙 3번 성공 시 하트 반개 회복", + "ScriptText": "플레이어가 서빙을 3번 성공할 때마다 하트를 반 개 회복합니다.", "Max": 1, "Ratio": 2, "Type": 1, @@ -289,7 +289,7 @@ }, { "Idx": "PassiveCleaningBonus", - "ScriptText": "청소 5번 성공 시 바텐더 제조 속도 증가", + "ScriptText": "플레이어가 청소를 5번 성공할 때마다 새로 제작되는 종업원의 술 제조 속도를 10초간 2배로 증가합니다.", "Max": 1, "Ratio": 2, "Type": 1, diff --git a/Packages/manifest.json b/Packages/manifest.json index 46054476f..cdc188c3d 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -13,6 +13,7 @@ "com.unity.feature.development": "1.0.2", "com.unity.feature.worldbuilding": "1.0.1", "com.unity.inputsystem": "1.9.0", + "com.unity.localization": "1.5.3", "com.unity.nuget.newtonsoft-json": "3.2.1", "com.unity.postprocessing": "3.4.0", "com.unity.recorder": "5.1.1", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index de5964ddd..88b1d53d9 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -199,6 +199,21 @@ }, "url": "https://packages.unity.com" }, + "com.unity.addressables": { + "version": "2.2.2", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.profiling.core": "1.0.2", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.scriptablebuildpipeline": "2.1.4", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.bindings.openimageio": { "version": "1.0.0", "depth": 1, @@ -336,6 +351,16 @@ }, "url": "https://packages.unity.com" }, + "com.unity.localization": { + "version": "1.5.3", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.addressables": "1.22.2", + "com.unity.nuget.newtonsoft-json": "3.0.2" + }, + "url": "https://packages.unity.com" + }, "com.unity.mathematics": { "version": "1.3.2", "depth": 2, @@ -394,6 +419,13 @@ }, "url": "https://packages.unity.com" }, + "com.unity.profiling.core": { + "version": "1.0.2", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.recorder": { "version": "5.1.1", "depth": 0, @@ -448,6 +480,13 @@ "com.unity.modules.terrain": "1.0.0" } }, + "com.unity.scriptablebuildpipeline": { + "version": "2.1.4", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.searcher": { "version": "4.9.2", "depth": 2, diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 0844088fb..e66e1f503 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -12,6 +12,8 @@ EditorBuildSettings: path: Assets/01.Scenes/01.Tycoon.unity guid: b2b07a151b44ee849a1d12d9dc5bc87a m_configObjects: + com.unity.addressableassets: {fileID: 11400000, guid: f03eb8afe743ba2408eba2f226d4915f, type: 2} com.unity.input.settings: {fileID: 11400000, guid: c779df660591ce64c983341df1e4c85c, type: 2} com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 4ed6540e2f7ce234888adf8deff1f241, type: 3} + com.unity.localization.settings: {fileID: 11400000, guid: 112e4950c7d9b7a429feb9bb058a93a7, type: 2} m_UseUCBPForAssetBundles: 0