├── GitAssets ├── r3.png ├── menu.png ├── editor.png ├── sheet1.png ├── sheetid.png ├── webapp1.png ├── webapp2.png ├── webapp3.png ├── webapp4.png ├── webapp5.png ├── sheetid1.png ├── asset_ref1.png ├── asset_ref2.png ├── editorapikey.png ├── login_done.png ├── nested_sheet.png ├── sheet_fields.png ├── typeconvert1.png ├── editorapikey2.png ├── json_support1.png ├── json_support2.png ├── install_package.png ├── nested_table_field.png ├── create_spreadsheet_asset.png ├── spreadsheet_asset_creation.gif ├── Import Characters from Spreadsheets1.gif ├── asset_ref1.png.meta ├── asset_ref2.png.meta ├── json_support1.png.meta ├── json_support2.png.meta ├── nested_sheet.png.meta ├── sheet_fields.png.meta ├── nested_table_field.png.meta ├── editor.png.meta ├── menu.png.meta ├── sheet1.png.meta ├── sheetid.png.meta ├── sheetid1.png.meta ├── editorapikey.png.meta ├── editorapikey2.png.meta ├── spreadsheet_asset_creation.gif.meta ├── r3.png.meta ├── login_done.png.meta ├── webapp1.png.meta ├── webapp2.png.meta ├── webapp3.png.meta ├── webapp4.png.meta ├── webapp5.png.meta ├── install_package.png.meta ├── typeconvert1.png.meta ├── create_spreadsheet_asset.png.meta └── Import Characters from Spreadsheets1.gif.meta ├── Editor ├── SheetsImporter │ ├── SheetId.cs.meta │ ├── CoProcessors.meta │ ├── ImportAction.cs.meta │ ├── SheetData.cs.meta │ ├── SheetValue.cs.meta │ ├── SyncValue.cs.meta │ ├── GetRequestData.cs.meta │ ├── MajorDimension.cs.meta │ ├── SheetLineData.cs.meta │ ├── SheetSliceData.cs.meta │ ├── SheetSyncItem.cs.meta │ ├── SheetSyncScheme.cs.meta │ ├── SheetValueInfo.cs.meta │ ├── SpreadsheetData.cs.meta │ ├── SyncValueType.cs.meta │ ├── Abstract │ │ ├── IStartable.cs.meta │ │ ├── IAssetsProvider.cs.meta │ │ ├── ISheetLocation.cs.meta │ │ ├── ISpreadsheetData.cs.meta │ │ ├── IAssetNameFormatter.cs.meta │ │ ├── ISpreadsheetProcessor.cs.meta │ │ ├── IAssetSheetDataProcessor.cs.meta │ │ ├── IGoogleSpreadsheetClient.cs.meta │ │ ├── ISpreadsheetAssetsExporter.cs.meta │ │ ├── ISpreadsheetAssetsImporter.cs.meta │ │ ├── ISpreadsheetAssetsProcessor.cs.meta │ │ ├── IGooglsSpreadsheetClientStatus.cs.meta │ │ ├── ISpreadsheetTriggerAssetsHandler.cs.meta │ │ ├── IStartable.cs │ │ ├── IAssetNameFormatter.cs │ │ ├── IGooglsSpreadsheetClientStatus.cs │ │ ├── ISheetLocation.cs │ │ ├── ISpreadsheetProcessor.cs │ │ ├── IAssetsProvider.cs │ │ ├── ISpreadsheetAssetsImporter.cs │ │ ├── ISpreadsheetAssetsExporter.cs │ │ ├── ISpreadsheetTriggerAssetsHandler.cs │ │ ├── ISpreadsheetData.cs │ │ ├── ISpreadsheetAssetsProcessor.cs │ │ ├── IGoogleSpreadsheetClient.cs │ │ └── IAssetSheetDataProcessor.cs │ ├── CoProcessors │ │ ├── Abstract.meta │ │ ├── CoProcessor.cs.meta │ │ ├── NestedTableCoProcessor.cs.meta │ │ ├── Abstract │ │ │ ├── ICoProcessorHandle.cs.meta │ │ │ └── ICoProcessorHandle.cs │ │ ├── CoProcessor.cs │ │ └── NestedTableCoProcessor.cs │ ├── SpreadsheetClientData.cs.meta │ ├── SpreadsheetHandler.cs.meta │ ├── SyncSpreadsheetValue.cs.meta │ ├── AssetSheetDataProcessor.cs.meta │ ├── BaseSpreadsheetProcessor.cs.meta │ ├── GoogleSpreadsheetClient.cs.meta │ ├── GoogleSpreadsheetSettings.cs.meta │ ├── Importers │ │ ├── PipelineImporter.cs.meta │ │ ├── SpreadsheetImporter.cs.meta │ │ ├── SpreadsheetProcessorValue.cs.meta │ │ ├── Serializable │ │ │ ├── SheetImporterAsset.cs.meta │ │ │ ├── AssetsWithAttributesImporter.cs.meta │ │ │ ├── AssetFolderByMonoScriptImporter.cs.meta │ │ │ ├── SpreadsheetSerializableImporter.cs.meta │ │ │ ├── AssetFolderByMonoScriptImporter.cs │ │ │ ├── FolderAssetsImporter.cs.meta │ │ │ ├── SpreadsheetSerializableImporter.cs │ │ │ ├── SheetImporterAsset.cs │ │ │ └── AssetsWithAttributesImporter.cs │ │ ├── Serializable.meta │ │ ├── SpreadsheetAssetsFolderImporter.cs.meta │ │ ├── SpreadsheetProcessorValue.cs │ │ ├── SpreadsheetAssetsFolderImporter.cs │ │ ├── SpreadsheetImporter.cs │ │ └── PipelineImporter.cs │ ├── SheetSyncSchemaProcessor.cs.meta │ ├── Extensions │ │ ├── SpreadsheetExtensions.cs.meta │ │ ├── SheetSyncSchemaExtension.cs.meta │ │ └── SheetSyncSchemaExtension.cs │ ├── GoogleSpreadsheetClientStatus.cs.meta │ ├── GoogleSpreadsheetEditorAsset.cs.meta │ ├── MajorDimension.cs │ ├── Abstract.meta │ ├── Extensions.meta │ ├── Importers.meta │ ├── SyncValueType.cs │ ├── ImportAction.cs │ ├── SheetId.cs │ ├── SpreadSheetInfo.cs.meta │ ├── GoogleSpreadsheetConnection.cs.meta │ ├── GoogleSpreadsheetImporter.cs.meta │ ├── GoogleSheetImporterEditorConstants.cs.meta │ ├── SerializableSpreadsheetProcessor.cs.meta │ ├── GetRequestData.cs │ ├── SpreadsheetClientData.cs │ ├── GoogleSheetImporterEditorConstants.cs │ ├── SheetSyncItem.cs │ ├── SheetValueInfo.cs │ ├── SheetValue.cs │ ├── GoogleSpreadsheetClientStatus.cs │ ├── SheetLineData.cs │ ├── SheetSliceData.cs │ ├── SyncSpreadsheetValue.cs │ ├── SpreadsheetData.cs │ ├── SpreadSheetInfo.cs │ ├── SheetSyncScheme.cs │ ├── SyncValue.cs │ ├── GoogleSpreadsheetEditorAsset.cs │ ├── GoogleSpreadsheetSettings.cs │ ├── BaseSpreadsheetProcessor.cs │ ├── SerializableSpreadsheetProcessor.cs │ └── SpreadsheetHandler.cs ├── EditorWindow │ ├── SheetCellView.cs.meta │ ├── SpreadsheetSheetView.cs.meta │ ├── GoogleImportersCommonOperations.cs.meta │ ├── GoogleSheetImporterEditorWindow.cs.meta │ ├── GoogleSpreadSheetViewWindow.cs.meta │ ├── SheetCellView.cs │ ├── GoogleSpreadSheetViewWindow.cs │ ├── SpreadsheetSheetView.cs │ ├── GoogleImportersCommonOperations.cs │ └── GoogleSheetImporterEditorWindow.cs ├── Assets.meta ├── Assets │ ├── credentials.json.meta │ ├── CoProcessor.asset.meta │ ├── SpreadsheetFolderImporter.asset.meta │ ├── GoogleSpreadSheet Settings.asset.meta │ ├── GoogleSpreadsheetImporter.asset.meta │ ├── credentials.json │ ├── CoProcessor.asset │ ├── GoogleSpreadSheet Settings.asset │ ├── SpreadsheetFolderImporter.asset │ └── GoogleSpreadsheetImporter.asset ├── EditorWindow.meta ├── SheetsImporter.meta ├── unigame.google.sheetsimporter.editor.asmdef.meta └── unigame.google.sheetsimporter.editor.asmdef ├── Runtime ├── Attributes │ ├── ISpreadsheetDescription.cs.meta │ ├── SpreadsheetIgnoreAttribute.cs.meta │ ├── SpreadsheetIgnoreAttribute.cs │ ├── ISpreadsheetDescription.cs │ ├── SpreadsheetTargetAttribute.cs.meta │ ├── SpreadsheetValueAttribute.cs.meta │ ├── SpreadsheetValueAttribute.cs │ └── SpreadsheetTargetAttribute.cs ├── Attributes.meta ├── unigame.google.sheetsimporter.runtime.asmdef.meta ├── GoogleSpreadsheetConstants.cs.meta ├── GoogleSpreadsheetConstants.cs └── unigame.google.sheetsimporter.runtime.asmdef ├── LICENSE.meta ├── README.md.meta ├── package.json.meta ├── Editor.meta ├── GitAssets.meta ├── Runtime.meta ├── package.json └── LICENSE /GitAssets/r3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/r3.png -------------------------------------------------------------------------------- /GitAssets/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/menu.png -------------------------------------------------------------------------------- /GitAssets/editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/editor.png -------------------------------------------------------------------------------- /GitAssets/sheet1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/sheet1.png -------------------------------------------------------------------------------- /GitAssets/sheetid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/sheetid.png -------------------------------------------------------------------------------- /GitAssets/webapp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/webapp1.png -------------------------------------------------------------------------------- /GitAssets/webapp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/webapp2.png -------------------------------------------------------------------------------- /GitAssets/webapp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/webapp3.png -------------------------------------------------------------------------------- /GitAssets/webapp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/webapp4.png -------------------------------------------------------------------------------- /GitAssets/webapp5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/webapp5.png -------------------------------------------------------------------------------- /GitAssets/sheetid1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/sheetid1.png -------------------------------------------------------------------------------- /GitAssets/asset_ref1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/asset_ref1.png -------------------------------------------------------------------------------- /GitAssets/asset_ref2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/asset_ref2.png -------------------------------------------------------------------------------- /GitAssets/editorapikey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/editorapikey.png -------------------------------------------------------------------------------- /GitAssets/login_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/login_done.png -------------------------------------------------------------------------------- /GitAssets/nested_sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/nested_sheet.png -------------------------------------------------------------------------------- /GitAssets/sheet_fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/sheet_fields.png -------------------------------------------------------------------------------- /GitAssets/typeconvert1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/typeconvert1.png -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetId.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f34be0d15e484dfe92ee75ac393addb3 3 | timeCreated: 1596449396 -------------------------------------------------------------------------------- /GitAssets/editorapikey2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/editorapikey2.png -------------------------------------------------------------------------------- /GitAssets/json_support1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/json_support1.png -------------------------------------------------------------------------------- /GitAssets/json_support2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/json_support2.png -------------------------------------------------------------------------------- /Editor/EditorWindow/SheetCellView.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0f618f3750474ed5b77192c1f14095ac 3 | timeCreated: 1596406744 -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 74fa78b78b604d828e859d1d7b497531 3 | timeCreated: 1603878385 -------------------------------------------------------------------------------- /Editor/SheetsImporter/ImportAction.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 71c52b2540e84cb39cb669a049f3f025 3 | timeCreated: 1603963318 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4044812febd54f14b075f8c77c625dd3 3 | timeCreated: 1596376198 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetValue.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 96523410f6e247c392d5c88b5b36863e 3 | timeCreated: 1596376171 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncValue.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 894f0c0b28a94a36a59b62a5b2912cb2 3 | timeCreated: 1596319715 -------------------------------------------------------------------------------- /GitAssets/install_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/install_package.png -------------------------------------------------------------------------------- /Editor/SheetsImporter/GetRequestData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d8febf4b1b7a45d2b2076217c1d03c3e 3 | timeCreated: 1634291906 -------------------------------------------------------------------------------- /Editor/SheetsImporter/MajorDimension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b89450980ad44b0ba8927954358ecb8b 3 | timeCreated: 1596368298 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetLineData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf0cf848f4404d3fb8dfcc20bf023510 3 | timeCreated: 1596369835 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSliceData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2e7490a335b6428b9d9436aa61dcb83a 3 | timeCreated: 1596376179 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSyncItem.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e4fc84ce71ff40aa80bfeefc854b8c4b 3 | timeCreated: 1596376961 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSyncScheme.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9974397300d403b93cec95917286c1c 3 | timeCreated: 1596319722 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetValueInfo.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 48c19b73d0f04fa788a19c15b36787ca 3 | timeCreated: 1597921571 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 53b3882c618240f0be411293ab662e7d 3 | timeCreated: 1596460201 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncValueType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eefbcee635e543f7866d7937aac60b55 3 | timeCreated: 1727532444 -------------------------------------------------------------------------------- /GitAssets/nested_table_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/nested_table_field.png -------------------------------------------------------------------------------- /Editor/EditorWindow/SpreadsheetSheetView.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 18e9acaac3df49e6be8f4bb9b29e9942 3 | timeCreated: 1596380627 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IStartable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2be5ef5933bc4ac7813a9e7480481c74 3 | timeCreated: 1643031904 -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/Abstract.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: aadeeb29ef0745e190d860a99a4ebac1 3 | timeCreated: 1603878665 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetClientData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a5bf457e835b41d8bed878b076e85433 3 | timeCreated: 1678722814 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetHandler.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: da87c200ac5a4622a826259e39219ba1 3 | timeCreated: 1596326411 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncSpreadsheetValue.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ee9ea00a98034e368711d119460894e8 3 | timeCreated: 1727587406 -------------------------------------------------------------------------------- /Runtime/Attributes/ISpreadsheetDescription.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c194f2c1ce034270adee4bb201762995 3 | timeCreated: 1597917862 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetsProvider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 89a5c3ccff614635a53e7fc190472e51 3 | timeCreated: 1596542331 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISheetLocation.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7aa510aaed7f4a7b95f0a9cb4c8d6ed8 3 | timeCreated: 1596819561 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b13d9b50650f428fb47c55b3aeb486d6 3 | timeCreated: 1599051406 -------------------------------------------------------------------------------- /Editor/SheetsImporter/AssetSheetDataProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e380f243e2b48c1a452fb32e2eb2214 3 | timeCreated: 1596493559 -------------------------------------------------------------------------------- /Editor/SheetsImporter/BaseSpreadsheetProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 80af688e7f37483cbaf1a054fd047814 3 | timeCreated: 1596454530 -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/CoProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 91a54cab06bc41718921ec777f97f6e3 3 | timeCreated: 1603880678 -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetClient.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ee807718bd3d4179baa9f0666266a1c4 3 | timeCreated: 1599054339 -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9d9caf0d8be54bbe8e9d496638cca598 3 | timeCreated: 1678722574 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/PipelineImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 030ff7cf5620406c8afeb5cd65dbd111 3 | timeCreated: 1678791457 -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSyncSchemaProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 48dd2a0e7ad842df91d167edb1e6cdc6 3 | timeCreated: 1597913363 -------------------------------------------------------------------------------- /GitAssets/create_spreadsheet_asset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/create_spreadsheet_asset.png -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetIgnoreAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 065f590252cc45889c95edc7b051cfbf 3 | timeCreated: 1749839347 -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleImportersCommonOperations.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8915e9bc94b04459802721c190a98492 3 | timeCreated: 1637489653 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetNameFormatter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a840903dc91f4263959f2fb92ad14302 3 | timeCreated: 1646231991 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eede7af7b5be4c8fb85582896c3657ea 3 | timeCreated: 1678791554 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Extensions/SpreadsheetExtensions.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 002ee789960647de8dc198da4eebe161 3 | timeCreated: 1596493997 -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetClientStatus.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 01476d7ae2114bb986d733e131f5e696 3 | timeCreated: 1599054741 -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetEditorAsset.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3a623d3caa564a0c9d1dddd140cf6128 3 | timeCreated: 1678734092 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f2ae40cd806745e582fa2d855669060b 3 | timeCreated: 1596714300 -------------------------------------------------------------------------------- /GitAssets/spreadsheet_asset_creation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/spreadsheet_asset_creation.gif -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetSheetDataProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e4ab25e91b5e4e8098658682ec397393 3 | timeCreated: 1597912592 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IGoogleSpreadsheetClient.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dbb5e50bbc6a44c79b7b2ffa09255334 3 | timeCreated: 1599053710 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsExporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dd55d3dd91894d019a67471fdb1f5a9b 3 | timeCreated: 1596814883 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9d4552f92f234aed8079fbaa65a9de29 3 | timeCreated: 1596453273 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35f3f421ea62433aa7a4b2919cc91fa0 3 | timeCreated: 1596453286 -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/NestedTableCoProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b56702578506445ba16c94c086b09724 3 | timeCreated: 1603878895 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Extensions/SheetSyncSchemaExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37fe95fce2b44c35b375490ec8cde355 3 | timeCreated: 1597913350 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetProcessorValue.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: df89ebb0a8c4449aba28ba0d64984733 3 | timeCreated: 1678791771 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IGooglsSpreadsheetClientStatus.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b0c2771728e04843b33e9cdfd4faa088 3 | timeCreated: 1599051961 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetTriggerAssetsHandler.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d6048f470e5b4b1490bde8a9f62f746b 3 | timeCreated: 1598445587 -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/Abstract/ICoProcessorHandle.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d7c563bc808b48a187e3d044a3cf3828 3 | timeCreated: 1603878681 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/SheetImporterAsset.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ba1ebc6d8546475da9547270396a1a9d 3 | timeCreated: 1678750173 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/AssetsWithAttributesImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dae6116b34be4066aa2700dcf243f71d 3 | timeCreated: 1596454520 -------------------------------------------------------------------------------- /GitAssets/Import Characters from Spreadsheets1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UnioGame/unigame.googlespreadsheets/HEAD/GitAssets/Import Characters from Spreadsheets1.gif -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/AssetFolderByMonoScriptImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bcead925b5484534b3299e8ca64bedf6 3 | timeCreated: 1596546691 -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/SpreadsheetSerializableImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a915c5c81e19407299a7cf352c294db4 3 | timeCreated: 1596558173 -------------------------------------------------------------------------------- /LICENSE.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a91a0e7ad5fc7094782e428a272ad827 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IStartable.cs: -------------------------------------------------------------------------------- 1 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor 2 | { 3 | public interface IStartable 4 | { 5 | void Start(); 6 | } 7 | } -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5579c9efd4df8614492128ec806edea5 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cdd75a407d09bcf4c99ad809589f4bef 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 55e7e62c849497043aa35616ccee101b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /GitAssets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ddd590290fd3f924c88e5dc23c8c2d5c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 054c409ee647bdb41a1a7036fc0ba3a6 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/Assets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5689060eb22dde34ba047eeb50c1225c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/Assets/credentials.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d3ca667ad2317774d9a631ea0eb85454 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetNameFormatter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface IAssetNameFormatter 4 | { 5 | string FormatName(string assetName); 6 | } 7 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/MajorDimension.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public enum MajorDimension 4 | { 5 | DimensionUnspecified, 6 | ROWS, 7 | COLUMNS, 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/EditorWindow.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 174fcbe974418ac49b031fb852360d2e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Runtime/Attributes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9e54a150d70b41249bbe74037051a61c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 765ef323c1c5f9f4583a309b423e33ca 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 88147b7afe8f8bd40a5113f23cff8cb5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IGooglsSpreadsheetClientStatus.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface IGooglsSpreadsheetClientStatus 4 | { 5 | bool HasConnectedSheets { get; } 6 | } 7 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISheetLocation.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface ISheetLocation 4 | { 5 | int Row { get; } 6 | int Column { get; } 7 | 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Extensions.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c3c8c57e1d71092498ba3b3255e6d957 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37f8bd3c3b9189a42ab0a339a9b5467a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c7c4c094b45a13499e28824c4d6bb7e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncValueType.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | 5 | [Serializable] 6 | public enum SyncValueType 7 | { 8 | Field, 9 | Property, 10 | } 11 | } -------------------------------------------------------------------------------- /Editor/unigame.google.sheetsimporter.editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 32bcf35e1f36eb04ea4c2e54e4681d48 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Runtime/unigame.google.sheetsimporter.runtime.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c951d0efda6aebb47b783290667d215b 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor/Assets/CoProcessor.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a0f8eb10cf681934f9c25a911b9b55ca 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/Assets/SpreadsheetFolderImporter.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cbf6f37d81cf7774b9149f8fbc6291c5 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/Assets/GoogleSpreadSheet Settings.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 02333fca37727be44a564091a2a4ec07 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/Assets/GoogleSpreadsheetImporter.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 34da9c23b678af54fa4deba1e7b743b0 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface ISpreadsheetProcessor: 4 | ISpreadsheetAssetsProcessor, 5 | ISpreadsheetTriggerAssetsHandler 6 | { 7 | 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/ImportAction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UniGame.GoogleSpreadsheets.Editor 4 | { 5 | [Flags] 6 | public enum ImportAction 7 | { 8 | Import = 1, 9 | Export = 1 << 1, 10 | All = Import | Export 11 | } 12 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetsProvider.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | public interface IAssetsProvider 7 | { 8 | List GetAssets(); 9 | } 10 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/Abstract/ICoProcessorHandle.cs: -------------------------------------------------------------------------------- 1 | using System.Data; 2 | 3 | namespace UniGame.GoogleSpreadsheets.Editor.CoProcessors.Abstract 4 | { 5 | public interface ICoProcessorHandle 6 | { 7 | void Apply(SheetValueInfo valueInfo, DataRow row); 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/AssetFolderByMonoScriptImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | 5 | [Serializable] 6 | public class AssetFolderByMonoScriptImporter : FolderAssetsImporter 7 | { 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface ISpreadsheetAssetsImporter 4 | { 5 | bool CanImport { get; } 6 | 7 | ISpreadsheetData Import(ISpreadsheetData spreadsheetData); 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsExporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | public interface ISpreadsheetAssetsExporter 4 | { 5 | bool CanExport { get; } 6 | 7 | ISpreadsheetData Export(ISpreadsheetData data); 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetIgnoreAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Runtime 2 | { 3 | using System; 4 | 5 | [AttributeUsage(AttributeTargets.Class|AttributeTargets.Field|AttributeTargets.Property)] 6 | public class SpreadsheetIgnoreAttribute: Attribute 7 | { 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /Runtime/GoogleSpreadsheetConstants.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f503506faa104654fb7dd13dac91aeb7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetId.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using Runtime; 5 | 6 | [Serializable] 7 | public class SheetId 8 | { 9 | public string sheetName = string.Empty; 10 | public string keyField = GoogleSpreadsheetConstants.KeyField; 11 | } 12 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadSheetInfo.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ff88b19d8b0146f8983bae705e8b4091 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Attributes/ISpreadsheetDescription.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Runtime 2 | { 3 | public interface ISpreadsheetDescription 4 | { 5 | bool UseTypeName { get; } 6 | string SheetName { get; } 7 | string KeyField { get; } 8 | bool SyncAllFields { get; } 9 | } 10 | } -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetTargetAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a7918c32118f9a4b8ad08f4ab5aa0c9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetValueAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1ed1e9fd2b7a13f43843a66554186cf0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleSheetImporterEditorWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2b41e704e5366f44b83cfd4106abeacb 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleSpreadSheetViewWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 47164920db7cb4e4b8e05d48a045efe7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetTriggerAssetsHandler.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using global::UniGame.Core.Runtime; 4 | 5 | public interface ISpreadsheetTriggerAssetsHandler : IResettable 6 | { 7 | void Initialize(IGoogleSpreadsheetClient client); 8 | } 9 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetConnection.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a027f604b3974354db8245ef5a623bde 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ea28a9bc51a3a6c4f946ba6f8b07a018 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSheetImporterEditorConstants.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 416c80a6aa612c94380eb04aba3e83f3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SerializableSpreadsheetProcessor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ebb2f382b03e50f44aed2f684beadc89 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/GetRequestData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UniGame.GoogleSpreadsheets.Editor 4 | { 5 | [Serializable] 6 | public class GetRequestData 7 | { 8 | public TRequest Request; 9 | public Action Result; 10 | public TValue Value; 11 | public bool isReady; 12 | } 13 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/FolderAssetsImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 530dafd38dfd22d499ee756630cc3e4d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetAssetsFolderImporter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 00fd1fef3f333d04d9c8ee89cb905e54 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetData.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System.Collections.Generic; 4 | 5 | public interface ISpreadsheetData 6 | { 7 | bool HasSheet(string sheetName); 8 | IEnumerable Sheets { get; } 9 | SheetData this[string sheetName] { get; } 10 | } 11 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetClientData.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | 5 | [Serializable] 6 | public class SpreadsheetClientData 7 | { 8 | public string user; 9 | public string credentialsPath; 10 | public string appName; 11 | public string[] scope; 12 | public float timeout = 30f; 13 | } 14 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSheetImporterEditorConstants.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using UniModules; 4 | using UniModules.Editor; 5 | 6 | public class GoogleSheetImporterEditorConstants 7 | { 8 | public static string DefaultGoogleSheetImporterPath = 9 | FileUtils.Combine(EditorPathConstants.GeneratedContentPath,"GoogleSheetImporter/Editor/"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Runtime/GoogleSpreadsheetConstants.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Runtime 2 | { 3 | public class GoogleSpreadsheetConstants 4 | { 5 | public const string ApplicationName = "UnioGame Google Sheets Importer"; 6 | public const string ScriptableAssetKey = "[UnityScriptable]"; 7 | public const string TokenKey = "token.json"; 8 | public const string KeyField = "id"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSyncItem.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using Object = UnityEngine.Object; 5 | 6 | [Serializable] 7 | public class SheetSyncItem 8 | { 9 | public string sheetId; 10 | #if ODIN_INSPECTOR 11 | [Sirenix.OdinInspector.InlineEditor] 12 | #endif 13 | public Object asset; 14 | 15 | public object target; 16 | } 17 | } -------------------------------------------------------------------------------- /Runtime/unigame.google.sheetsimporter.runtime.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unigame.google.sheets.runtime", 3 | "references": [], 4 | "includePlatforms": [], 5 | "excludePlatforms": [], 6 | "allowUnsafeCode": false, 7 | "overrideReferences": false, 8 | "precompiledReferences": [], 9 | "autoReferenced": true, 10 | "defineConstraints": [], 11 | "versionDefines": [], 12 | "noEngineReferences": false 13 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/ISpreadsheetAssetsProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using UniModules.UniGame.GoogleSpreadsheetsImporter.Editor; 4 | 5 | public interface ISpreadsheetAssetsProcessor : 6 | ISpreadsheetAssetsImporter, 7 | ISpreadsheetAssetsExporter, 8 | IStartable, 9 | IAssetNameFormatter 10 | { 11 | public string Name { get; } 12 | } 13 | } -------------------------------------------------------------------------------- /Editor/Assets/credentials.json: -------------------------------------------------------------------------------- 1 | {"installed":{"client_id":"327406434134-7hktq5bupbk3fhcgcf2vniir4l0vp69a.apps.googleusercontent.com","project_id":"unigameimporter-1596308591441","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"CxlpblXY_ixNwVs1ayrNFmnd","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}} -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetProcessorValue.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using UniGame.Common; 5 | 6 | [Serializable] 7 | public class SpreadsheetProcessorValue : VariantValue< 8 | SerializableSpreadsheetProcessor, 9 | BaseSpreadsheetProcessor, 10 | ISpreadsheetProcessor> 11 | { 12 | public const string EmptyValue = "EMPTY"; 13 | 14 | public string Name => HasValue ? Value.Name : EmptyValue; 15 | 16 | } 17 | } -------------------------------------------------------------------------------- /Editor/Assets/CoProcessor.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 91a54cab06bc41718921ec777f97f6e3, type: 3} 13 | m_Name: CoProcessor 14 | m_EditorClassIdentifier: 15 | _processors: [] 16 | references: 17 | version: 2 18 | RefIds: [] 19 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetValueInfo.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System.Collections.Generic; 4 | 5 | public class SheetValueInfo 6 | { 7 | public object Source; 8 | public SheetSyncScheme SyncScheme; 9 | public ISpreadsheetData SpreadsheetData; 10 | public string SheetName; 11 | public string SyncFieldName; 12 | public object SyncFieldValue; 13 | public HashSet IgnoreCache; 14 | public int StartColumn; 15 | } 16 | } -------------------------------------------------------------------------------- /Editor/EditorWindow/SheetCellView.cs: -------------------------------------------------------------------------------- 1 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor.EditorWindow 2 | { 3 | using System; 4 | using UnityEngine; 5 | 6 | [Serializable] 7 | public class SheetCellView : ScriptableObject 8 | { 9 | #if ODIN_INSPECTOR 10 | [Sirenix.OdinInspector.HideLabel] 11 | #endif 12 | public string value; 13 | 14 | [HideInInspector] 15 | public int row; 16 | [HideInInspector] 17 | public int column; 18 | [HideInInspector] 19 | public bool isHeader; 20 | } 21 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetAssetsFolderImporter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace UniGame.GoogleSpreadsheets.Editor 5 | { 6 | [Serializable] 7 | #if ODIN_INSPECTOR 8 | [Sirenix.OdinInspector.HideLabel] 9 | [Sirenix.OdinInspector.BoxGroup("Attributes Source")] 10 | #endif 11 | [CreateAssetMenu(menuName = "UniGame/Google/Importers/SpreadsheetFolderImporter",fileName = nameof(SpreadsheetAssetsFolderImporter))] 12 | public class SpreadsheetAssetsFolderImporter : SpreadsheetImporter 13 | { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetValue.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | 5 | public class SheetValue : ISheetLocation 6 | { 7 | public object value; 8 | public string sheetName = string.Empty; 9 | public string fieldName = string.Empty; 10 | public int row; 11 | public int column; 12 | 13 | public int Row => row; 14 | 15 | public int Column => column; 16 | 17 | public bool IsEqualField(string name) 18 | { 19 | return fieldName.Equals(name, StringComparison.OrdinalIgnoreCase); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetClientStatus.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | 6 | public class GoogleSpreadsheetClientStatus : IGooglsSpreadsheetClientStatus 7 | { 8 | private IEnumerable _connectedSheets; 9 | 10 | public GoogleSpreadsheetClientStatus(IEnumerable connectedSheets) 11 | { 12 | _connectedSheets = connectedSheets; 13 | } 14 | 15 | #region public properties 16 | 17 | public bool HasConnectedSheets => _connectedSheets.Any(x => x!=null); 18 | 19 | #endregion 20 | } 21 | } -------------------------------------------------------------------------------- /Editor/Assets/GoogleSpreadSheet Settings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 3a623d3caa564a0c9d1dddd140cf6128, type: 3} 13 | m_Name: GoogleSpreadSheet Settings 14 | m_EditorClassIdentifier: 15 | processor: {fileID: 11400000, guid: a0f8eb10cf681934f9c25a911b9b55ca, type: 2} 16 | importerAsset: {fileID: 11400000, guid: 34da9c23b678af54fa4deba1e7b743b0, type: 2} 17 | typeConverter: {fileID: 0} 18 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetLineData.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | 7 | [Serializable] 8 | public class SheetLineData 9 | { 10 | public string id = string.Empty; 11 | public List data = new(); 12 | public int index = -1; 13 | 14 | public SheetValue this[string fieldName] { 15 | get { 16 | var value = data.FirstOrDefault(x => 17 | string.Equals(x.fieldName, fieldName, StringComparison.OrdinalIgnoreCase)); 18 | return value; 19 | } 20 | } 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSliceData.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | 7 | [Serializable] 8 | public class SheetSliceData 9 | { 10 | public string sheetId = string.Empty; 11 | public string keyId = string.Empty; 12 | public string keyValue = string.Empty; 13 | public int index = -1; 14 | public List data = new(); 15 | 16 | public SheetValue this[string fieldName] { 17 | get { 18 | var value = data.FirstOrDefault(x => 19 | string.Equals(x.fieldName, fieldName, StringComparison.OrdinalIgnoreCase)); 20 | return value; 21 | } 22 | } 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncSpreadsheetValue.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using Runtime; 5 | 6 | public class SyncSpreadsheetValue : IEquatable 7 | { 8 | public Type type; 9 | public ISpreadsheetDescription spreadsheet; 10 | 11 | public bool Equals(SyncSpreadsheetValue other) 12 | { 13 | if(other == null) return false; 14 | if(type != other.type) return false; 15 | return true; 16 | } 17 | 18 | public override bool Equals(object obj) 19 | { 20 | if(obj is SyncSpreadsheetValue value) 21 | return Equals(value); 22 | return false; 23 | } 24 | 25 | public override int GetHashCode() 26 | { 27 | return type == null ? 0 : type.GetHashCode(); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetData.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | 7 | [Serializable] 8 | public class SpreadsheetData : ISpreadsheetData 9 | { 10 | private IEnumerable _sheets; 11 | 12 | public SpreadsheetData(IEnumerable sheets) 13 | { 14 | _sheets = sheets; 15 | } 16 | 17 | public bool HasSheet(string sheetName) 18 | { 19 | return _sheets.Any(x => x.Name.Trim('\'') 20 | .ToLower() 21 | .Equals(sheetName.ToLower())); 22 | } 23 | 24 | public IEnumerable Sheets => _sheets; 25 | 26 | public SheetData this[string sheetName] => _sheets 27 | .FirstOrDefault(x => x.Name.Equals(sheetName,StringComparison.OrdinalIgnoreCase)); 28 | } 29 | } -------------------------------------------------------------------------------- /Editor/Assets/SpreadsheetFolderImporter.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 00fd1fef3f333d04d9c8ee89cb905e54, type: 3} 13 | m_Name: SpreadsheetFolderImporter 14 | m_EditorClassIdentifier: 15 | importerName: 16 | importers: 17 | - importerName: 18 | _importAction: 3 19 | folder: 20 | targetAssetType: 21 | fullTypeName: UnityEngine.ScriptableObject, UnityEngine.CoreModule, Version=0.0.0.0, 22 | Culture=neutral, PublicKeyToken=null 23 | assetRegexFilter: 24 | createMissingItems: 0 25 | overrideSheetId: 0 26 | sheetId: 27 | maxItemsCount: -1 28 | assetTemplateName: 29 | assetTypeScript: {fileID: 0} 30 | -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetValueAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Runtime 2 | { 3 | using System; 4 | 5 | [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] 6 | public class SpreadsheetValueAttribute : Attribute 7 | { 8 | public string sheetField = String.Empty; 9 | public bool isKey = false; 10 | public bool useFieldName = false; 11 | 12 | /// 13 | /// Mark class field as Sheet sync value 14 | /// 15 | /// Name of Table Filed 16 | /// If true - use this field for sync items with data 17 | public SpreadsheetValueAttribute(string sheetField = "", bool isKey = false) 18 | { 19 | this.useFieldName = string.IsNullOrEmpty(sheetField); 20 | this.isKey = isKey; 21 | this.sheetField = sheetField; 22 | } 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.unigame.unityspreadsheets", 3 | "author": "UniGame", 4 | "displayName": "UniGame Google Spreadsheets to Unity", 5 | "description": "Allow to import Google Spreadsheets to Unity and write it back to Google Spreadsheets", 6 | "unity": "2023.1", 7 | "version": "2025.0.27", 8 | "keywords": [ 9 | "nodes", 10 | "spreadsheet", 11 | "sheet", 12 | "importer", 13 | "google" 14 | ], 15 | "dependencies": { 16 | "com.unigame.typeconverters" : "https://github.com/UnioGame/unigame.typeconverters.git", 17 | "com.unigame.addressablestools" : "https://github.com/UnioGame/unigame.addressables.git", 18 | "com.unigame.unicore": "https://github.com/UnioGame/unigame.core.git", 19 | "com.cysharp.unitask" : "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask", 20 | "com.unigame.google.api.v4" : "https://github.com/UnioGame/google.api.v4.git", 21 | "com.unity.nuget.newtonsoft-json": "3.0.2" 22 | } 23 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IGoogleSpreadsheetClient.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using Google.Apis.Sheets.v4; 6 | 7 | public interface IGoogleSpreadsheetClient : IDisposable 8 | { 9 | bool IsConnectionRefused { get; } 10 | 11 | bool IsConnected { get; } 12 | 13 | SheetsService SheetsService { get; } 14 | 15 | ISpreadsheetData SpreadsheetData { get; } 16 | 17 | IGooglsSpreadsheetClientStatus Status { get; } 18 | 19 | IEnumerable Sheets { get; } 20 | 21 | bool HasSheet(string id); 22 | 23 | void UploadAll(bool force = false); 24 | 25 | bool Upload(string sheetId); 26 | 27 | bool Upload(SheetData sheet); 28 | 29 | bool Connect(); 30 | 31 | bool Connect(string user,string credentialsPath); 32 | 33 | void ReloadAll(); 34 | void Reload(string id); 35 | bool ConnectToSpreadsheet(string spreadsheetId); 36 | } 37 | } -------------------------------------------------------------------------------- /Runtime/Attributes/SpreadsheetTargetAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Runtime 2 | { 3 | using System; 4 | using global::UniGame.GoogleSpreadsheets.Runtime; 5 | 6 | [AttributeUsage(AttributeTargets.Class|AttributeTargets.Field|AttributeTargets.Property)] 7 | public class SpreadsheetTargetAttribute : Attribute, ISpreadsheetDescription 8 | { 9 | private string _sheetName = string.Empty; 10 | private bool _syncAllFields = false; 11 | private string _keyField = GoogleSpreadsheetConstants.KeyField; 12 | 13 | public SpreadsheetTargetAttribute(string sheetName = "",string keyField = "",bool syncAllFields = true) 14 | { 15 | _sheetName = sheetName; 16 | _keyField = string.IsNullOrEmpty( keyField ) ? _keyField : keyField; 17 | _syncAllFields = syncAllFields; 18 | } 19 | 20 | public bool UseTypeName => string.IsNullOrEmpty(_sheetName); 21 | 22 | public string SheetName => _sheetName; 23 | 24 | public string KeyField => _keyField; 25 | 26 | public bool SyncAllFields => _syncAllFields; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadSheetInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace UniGame.GoogleSpreadsheets.Editor 5 | { 6 | #if ODIN_INSPECTOR 7 | using Sirenix.OdinInspector; 8 | #endif 9 | 10 | #if ALCHEMY_INSPECTOR 11 | using Alchemy.Inspector; 12 | #endif 13 | 14 | [Serializable] 15 | public class SpreadSheetInfo 16 | { 17 | public const string SheetKey = "sheet"; 18 | private const string spreadsheetUrl = "https://docs.google.com/spreadsheets/d/{0}"; 19 | 20 | #if ODIN_INSPECTOR 21 | [TableColumnWidth(160,Resizable = false)] 22 | #endif 23 | public string name = string.Empty; 24 | 25 | public string id = string.Empty; 26 | 27 | #if ODIN_INSPECTOR 28 | [Button] 29 | [TableColumnWidth(160,Resizable = false)] 30 | [VerticalGroup("Actions")] 31 | #endif 32 | #if ALCHEMY_INSPECTOR 33 | [Button] 34 | #endif 35 | public void Open() 36 | { 37 | if (string.IsNullOrEmpty(id)) return; 38 | Application.OpenURL(string.Format(spreadsheetUrl,id)); 39 | } 40 | 41 | } 42 | } -------------------------------------------------------------------------------- /Editor/unigame.google.sheetsimporter.editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unigame.google.sheetsimporter.editor", 3 | "rootNamespace": "", 4 | "references": [ 5 | "GUID:c951d0efda6aebb47b783290667d215b", 6 | "GUID:2796129a6c23eb84a8181f62bf7332f1", 7 | "GUID:8e4577c9194c10845984cf27eb974fd1", 8 | "GUID:18e001e7783f9fa4f91ffb0f7d0ecfc5", 9 | "GUID:aa3c0ee8c88c4d8aa46a7f02e19ed9a2", 10 | "GUID:a798b6c995887d74ea9a129f318438cb", 11 | "GUID:f51ebe6a0ceec4240a699833d6309b23", 12 | "GUID:88be65f96b86746888c927a5c8ff3534", 13 | "GUID:5fd453cd0d182422093c4a764fd5eadb" 14 | ], 15 | "includePlatforms": [ 16 | "Editor" 17 | ], 18 | "excludePlatforms": [], 19 | "allowUnsafeCode": false, 20 | "overrideReferences": false, 21 | "precompiledReferences": [], 22 | "autoReferenced": true, 23 | "defineConstraints": [], 24 | "versionDefines": [ 25 | { 26 | "name": "com.annulusgames.alchemy", 27 | "expression": "", 28 | "define": "ALCHEMY_INSPECTOR" 29 | } 30 | ], 31 | "noEngineReferences": false 32 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mikhailov Sergei 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/SpreadsheetSerializableImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | [Serializable] 7 | public abstract class SpreadsheetSerializableImporter : ISpreadsheetAssetsProcessor 8 | { 9 | public string importerName = string.Empty; 10 | 11 | public string Name => string.IsNullOrEmpty(importerName) ? GetType().Name : importerName; 12 | 13 | public abstract bool CanImport { get; } 14 | public abstract bool CanExport { get; } 15 | 16 | public abstract IEnumerable Load(); 17 | public abstract ISpreadsheetData Import(ISpreadsheetData spreadsheetData); 18 | public virtual ISpreadsheetData Export(ISpreadsheetData data) => data; 19 | 20 | public abstract ISpreadsheetData ExportObjects(ISpreadsheetData data); 21 | 22 | public abstract ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData); 23 | 24 | public virtual void Start() { } 25 | 26 | public virtual string FormatName(string assetName) => assetName; 27 | } 28 | } -------------------------------------------------------------------------------- /Editor/Assets/GoogleSpreadsheetImporter.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: ea28a9bc51a3a6c4f946ba6f8b07a018, type: 3} 13 | m_Name: GoogleSpreadsheetImporter 14 | m_EditorClassIdentifier: 15 | sheetsItemsHandler: 16 | importerName: 17 | autoReloadSpreadsheetOnImport: 1 18 | serializabledImporters: 19 | - rid: 2842495155520143388 20 | importers: [] 21 | settings: 22 | credentialsPath: 23 | user: user 24 | authTimeout: 30 25 | autoConnect: 1 26 | sheets: [] 27 | typeConverters: {fileID: 0} 28 | coProcessors: {fileID: 0} 29 | references: 30 | version: 2 31 | RefIds: 32 | - rid: 2842495155520143388 33 | type: {class: AssetsWithAttributesImporter, ns: UniGame.GoogleSpreadsheetsImporter.Editor, 34 | asm: unigame.google.sheetsimporter.editor} 35 | data: 36 | importerName: 37 | _importAction: 3 38 | assets: [] 39 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/SheetImporterAsset.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | #if ODIN_INSPECTOR 4 | using Sirenix.OdinInspector; 5 | #endif 6 | 7 | public class SheetImporterAsset : BaseSpreadsheetProcessor 8 | where TImporter : SerializableSpreadsheetProcessor 9 | { 10 | #if ODIN_INSPECTOR 11 | [InlineProperty] 12 | [HideLabel] 13 | #endif 14 | public TImporter importer; 15 | 16 | public override bool CanImport => importer.CanImport; 17 | public override bool CanExport => importer.CanExport; 18 | public override string Name => importer.Name; 19 | 20 | public override ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 21 | { 22 | return importer.ImportObjects(spreadsheetData); 23 | } 24 | 25 | public override ISpreadsheetData ExportObjects( ISpreadsheetData spreadsheetData) 26 | { 27 | return importer.ExportObjects(spreadsheetData); 28 | } 29 | 30 | public override string FormatName(string assetName) => importer.Name; 31 | 32 | protected override void OnReset() 33 | { 34 | importer.Reset(); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SheetSyncScheme.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | [Serializable] 7 | public class SheetSyncScheme 8 | { 9 | public string sheetId; 10 | public string keyField; 11 | public SyncValue keyValue; 12 | public Dictionary values = new(); 13 | 14 | public SheetSyncScheme(string sheetId) 15 | { 16 | this.sheetId = sheetId; 17 | } 18 | 19 | public SyncValue GetFieldBySheetFieldName(string fieldName) 20 | { 21 | foreach (var item in values) 22 | { 23 | if (SheetData.IsEquals(item.Value.sheetField, fieldName)) 24 | { 25 | return item.Value; 26 | } 27 | } 28 | 29 | return null; 30 | } 31 | 32 | public SyncValue GetFieldByObjectField(string fieldName) 33 | { 34 | foreach (var item in values) 35 | { 36 | if (SheetData.IsEquals(item.Value.objectField, fieldName)) 37 | { 38 | return item.Value; 39 | } 40 | } 41 | return null; 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleSpreadSheetViewWindow.cs: -------------------------------------------------------------------------------- 1 | #if ODIN_INSPECTOR 2 | 3 | 4 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor.EditorWindow 5 | { 6 | using System.Collections.Generic; 7 | using global::UniGame.GoogleSpreadsheets.Editor; 8 | using Sirenix.OdinInspector; 9 | using Sirenix.OdinInspector.Editor; 10 | 11 | public class GoogleSpreadSheetViewWindow : OdinEditorWindow 12 | { 13 | #region static data 14 | 15 | public static GoogleSpreadSheetViewWindow Open(IEnumerable sheets) 16 | { 17 | var window = GetWindow(); 18 | window.Initialize(sheets); 19 | window.Show(); 20 | return window; 21 | } 22 | 23 | #endregion 24 | 25 | #if ODIN_INSPECTOR 26 | [InlineEditor] 27 | [ListDrawerSettings(ListElementLabelName = nameof(SpreadsheetSheetView.sheetName))] 28 | #endif 29 | public List tables = new List(); 30 | 31 | public void Initialize(IEnumerable sheets) 32 | { 33 | foreach (var sheetView in tables) { 34 | if (sheetView) { 35 | DestroyImmediate(sheetView); 36 | } 37 | } 38 | 39 | tables.Clear(); 40 | 41 | foreach (var sheetData in sheets) { 42 | var view = CreateInstance(); 43 | view.Initialize(sheetData); 44 | tables.Add(view); 45 | } 46 | 47 | } 48 | 49 | } 50 | } 51 | 52 | #endif -------------------------------------------------------------------------------- /Editor/SheetsImporter/Extensions/SheetSyncSchemaExtension.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using UniGame.Runtime.Utils; 5 | 6 | public static class SheetSyncSchemaExtension 7 | { 8 | private static readonly SheetSyncSchemaProcessor _syncSchemeProcessor = new(); 9 | 10 | private static readonly MemorizeItem _syncCache = 11 | MemorizeTool.Memorize(x => _syncSchemeProcessor.CreateSyncScheme(x)); 12 | 13 | private static readonly SheetSyncScheme DummyScheme = new(string.Empty); 14 | 15 | public static bool IsInIgnoreCache(this SheetValueInfo valueInfo) 16 | { 17 | return valueInfo != null && 18 | valueInfo.Source!=null && 19 | valueInfo.IgnoreCache != null && 20 | valueInfo.IgnoreCache.Contains(valueInfo.Source); 21 | } 22 | 23 | public static bool IsInIgnoreCache(this SheetValueInfo valueInfo, object target) 24 | { 25 | return valueInfo != null && 26 | target != null && 27 | valueInfo.IgnoreCache != null && 28 | valueInfo.IgnoreCache.Contains(target); 29 | } 30 | 31 | public static SheetSyncScheme CreateSheetScheme(this Type source) 32 | { 33 | if (source == null) { 34 | return DummyScheme; 35 | } 36 | 37 | return _syncCache[source]; 38 | } 39 | 40 | public static SheetSyncScheme CreateSheetScheme(this object source) 41 | { 42 | if (source == null) { 43 | return DummyScheme; 44 | } 45 | 46 | var type = source.GetType(); 47 | return CreateSheetScheme(type); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/SpreadsheetImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | 6 | public class SpreadsheetImporter : BaseSpreadsheetProcessor 7 | where T : SerializableSpreadsheetProcessor 8 | { 9 | public List importers = new(); 10 | 11 | public override bool CanImport => importers.Any(x => x.CanImport); 12 | public override bool CanExport => importers.Any(x => x.CanExport); 13 | 14 | 15 | public override ISpreadsheetData ExportObjects(ISpreadsheetData data) 16 | { 17 | var items = importers 18 | .Where(x => x.CanExport); 19 | 20 | foreach (var importer in items) 21 | importer.Export(data); 22 | 23 | return data; 24 | } 25 | 26 | public sealed override ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 27 | { 28 | foreach (var importer in importers.Where(x=>x.CanImport)) 29 | { 30 | importer.Import(spreadsheetData); 31 | } 32 | 33 | return spreadsheetData; 34 | } 35 | 36 | 37 | protected override void OnInitialize(IGoogleSpreadsheetClient client) 38 | { 39 | base.OnInitialize(client); 40 | 41 | foreach (var importer in importers) 42 | { 43 | importer.Initialize(client); 44 | } 45 | } 46 | 47 | 48 | protected virtual IEnumerable OnPreImport(IEnumerable sourceImporters) 49 | { 50 | return sourceImporters; 51 | } 52 | 53 | protected virtual IEnumerable OnPostImport(IEnumerable importedAssets) 54 | { 55 | return importedAssets; 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /Editor/EditorWindow/SpreadsheetSheetView.cs: -------------------------------------------------------------------------------- 1 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor.EditorWindow 2 | { 3 | using global::UniGame.Utilities; 4 | using global::UniGame.GoogleSpreadsheets.Editor; 5 | using UnityEditor; 6 | using UnityEngine; 7 | 8 | public class SpreadsheetSheetView : ScriptableObject 9 | { 10 | public string sheetName; 11 | 12 | public string spreadSheetId; 13 | 14 | #if ODIN_INSPECTOR 15 | [Sirenix.OdinInspector.ShowInInspector] 16 | [Sirenix.OdinInspector.TableMatrix(ResizableColumns = true,IsReadOnly = true)] 17 | #endif 18 | public string[,] sheetValues; 19 | 20 | public void Initialize(SheetData data) 21 | { 22 | spreadSheetId = data.SpreadsheetId; 23 | sheetName = data.Name; 24 | UpdateView(data); 25 | } 26 | 27 | private static SheetCellView DrawCell(Rect rect, SheetCellView cellView) 28 | { 29 | EditorGUI.DrawRect(rect.Padding(1),cellView.isHeader ? 30 | new Color(0.4f,0.4f,0.4f) : 31 | new Color(0.0f,0.0f,0.0f)); 32 | 33 | EditorGUILayout.LabelField(cellView.value); 34 | 35 | return cellView; 36 | } 37 | 38 | private void UpdateView(SheetData data) 39 | { 40 | sheetValues = new string[data.ColumnsCount,data.RowsCount+1]; 41 | var table = data.Table; 42 | var columns = table.Columns; 43 | var rows = table.Rows; 44 | 45 | for (var i = 0; i < data.ColumnsCount; i++) { 46 | var column = columns[i]; 47 | sheetValues[i, 0] = column.ColumnName; 48 | } 49 | 50 | for (var i = 0; i < data.ColumnsCount; i++) { 51 | for (var j = 0; j < data.RowsCount; j++) { 52 | var row = rows[j]; 53 | var rowValue = row[i]; 54 | sheetValues[i,j+1] = rowValue == null ? string.Empty : 55 | rowValue.ToString(); 56 | } 57 | } 58 | 59 | } 60 | 61 | } 62 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/SyncValue.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Reflection; 5 | 6 | [Serializable] 7 | public class SyncValue 8 | { 9 | public static readonly SyncValue Empty = new(); 10 | 11 | public FieldInfo fieldInfo; 12 | public PropertyInfo propertyInfo; 13 | 14 | public SyncValueType valueType = SyncValueType.Field; 15 | public Type targetType; 16 | 17 | public string objectField = string.Empty; 18 | public string sheetField = string.Empty; 19 | public bool isKeyField = false; 20 | public bool allowRead = true; 21 | public bool allowWrite = true; 22 | public SheetSyncScheme syncScheme; 23 | 24 | public bool IsSheetTarget => syncScheme != null; 25 | 26 | #region public methods 27 | 28 | public object GetValue(object source) 29 | { 30 | if(!allowRead) return null; 31 | 32 | switch (valueType) 33 | { 34 | case SyncValueType.Field: 35 | return fieldInfo.GetValue(source); 36 | case SyncValueType.Property: 37 | return propertyInfo.GetValue(source); 38 | } 39 | 40 | return null; 41 | } 42 | 43 | public SyncValue ApplyValue(object source, object value) 44 | { 45 | switch (valueType) 46 | { 47 | case SyncValueType.Field: 48 | fieldInfo.SetValue(source,value); 49 | break; 50 | case SyncValueType.Property: 51 | if(propertyInfo.CanWrite) 52 | propertyInfo.SetValue(source,value); 53 | break; 54 | } 55 | if(fieldInfo!=null) 56 | fieldInfo.SetValue(source, value); 57 | return this; 58 | } 59 | 60 | public override string ToString() 61 | { 62 | return 63 | $"Object Field: {objectField} IsKey: {isKeyField} Sheet Field: {sheetField} TargetType: {targetType.Name}"; 64 | } 65 | 66 | #endregion 67 | } 68 | } -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleImportersCommonOperations.cs: -------------------------------------------------------------------------------- 1 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor.EditorWindow 2 | { 3 | #if ODIN_INSPECTOR 4 | using Sirenix.OdinInspector; 5 | using Sirenix.Utilities.Editor; 6 | #endif 7 | using UnityEngine; 8 | using System; 9 | using global::UniGame.GoogleSpreadsheets.Editor; 10 | 11 | [Serializable] 12 | public class GoogleImportersCommonOperations 13 | { 14 | private const string ImportLabel = "Import All"; 15 | private const string ExportLabel = "Export All"; 16 | private readonly GoogleSpreadsheetImporter _importer; 17 | 18 | #if ODIN_INSPECTOR 19 | [ButtonGroup("Importers")] 20 | [Button(ImportLabel)] 21 | [EnableIf(nameof(HasConnectedSheets))] 22 | #endif 23 | public void Import() => _importer.Import(); 24 | 25 | #if ODIN_INSPECTOR 26 | [ButtonGroup("Importers")] 27 | [Button(ExportLabel)] 28 | [EnableIf(nameof(HasConnectedSheets))] 29 | #endif 30 | public void Export() => _importer.Export(); 31 | 32 | #if ODIN_INSPECTOR 33 | [ButtonGroup()] 34 | [EnableIf(nameof(IsValidToConnect))] 35 | [Button("Reload Spreadsheets")] 36 | #endif 37 | public void Reconnect() => _importer.Reconnect(); 38 | 39 | public GoogleImportersCommonOperations(GoogleSpreadsheetImporter importer) 40 | { 41 | _importer = importer; 42 | } 43 | 44 | public void DrawEditors() 45 | { 46 | #if ODIN_INSPECTOR 47 | SirenixEditorGUI.BeginHorizontalToolbar(); 48 | { 49 | GUILayout.FlexibleSpace(); 50 | if (SirenixEditorGUI.ToolbarButton(nameof(Reconnect))) 51 | Reconnect(); 52 | if (SirenixEditorGUI.ToolbarButton(ImportLabel)) 53 | Import(); 54 | if (SirenixEditorGUI.ToolbarButton(ExportLabel)) 55 | Export(); 56 | } 57 | SirenixEditorGUI.EndHorizontalToolbar(); 58 | #endif 59 | } 60 | 61 | 62 | private bool HasConnectedSheets() => _importer && _importer.HasConnectedSheets; 63 | 64 | private bool IsValidToConnect() => _importer && _importer.IsValidToConnect; 65 | } 66 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetEditorAsset.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using CoProcessors; 4 | using UniModules; 5 | using UniModules.Editor; 6 | using TypeConverters.Editor; 7 | using UnityEditor; 8 | using UnityEngine; 9 | 10 | [CreateAssetMenu(menuName = "UniGame/Google/GoogleSpreadSheet Settings", 11 | fileName = "GoogleSpreadSheet Settings")] 12 | public class GoogleSpreadsheetEditorAsset : ScriptableObject 13 | { 14 | #region inspector 15 | 16 | public CoProcessor processor; 17 | 18 | public GoogleSpreadsheetImporter importerAsset; 19 | 20 | #endregion 21 | 22 | [MenuItem("Assets/UniGame/Google Spreadsheet/Google Spreadsheet Asset")] 23 | [MenuItem("Assets/Create/UniGame/Google/Google Spreadsheet Asset")] 24 | public static void CreateAsset() 25 | { 26 | var activeObject = Selection.activeObject; 27 | if (!activeObject) 28 | return; 29 | 30 | var path = AssetDatabase.GetAssetPath(activeObject); 31 | path = path.GetDirectoryPath(); 32 | 33 | Debug.Log($"ASSET PATH SELECTION : {path}"); 34 | 35 | CreateAsset(path); 36 | } 37 | 38 | private static GoogleSpreadsheetEditorAsset _defaultAsset; 39 | public static GoogleSpreadsheetEditorAsset EditorSettings 40 | { 41 | get 42 | { 43 | if (_defaultAsset) return _defaultAsset; 44 | _defaultAsset = AssetEditorTools.GetAsset(); 45 | return _defaultAsset; 46 | } 47 | } 48 | 49 | public static void CreateAsset(string path) 50 | { 51 | var coProcessorAsset = EditorSettings.processor; 52 | var importerAsset = EditorSettings.importerAsset; 53 | 54 | var result = importerAsset.CopyAsset(importerAsset.name,path); 55 | var coProcessor = coProcessorAsset.CopyAsset(coProcessorAsset.name, path); 56 | coProcessor.ResetToDefault(); 57 | 58 | result.settings.typeConverter = ObjectTypeConverter.TypeConverters; 59 | result.settings.coProcessors = coProcessor; 60 | 61 | result.MarkDirty(); 62 | coProcessor.MarkDirty(); 63 | 64 | AssetDatabase.Refresh(); 65 | } 66 | 67 | } 68 | } -------------------------------------------------------------------------------- /GitAssets/asset_ref1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 49d96864071f67d4eabc8fca6a3d27b7 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/asset_ref2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ba6fc12ea4dbc7d44887905abc9974a5 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/json_support1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: caa5fe90df9f6c64880ef3f1deff150b 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/json_support2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8cfcc834e3998174ab675f9c5f19e306 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/nested_sheet.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7d8cd14178e141f448a01d8e1f890713 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/sheet_fields.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8cbf8fd1219f4c44683bfa4c0dc97f85 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /GitAssets/nested_table_field.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d2b8eb6b4aa92354e9a0adf541d04337 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: -1 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: -1 39 | wrapV: -1 40 | wrapW: -1 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/GoogleSpreadsheetSettings.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using CoProcessors; 6 | using TypeConverters.Editor; 7 | using UnityEngine; 8 | using UnityEngine.UIElements; 9 | 10 | #if ALCHEMY_INSPECTOR 11 | using Alchemy.Inspector; 12 | #endif 13 | 14 | #if ODIN_INSPECTOR 15 | using Sirenix.OdinInspector; 16 | #endif 17 | 18 | [Serializable] 19 | public class GoogleSpreadsheetSettings 20 | { 21 | /// 22 | /// credential profile file 23 | /// https://developers.google.com/sheets/api/quickstart/dotnet 24 | /// 25 | #if ODIN_INSPECTOR 26 | [FilePath(RequireExistingPath = true)] 27 | #endif 28 | public string credentialsPath; 29 | 30 | #if ODIN_INSPECTOR 31 | #endif 32 | public string user = "user"; 33 | 34 | [Tooltip("timeout to google auth in sec")] 35 | [Range(10, 100)] 36 | public float authTimeout = 30f; 37 | 38 | #if ODIN_INSPECTOR 39 | #endif 40 | [Header("try to auto-connect to spreadsheets when window opened")] 41 | public bool autoConnect = true; 42 | 43 | /// 44 | /// list of target sheets 45 | /// 46 | [Space(4)] 47 | #if ODIN_INSPECTOR 48 | [InfoBox("Add any valid spreadsheet id's")] 49 | [TableList] 50 | #endif 51 | #if ALCHEMY_INSPECTOR 52 | [ListViewSettings(ShowAlternatingRowBackgrounds = AlternatingRowBackground.All,ShowFoldoutHeader = true)] 53 | #endif 54 | public List sheets = new(); 55 | 56 | [Space(8)] 57 | #if ODIN_INSPECTOR 58 | [TitleGroup("Type Converters")] 59 | [InlineEditor()] 60 | [HideLabel] 61 | #endif 62 | #if ALCHEMY_INSPECTOR 63 | [InlineEditor] 64 | #endif 65 | public ObjectTypeConverter typeConverter; 66 | 67 | [Space(8)] 68 | #if ODIN_INSPECTOR 69 | [TitleGroup("Co Processors")] 70 | [InlineEditor(InlineEditorObjectFieldModes.Boxed, Expanded = true)] 71 | [HideLabel] 72 | #endif 73 | #if ALCHEMY_INSPECTOR 74 | [InlineEditor] 75 | #endif 76 | public CoProcessor coProcessors; 77 | 78 | 79 | #if ODIN_INSPECTOR 80 | [OnInspectorInit] 81 | #endif 82 | #if ALCHEMY_INSPECTOR 83 | [OnInspectorEnable] 84 | #endif 85 | private void OnInspectorInitialize() 86 | { 87 | typeConverter ??= ObjectTypeConverter.TypeConverters; 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/CoProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor.CoProcessors 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using UniModules.Editor; 6 | using Abstract; 7 | using UnityEngine; 8 | using System.Data; 9 | 10 | using UniModules; 11 | 12 | #if ODIN_INSPECTOR 13 | using Sirenix.OdinInspector; 14 | #endif 15 | 16 | #if ALCHEMY_INSPECTOR 17 | using Alchemy.Inspector; 18 | #endif 19 | 20 | [CreateAssetMenu(menuName = "UniGame/Google/CoProcessors/CoProcessor", fileName = nameof(CoProcessor))] 21 | public class CoProcessor : ScriptableObject, ICoProcessorHandle 22 | { 23 | #region static data 24 | 25 | private static string _defaultCoProcessorPath; 26 | 27 | private static string DefaultCoProcessorPath => _defaultCoProcessorPath = 28 | string.IsNullOrEmpty(_defaultCoProcessorPath) 29 | ? FileUtils.Combine(EditorPathConstants.GeneratedContentPath, 30 | "GoogleSheetImporter/Editor/CoProcessors/") 31 | : _defaultCoProcessorPath; 32 | 33 | private static CoProcessor _processor; 34 | 35 | public static CoProcessor Processor 36 | { 37 | get 38 | { 39 | if (_processor) 40 | return _processor; 41 | 42 | _processor = AssetEditorTools.GetAsset(); 43 | if (!_processor) 44 | { 45 | _processor = CreateInstance(); 46 | _processor.ResetToDefault(); 47 | _processor.SaveAsset(nameof(CoProcessor), DefaultCoProcessorPath); 48 | } 49 | 50 | return _processor; 51 | } 52 | } 53 | 54 | #endregion 55 | 56 | #if ODIN_INSPECTOR 57 | [ListDrawerSettings(Expanded = true)] 58 | #endif 59 | #if ALCHEMY_INSPECTOR 60 | [ListViewSettings] 61 | [ShowInInspector] 62 | #endif 63 | [SerializeReference] 64 | public List processors = new(){new NestedTableCoProcessor()}; 65 | 66 | public void Apply(SheetValueInfo valueInfo, DataRow row) 67 | { 68 | if(valueInfo == null) 69 | throw new ArgumentNullException(nameof(valueInfo)); 70 | 71 | foreach (var coProcessor in processors) 72 | { 73 | coProcessor.Apply(valueInfo, row); 74 | } 75 | } 76 | 77 | [ContextMenu(nameof(ResetToDefault))] 78 | #if ODIN_INSPECTOR 79 | [Button] 80 | #endif 81 | #if ALCHEMY_INSPECTOR 82 | [Button] 83 | #endif 84 | public void ResetToDefault() 85 | { 86 | processors.Clear(); 87 | processors.Add(new NestedTableCoProcessor()); 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Abstract/IAssetSheetDataProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using Object = UnityEngine.Object; 6 | 7 | public interface IAssetSheetDataProcessor 8 | { 9 | /// 10 | /// Sync folder assets by spreadsheet data 11 | /// 12 | /// 13 | /// 14 | /// if true - create missing assets 15 | /// 16 | /// 17 | /// 18 | /// 19 | List SyncFolderAssets( 20 | Type filterType, 21 | string folder, 22 | bool createMissing, 23 | ISpreadsheetData spreadsheetData, 24 | int maxItems = -1, 25 | string overrideSheetId = "", 26 | Func assetNameFormatter = null); 27 | 28 | /// 29 | /// Sync folder assets by spreadsheet data 30 | /// 31 | /// 32 | /// 33 | /// 34 | /// if true - create missing assets 35 | /// 36 | /// 37 | /// force override target sheet id 38 | /// 39 | List SyncFolderAssets( 40 | Type filterType, 41 | string folder, 42 | ISpreadsheetData spreadsheetData, 43 | Object[] assets = null, 44 | bool createMissing = true, 45 | int maxItemsCount = -1, 46 | string overrideSheetId = "", 47 | Func assetNameFormatter = null); 48 | 49 | IEnumerable ApplyAssets( 50 | Type filterType, 51 | string sheetId, 52 | string folder, 53 | SheetSyncScheme syncScheme, 54 | ISpreadsheetData spreadsheetData, 55 | object[] keys, 56 | Object[] assets = null, 57 | int count = -1, 58 | bool createMissing = true, 59 | string keyFieldName = "", 60 | Func assetNameFormatter = null); 61 | 62 | object ApplyData(object source, ISpreadsheetData spreadsheetData); 63 | 64 | object ApplyData(SheetValueInfo syncValueInfo); 65 | 66 | bool UpdateSheetValue(object source, ISpreadsheetData data,string sheetId = "", string sheetKeyField = ""); 67 | 68 | bool UpdateSheetValue(SheetValueInfo sheetValueInfo); 69 | 70 | IEnumerable SelectSheetFields(SheetSyncScheme schemaValue,SheetData data); 71 | 72 | } 73 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/CoProcessors/NestedTableCoProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor.CoProcessors 2 | { 3 | using System; 4 | using System.Text.RegularExpressions; 5 | using UnityEngine; 6 | using System.Collections.Generic; 7 | using System.Data; 8 | using Abstract; 9 | using global::UniGame.GoogleSpreadsheets.Editor; 10 | 11 | [Serializable] 12 | public class NestedTableCoProcessor : ICoProcessorHandle 13 | { 14 | private const int TableNameGroupId = 1; 15 | 16 | [SerializeField] 17 | private string _filter = @"\w*\[ref:(\w*)\]"; 18 | [SerializeField, Min(0)] 19 | private int _overrideStartColumn = 1; 20 | 21 | public void Apply(SheetValueInfo sheetValueInfo, DataRow row) 22 | { 23 | sheetValueInfo.IgnoreCache = sheetValueInfo.IgnoreCache ?? new HashSet(); 24 | sheetValueInfo.IgnoreCache.Add(sheetValueInfo.SheetName.ToLower()); 25 | 26 | var validColumns = GetValidColumns(sheetValueInfo, row); 27 | 28 | foreach (var cell in validColumns) 29 | { 30 | var nestedTableName = cell.Key; 31 | var nestedTableKey = cell.Value; 32 | 33 | if(string.IsNullOrEmpty(nestedTableName) || string.IsNullOrEmpty(nestedTableKey.ToString())) 34 | continue; 35 | 36 | sheetValueInfo.Source.ApplySpreadsheetData(sheetValueInfo, nestedTableName, nestedTableKey, overrideStartColumn: _overrideStartColumn); 37 | } 38 | } 39 | 40 | private Dictionary GetValidColumns(SheetValueInfo sheetValueInfo, DataRow row) 41 | { 42 | var result = new Dictionary(); 43 | 44 | var table = row.Table; 45 | var rowValues = row.ItemArray; 46 | 47 | for (var i = 0; i < table.Columns.Count; i++) 48 | { 49 | var columnName = table.Columns[i].ColumnName; 50 | if (IsValidColumn(columnName)) 51 | { 52 | var tableName = GetTableName(columnName); 53 | if (sheetValueInfo.IsInIgnoreCache(tableName)) 54 | continue; 55 | 56 | result.Add(tableName, rowValues[i]); 57 | } 58 | } 59 | 60 | return result; 61 | } 62 | 63 | private string GetTableName(string columnName) 64 | { 65 | var regex = new Regex(_filter); 66 | if (!regex.IsMatch(columnName)) 67 | return columnName; 68 | 69 | var groups = regex.Match(columnName).Groups; 70 | return groups[TableNameGroupId].Value; 71 | } 72 | 73 | private bool IsValidColumn(string columnName) 74 | { 75 | var regex = new Regex(_filter); 76 | return regex.IsMatch(columnName); 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /Editor/EditorWindow/GoogleSheetImporterEditorWindow.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | 4 | #if ODIN_INSPECTOR 5 | 6 | namespace UniModules.UniGame.GoogleSpreadsheetsImporter.Editor.EditorWindow 7 | { 8 | using UniModules.Editor; 9 | using global::UniGame.GoogleSpreadsheets.Editor; 10 | using Sirenix.OdinInspector; 11 | using Sirenix.OdinInspector.Editor; 12 | using UnityEditor; 13 | using UnityEngine; 14 | 15 | public class GoogleSheetImporterEditorWindow : OdinMenuEditorWindow 16 | { 17 | #region static data 18 | 19 | [MenuItem("UniGame/Google/Spreadsheet ImporterWindow")] 20 | public static void Open() 21 | { 22 | var window = GetWindow(); 23 | window.titleContent = new GUIContent("Google Sheets"); 24 | window.Show(); 25 | } 26 | 27 | public static GoogleSpreadsheetImporter GetGoogleSpreadsheetImporter() 28 | { 29 | //load importer asset 30 | var importer = AssetEditorTools.GetAsset(); 31 | if (importer) return importer; 32 | 33 | importer = CreateInstance(); 34 | importer.SaveAsset(nameof(GoogleSpreadsheetImporter), GoogleSheetImporterEditorConstants.DefaultGoogleSheetImporterPath); 35 | 36 | return importer; 37 | } 38 | 39 | 40 | #endregion 41 | 42 | [SerializeField] 43 | [HideLabel] 44 | [HideInInspector] 45 | public GoogleSpreadsheetImporter _googleSheetImporter; 46 | 47 | private GoogleImportersCommonOperations _operations; 48 | private List _assetsHandlers; 49 | private OdinMenuTree _menuTree; 50 | 51 | #region private methods 52 | 53 | protected override OdinMenuTree BuildMenuTree() 54 | { 55 | _googleSheetImporter = GetGoogleSpreadsheetImporter(); 56 | 57 | _menuTree = new OdinMenuTree(); 58 | var spreadSheerHandler = _googleSheetImporter.sheetsItemsHandler; 59 | 60 | _assetsHandlers = spreadSheerHandler.Importers.ToList(); 61 | 62 | _operations = new GoogleImportersCommonOperations(_googleSheetImporter); 63 | 64 | _menuTree.Add("Commands",_operations); 65 | 66 | foreach (var importer in _assetsHandlers) 67 | _menuTree.Add($"Import & Export/{importer.Name}",importer); 68 | 69 | _menuTree.Add("Configuration",_googleSheetImporter); 70 | 71 | if(_googleSheetImporter.AutoConnect) 72 | _operations.Reconnect(); 73 | 74 | OnStartElements(); 75 | 76 | return _menuTree; 77 | } 78 | 79 | protected override void OnBeginDrawEditors() 80 | { 81 | base.OnBeginDrawEditors(); 82 | _operations?.DrawEditors(); 83 | } 84 | 85 | private void OnStartElements() 86 | { 87 | foreach (var item in _assetsHandlers) 88 | if(item is IStartable startable) startable.Start(); 89 | } 90 | 91 | #endregion 92 | 93 | } 94 | } 95 | #endif 96 | -------------------------------------------------------------------------------- /GitAssets/editor.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fafeaa022b860584ebd74890fc1ee955 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | spriteSheet: 111 | serializedVersion: 2 112 | sprites: [] 113 | outline: [] 114 | physicsShape: [] 115 | bones: [] 116 | spriteID: 117 | internalID: 0 118 | vertices: [] 119 | indices: 120 | edges: [] 121 | weights: [] 122 | secondaryTextures: [] 123 | spritePackingTag: 124 | pSDRemoveMatte: 0 125 | pSDShowRemoveMatteOption: 0 126 | userData: 127 | assetBundleName: 128 | assetBundleVariant: 129 | -------------------------------------------------------------------------------- /GitAssets/menu.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 616666af1b2c04d4ca7ae45829360106 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | spriteSheet: 111 | serializedVersion: 2 112 | sprites: [] 113 | outline: [] 114 | physicsShape: [] 115 | bones: [] 116 | spriteID: 117 | internalID: 0 118 | vertices: [] 119 | indices: 120 | edges: [] 121 | weights: [] 122 | secondaryTextures: [] 123 | spritePackingTag: 124 | pSDRemoveMatte: 0 125 | pSDShowRemoveMatteOption: 0 126 | userData: 127 | assetBundleName: 128 | assetBundleVariant: 129 | -------------------------------------------------------------------------------- /GitAssets/sheet1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 70e565e4d57f6e84b8535f99beffcd41 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | spriteSheet: 111 | serializedVersion: 2 112 | sprites: [] 113 | outline: [] 114 | physicsShape: [] 115 | bones: [] 116 | spriteID: 117 | internalID: 0 118 | vertices: [] 119 | indices: 120 | edges: [] 121 | weights: [] 122 | secondaryTextures: [] 123 | spritePackingTag: 124 | pSDRemoveMatte: 0 125 | pSDShowRemoveMatteOption: 0 126 | userData: 127 | assetBundleName: 128 | assetBundleVariant: 129 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/BaseSpreadsheetProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using Core.Runtime; 4 | using UniGame.Runtime.DataFlow; 5 | using UnityEngine; 6 | #if ALCHEMY_INSPECTOR 7 | using Alchemy.Inspector; 8 | #endif 9 | #if ODIN_INSPECTOR 10 | using Sirenix.OdinInspector; 11 | #endif 12 | 13 | public abstract class BaseSpreadsheetProcessor : ScriptableObject, ISpreadsheetProcessor 14 | { 15 | public const string CommandsGroup = "commands"; 16 | 17 | public string importerName = string.Empty; 18 | 19 | private IGoogleSpreadsheetClient _client; 20 | private IGooglsSpreadsheetClientStatus _status; 21 | 22 | private LifeTime _lifeTimeDefinition = new(); 23 | 24 | #region public properties 25 | 26 | public virtual string Name => string.IsNullOrEmpty(importerName) ? name : importerName; 27 | 28 | protected ILifeTime LifeTime => _lifeTimeDefinition; 29 | 30 | public IGoogleSpreadsheetClient Client => _client; 31 | 32 | public bool IsValidData => _client!=null && 33 | _status != null && 34 | _status.HasConnectedSheets; 35 | 36 | public abstract bool CanImport { get; } 37 | public abstract bool CanExport { get; } 38 | 39 | #endregion 40 | 41 | public virtual void Start() 42 | { 43 | } 44 | 45 | public virtual void Initialize(IGoogleSpreadsheetClient client) 46 | { 47 | Reset(); 48 | 49 | _client = client; 50 | _status = client.Status; 51 | 52 | OnInitialize(client); 53 | } 54 | 55 | public void Reset() 56 | { 57 | _client = null; 58 | _status = null; 59 | 60 | _lifeTimeDefinition.Terminate(); 61 | _lifeTimeDefinition = new LifeTime(); 62 | } 63 | 64 | public ISpreadsheetData Import(ISpreadsheetData spreadsheetData) 65 | { 66 | return ImportObjects(spreadsheetData); 67 | } 68 | 69 | public ISpreadsheetData Export(ISpreadsheetData data) 70 | { 71 | return ExportObjects(data); 72 | } 73 | 74 | #if ODIN_INSPECTOR 75 | [ButtonGroup] 76 | [Button(ButtonSizes.Small,Icon = SdfIconType.CloudDownload)] 77 | [EnableIf(nameof(IsValidData))] 78 | [ShowIf(nameof(CanImport))] 79 | #endif 80 | #if ALCHEMY_INSPECTOR 81 | [HorizontalGroup(CommandsGroup)] 82 | [EnableIf(nameof(IsValidData))] 83 | [ShowIf(nameof(CanImport))] 84 | [Button] 85 | #endif 86 | public void Import() 87 | { 88 | if (IsValidData == false) return; 89 | Import(_client.SpreadsheetData); 90 | } 91 | 92 | #if ODIN_INSPECTOR 93 | [ButtonGroup] 94 | [Button(ButtonSizes.Small,Icon = SdfIconType.CloudUpload)] 95 | [EnableIf(nameof(IsValidData))] 96 | [ShowIf(nameof(CanExport))] 97 | #endif 98 | #if ALCHEMY_INSPECTOR 99 | [HorizontalGroup(CommandsGroup)] 100 | [EnableIf(nameof(IsValidData))] 101 | [ShowIf(nameof(CanExport))] 102 | [Button] 103 | #endif 104 | public void Export() 105 | { 106 | if (IsValidData == false) return; 107 | Export(_client.SpreadsheetData); 108 | 109 | if (_client.IsConnected) 110 | _client.UploadAll(); 111 | } 112 | 113 | public abstract ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData); 114 | 115 | public abstract ISpreadsheetData ExportObjects(ISpreadsheetData spreadsheetData); 116 | 117 | public virtual string FormatName(string assetName) => assetName; 118 | 119 | protected virtual void OnReset() {} 120 | 121 | protected virtual void OnInitialize(IGoogleSpreadsheetClient client) {} 122 | } 123 | } -------------------------------------------------------------------------------- /GitAssets/sheetid.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e492756334deb174caf370208b42d197 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | - serializedVersion: 3 111 | buildTarget: Windows Store Apps 112 | maxTextureSize: 8192 113 | resizeAlgorithm: 0 114 | textureFormat: -1 115 | textureCompression: 1 116 | compressionQuality: 50 117 | crunchedCompression: 0 118 | allowsAlphaSplitting: 0 119 | overridden: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | spriteSheet: 123 | serializedVersion: 2 124 | sprites: [] 125 | outline: [] 126 | physicsShape: [] 127 | bones: [] 128 | spriteID: 129 | internalID: 0 130 | vertices: [] 131 | indices: 132 | edges: [] 133 | weights: [] 134 | secondaryTextures: [] 135 | spritePackingTag: 136 | pSDRemoveMatte: 0 137 | pSDShowRemoveMatteOption: 0 138 | userData: 139 | assetBundleName: 140 | assetBundleVariant: 141 | -------------------------------------------------------------------------------- /GitAssets/sheetid1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ed0b1921e60006347934f46a6d4c6073 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | - serializedVersion: 3 111 | buildTarget: Windows Store Apps 112 | maxTextureSize: 8192 113 | resizeAlgorithm: 0 114 | textureFormat: -1 115 | textureCompression: 1 116 | compressionQuality: 50 117 | crunchedCompression: 0 118 | allowsAlphaSplitting: 0 119 | overridden: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | spriteSheet: 123 | serializedVersion: 2 124 | sprites: [] 125 | outline: [] 126 | physicsShape: [] 127 | bones: [] 128 | spriteID: 129 | internalID: 0 130 | vertices: [] 131 | indices: 132 | edges: [] 133 | weights: [] 134 | secondaryTextures: [] 135 | spritePackingTag: 136 | pSDRemoveMatte: 0 137 | pSDShowRemoveMatteOption: 0 138 | userData: 139 | assetBundleName: 140 | assetBundleVariant: 141 | -------------------------------------------------------------------------------- /GitAssets/editorapikey.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d2b105e3a4c59624d9072bc4e78703ba 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | - serializedVersion: 3 111 | buildTarget: Windows Store Apps 112 | maxTextureSize: 8192 113 | resizeAlgorithm: 0 114 | textureFormat: -1 115 | textureCompression: 1 116 | compressionQuality: 50 117 | crunchedCompression: 0 118 | allowsAlphaSplitting: 0 119 | overridden: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | spriteSheet: 123 | serializedVersion: 2 124 | sprites: [] 125 | outline: [] 126 | physicsShape: [] 127 | bones: [] 128 | spriteID: 129 | internalID: 0 130 | vertices: [] 131 | indices: 132 | edges: [] 133 | weights: [] 134 | secondaryTextures: [] 135 | spritePackingTag: 136 | pSDRemoveMatte: 0 137 | pSDShowRemoveMatteOption: 0 138 | userData: 139 | assetBundleName: 140 | assetBundleVariant: 141 | -------------------------------------------------------------------------------- /GitAssets/editorapikey2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f96008e08b5754a4999f4da33a1c60e4 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: 2 36 | mipBias: -100 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 8192 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | - serializedVersion: 3 75 | buildTarget: Standalone 76 | maxTextureSize: 8192 77 | resizeAlgorithm: 0 78 | textureFormat: -1 79 | textureCompression: 1 80 | compressionQuality: 50 81 | crunchedCompression: 0 82 | allowsAlphaSplitting: 0 83 | overridden: 0 84 | androidETC2FallbackOverride: 0 85 | forceMaximumCompressionQuality_BC6H_BC7: 0 86 | - serializedVersion: 3 87 | buildTarget: iPhone 88 | maxTextureSize: 8192 89 | resizeAlgorithm: 0 90 | textureFormat: -1 91 | textureCompression: 1 92 | compressionQuality: 50 93 | crunchedCompression: 0 94 | allowsAlphaSplitting: 0 95 | overridden: 0 96 | androidETC2FallbackOverride: 0 97 | forceMaximumCompressionQuality_BC6H_BC7: 0 98 | - serializedVersion: 3 99 | buildTarget: Android 100 | maxTextureSize: 8192 101 | resizeAlgorithm: 0 102 | textureFormat: -1 103 | textureCompression: 1 104 | compressionQuality: 50 105 | crunchedCompression: 0 106 | allowsAlphaSplitting: 0 107 | overridden: 0 108 | androidETC2FallbackOverride: 0 109 | forceMaximumCompressionQuality_BC6H_BC7: 0 110 | - serializedVersion: 3 111 | buildTarget: Windows Store Apps 112 | maxTextureSize: 8192 113 | resizeAlgorithm: 0 114 | textureFormat: -1 115 | textureCompression: 1 116 | compressionQuality: 50 117 | crunchedCompression: 0 118 | allowsAlphaSplitting: 0 119 | overridden: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | spriteSheet: 123 | serializedVersion: 2 124 | sprites: [] 125 | outline: [] 126 | physicsShape: [] 127 | bones: [] 128 | spriteID: 129 | internalID: 0 130 | vertices: [] 131 | indices: 132 | edges: [] 133 | weights: [] 134 | secondaryTextures: [] 135 | spritePackingTag: 136 | pSDRemoveMatte: 0 137 | pSDShowRemoveMatteOption: 0 138 | userData: 139 | assetBundleName: 140 | assetBundleVariant: 141 | -------------------------------------------------------------------------------- /GitAssets/spreadsheet_asset_creation.gif.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9a3f01d7584beda419d0a3347fbadb71 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMasterTextureLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: WebGL 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | spriteSheet: 131 | serializedVersion: 2 132 | sprites: [] 133 | outline: [] 134 | physicsShape: [] 135 | bones: [] 136 | spriteID: 137 | internalID: 0 138 | vertices: [] 139 | indices: 140 | edges: [] 141 | weights: [] 142 | secondaryTextures: [] 143 | nameFileIdTable: {} 144 | spritePackingTag: 145 | pSDRemoveMatte: 0 146 | userData: 147 | assetBundleName: 148 | assetBundleVariant: 149 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/Serializable/AssetsWithAttributesImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using Core.Runtime.SerializableType; 6 | using Core.Runtime.SerializableType.Extensions; 7 | using UniModules.Editor; 8 | using Runtime; 9 | using UnityEngine; 10 | using Object = UnityEngine.Object; 11 | #if ODIN_INSPECTOR 12 | using Sirenix.OdinInspector; 13 | #endif 14 | 15 | //public class AssetsWithAttributesImporterAsset : BaseSpreadsheetImporter 16 | 17 | [Serializable] 18 | #if ODIN_INSPECTOR 19 | [HideLabel] 20 | [BoxGroup("Attributes Source")] 21 | #endif 22 | public class AssetsWithAttributesImporter : SerializableSpreadsheetProcessor 23 | { 24 | #if ODIN_INSPECTOR 25 | [ValueDropdown(nameof(GetAssetTypeDropdown))] 26 | [PropertyOrder(-1)] 27 | #endif 28 | public SType targetAssetType = typeof(ScriptableObject); 29 | 30 | #if ODIN_INSPECTOR 31 | [Button] 32 | #endif 33 | public void LoadAssets() 34 | { 35 | foreach (var asset in Load()) { } 36 | } 37 | 38 | public List Load() 39 | { 40 | if(targetAssetType == null) return default; 41 | 42 | return AssetEditorTools.GetAssets(targetAssetType); 43 | } 44 | 45 | public override ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 46 | { 47 | var source =Load(); 48 | if(source == null) return spreadsheetData; 49 | 50 | var result = FilterAttributesTargets(source); 51 | 52 | foreach (var item in result) { 53 | if(!spreadsheetData.HasSheet(item.sheetId) || item.asset == null) 54 | continue; 55 | item.target.ApplySpreadsheetData(spreadsheetData,item.sheetId); 56 | item.asset.MarkDirty(); 57 | } 58 | 59 | return spreadsheetData; 60 | } 61 | 62 | public override ISpreadsheetData ExportObjects(ISpreadsheetData spreadsheetData) 63 | { 64 | var source =Load(); 65 | var result = FilterAttributesTargets(source); 66 | foreach (var item in result) { 67 | if(item.asset == null) continue; 68 | item.asset.UpdateSheetValue(spreadsheetData, item.sheetId); 69 | } 70 | 71 | return spreadsheetData; 72 | } 73 | 74 | public IEnumerable FilterAttributesTargets(IEnumerable source) 75 | { 76 | foreach (var sourceValue in source) 77 | { 78 | var attributeValue = sourceValue 79 | .GetAttributeOnSelfOrChildren(); 80 | 81 | if(!attributeValue.IsFound) continue; 82 | 83 | var attribute = attributeValue.Attribute; 84 | var target = attributeValue.Target; 85 | 86 | var sheetName = attribute == null || attribute.UseTypeName 87 | ? target.GetType().Name 88 | : attribute.SheetName; 89 | 90 | var asset = attributeValue.Source as Object; 91 | 92 | var value = new SheetSyncItem 93 | { 94 | asset = asset, 95 | target = attributeValue.Target, 96 | sheetId = sheetName 97 | }; 98 | 99 | yield return value; 100 | } 101 | } 102 | 103 | #if ODIN_INSPECTOR 104 | private IEnumerable> GetAssetTypeDropdown() 105 | { 106 | var baseType = typeof(ScriptableObject); 107 | var baseSType = (SType)baseType; 108 | var assetTypes = baseSType.GetAssignableNonAbstractTypes(); 109 | foreach (var sType in assetTypes) 110 | { 111 | yield return new ValueDropdownItem() 112 | { 113 | Text = sType.Name, 114 | Value = sType 115 | }; 116 | } 117 | } 118 | #endif 119 | } 120 | } -------------------------------------------------------------------------------- /GitAssets/r3.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a70cf6aae5ec49341baeaecc1695acc3 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 13 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 4 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 4 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 4 97 | buildTarget: Android 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 4 110 | buildTarget: WebGL 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 4 123 | buildTarget: iOS 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | spriteSheet: 136 | serializedVersion: 2 137 | sprites: [] 138 | outline: [] 139 | customData: 140 | physicsShape: [] 141 | bones: [] 142 | spriteID: 143 | internalID: 0 144 | vertices: [] 145 | indices: 146 | edges: [] 147 | weights: [] 148 | secondaryTextures: [] 149 | spriteCustomMetadata: 150 | entries: [] 151 | nameFileIdTable: {} 152 | mipmapLimitGroupName: 153 | pSDRemoveMatte: 0 154 | userData: 155 | assetBundleName: 156 | assetBundleVariant: 157 | -------------------------------------------------------------------------------- /GitAssets/login_done.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c51e547ab404e96489b83c609d397bbf 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 13 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 4 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 4 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 4 97 | buildTarget: Android 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 4 110 | buildTarget: WebGL 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 4 123 | buildTarget: iOS 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | spriteSheet: 136 | serializedVersion: 2 137 | sprites: [] 138 | outline: [] 139 | customData: 140 | physicsShape: [] 141 | bones: [] 142 | spriteID: 143 | internalID: 0 144 | vertices: [] 145 | indices: 146 | edges: [] 147 | weights: [] 148 | secondaryTextures: [] 149 | spriteCustomMetadata: 150 | entries: [] 151 | nameFileIdTable: {} 152 | mipmapLimitGroupName: 153 | pSDRemoveMatte: 0 154 | userData: 155 | assetBundleName: 156 | assetBundleVariant: 157 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SerializableSpreadsheetProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Text; 5 | using UniCore.Runtime.ProfilerTools; 6 | using UnityEditor; 7 | using UnityEngine; 8 | 9 | #if ALCHEMY_INSPECTOR 10 | using Alchemy.Inspector; 11 | #endif 12 | #if ODIN_INSPECTOR 13 | using Sirenix.OdinInspector; 14 | #endif 15 | 16 | [Serializable] 17 | public abstract class SerializableSpreadsheetProcessor : ISpreadsheetProcessor 18 | { 19 | public const string CommandsGroup = "commands"; 20 | 21 | public string importerName = string.Empty; 22 | 23 | public bool disableDBOnImport = false; 24 | 25 | [SerializeField] 26 | private ImportAction _importAction = ImportAction.All; 27 | 28 | private IGoogleSpreadsheetClient _client; 29 | private IGooglsSpreadsheetClientStatus _status; 30 | 31 | #region public properties 32 | 33 | public virtual string Name => string.IsNullOrEmpty(importerName) ? GetType().Name : importerName; 34 | 35 | public bool CanImport => _importAction.HasFlag(ImportAction.Import); 36 | public bool CanExport => _importAction.HasFlag(ImportAction.Export); 37 | 38 | public bool IsValidData => _client!= null && 39 | _status !=null && 40 | _status.HasConnectedSheets; 41 | 42 | #endregion 43 | 44 | public void Initialize(IGoogleSpreadsheetClient client) 45 | { 46 | Reset(); 47 | 48 | _client = client; 49 | _status = client.Status; 50 | } 51 | 52 | public void Reset() 53 | { 54 | _client = null; 55 | _status = null; 56 | } 57 | 58 | public ISpreadsheetData Import(ISpreadsheetData spreadsheetData) 59 | { 60 | return ImportObjects(spreadsheetData); 61 | } 62 | 63 | public ISpreadsheetData Export(ISpreadsheetData data) 64 | { 65 | return ExportObjects(data); 66 | } 67 | 68 | #if ODIN_INSPECTOR 69 | [ButtonGroup] 70 | [Button(ButtonSizes.Medium,Icon = SdfIconType.CloudDownload)] 71 | [EnableIf(nameof(IsValidData))] 72 | [ShowIf(nameof(CanImport))] 73 | #endif 74 | #if ALCHEMY_INSPECTOR 75 | [HorizontalGroup(CommandsGroup)] 76 | [EnableIf(nameof(IsValidData))] 77 | [ShowIf(nameof(CanImport))] 78 | [Button] 79 | #endif 80 | public void Import() 81 | { 82 | if (IsValidData == false) return; 83 | 84 | var stringBuilder = new StringBuilder(); 85 | 86 | if (disableDBOnImport) 87 | AssetDatabase.StartAssetEditing(); 88 | 89 | try 90 | { 91 | Import(_client.SpreadsheetData); 92 | } 93 | catch (Exception e) 94 | { 95 | GameLog.LogError(e); 96 | return; 97 | } 98 | finally 99 | { 100 | AssetDatabase.StopAssetEditing(); 101 | } 102 | 103 | GameLog.Log(stringBuilder.ToString()); 104 | } 105 | 106 | #if ODIN_INSPECTOR 107 | [ButtonGroup] 108 | [Button(ButtonSizes.Medium,Icon = SdfIconType.CloudUpload)] 109 | [EnableIf("IsValidData")] 110 | [ShowIf("CanExport")] 111 | #endif 112 | #if ALCHEMY_INSPECTOR 113 | [HorizontalGroup(CommandsGroup)] 114 | [EnableIf(nameof(IsValidData))] 115 | [ShowIf(nameof(CanExport))] 116 | [Button] 117 | #endif 118 | public void Export() 119 | { 120 | if (IsValidData == false) return; 121 | Export(_client.SpreadsheetData); 122 | 123 | if(_client.IsConnected) _client.UploadAll(); 124 | } 125 | 126 | public virtual void Start() { } 127 | 128 | public virtual ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 129 | { 130 | return spreadsheetData; 131 | } 132 | 133 | public virtual ISpreadsheetData ExportObjects(ISpreadsheetData spreadsheetData) => spreadsheetData; 134 | 135 | public virtual string FormatName(string assetName) => assetName; 136 | } 137 | } -------------------------------------------------------------------------------- /GitAssets/webapp1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce6cf717f37dc274786fa394a23dcbbf 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/webapp2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5a10ae9fb0d00ec4eb45f7d52cf8790b 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/webapp3.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 057fe9760ba46054aaba587c230a8ff0 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/webapp4.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 852a92298896d1f44aca36ddf10f72e1 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/webapp5.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fca92fd8cda1a8c4c81ff34f8cf8e599 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/install_package.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 36c2303934c5fa54ca35558b28c44fcd 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/typeconvert1.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6ec0ff30abf9379469d8b3e5cfca95e4 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/create_spreadsheet_asset.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b76c56753e6902548ae15200feccae97 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /GitAssets/Import Characters from Spreadsheets1.gif.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e5e402ead1d72aa41b073ec3c7b36e10 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 0 41 | wrapV: 0 42 | wrapW: 0 43 | nPOTScale: 1 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 0 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 0 56 | spriteTessellationDetail: -1 57 | textureType: 0 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | androidETC2FallbackOverride: 0 81 | forceMaximumCompressionQuality_BC6H_BC7: 0 82 | - serializedVersion: 3 83 | buildTarget: Standalone 84 | maxTextureSize: 2048 85 | resizeAlgorithm: 0 86 | textureFormat: -1 87 | textureCompression: 1 88 | compressionQuality: 50 89 | crunchedCompression: 0 90 | allowsAlphaSplitting: 0 91 | overridden: 0 92 | androidETC2FallbackOverride: 0 93 | forceMaximumCompressionQuality_BC6H_BC7: 0 94 | - serializedVersion: 3 95 | buildTarget: Server 96 | maxTextureSize: 2048 97 | resizeAlgorithm: 0 98 | textureFormat: -1 99 | textureCompression: 1 100 | compressionQuality: 50 101 | crunchedCompression: 0 102 | allowsAlphaSplitting: 0 103 | overridden: 0 104 | androidETC2FallbackOverride: 0 105 | forceMaximumCompressionQuality_BC6H_BC7: 0 106 | - serializedVersion: 3 107 | buildTarget: Android 108 | maxTextureSize: 2048 109 | resizeAlgorithm: 0 110 | textureFormat: -1 111 | textureCompression: 1 112 | compressionQuality: 50 113 | crunchedCompression: 0 114 | allowsAlphaSplitting: 0 115 | overridden: 0 116 | androidETC2FallbackOverride: 0 117 | forceMaximumCompressionQuality_BC6H_BC7: 0 118 | - serializedVersion: 3 119 | buildTarget: iPhone 120 | maxTextureSize: 2048 121 | resizeAlgorithm: 0 122 | textureFormat: -1 123 | textureCompression: 1 124 | compressionQuality: 50 125 | crunchedCompression: 0 126 | allowsAlphaSplitting: 0 127 | overridden: 0 128 | androidETC2FallbackOverride: 0 129 | forceMaximumCompressionQuality_BC6H_BC7: 0 130 | - serializedVersion: 3 131 | buildTarget: WebGL 132 | maxTextureSize: 2048 133 | resizeAlgorithm: 0 134 | textureFormat: -1 135 | textureCompression: 1 136 | compressionQuality: 50 137 | crunchedCompression: 0 138 | allowsAlphaSplitting: 0 139 | overridden: 0 140 | androidETC2FallbackOverride: 0 141 | forceMaximumCompressionQuality_BC6H_BC7: 0 142 | spriteSheet: 143 | serializedVersion: 2 144 | sprites: [] 145 | outline: [] 146 | physicsShape: [] 147 | bones: [] 148 | spriteID: 149 | internalID: 0 150 | vertices: [] 151 | indices: 152 | edges: [] 153 | weights: [] 154 | secondaryTextures: [] 155 | nameFileIdTable: {} 156 | mipmapLimitGroupName: 157 | pSDRemoveMatte: 0 158 | userData: 159 | assetBundleName: 160 | assetBundleVariant: 161 | -------------------------------------------------------------------------------- /Editor/SheetsImporter/SpreadsheetHandler.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | 7 | using Core.Runtime; 8 | using UniGame.Runtime.DataFlow; 9 | using UnityEngine; 10 | using UnityEngine.UIElements; 11 | 12 | #if ALCHEMY_INSPECTOR 13 | using Alchemy.Inspector; 14 | #endif 15 | 16 | #if ODIN_INSPECTOR 17 | using Sirenix.OdinInspector; 18 | #endif 19 | 20 | [Serializable] 21 | public class SpreadsheetHandler : ISpreadsheetAssetsProcessor, IResettable 22 | { 23 | private static Color _oddColor = new(0.2f, 0.4f, 0.3f); 24 | 25 | #region inspector 26 | 27 | public string importerName = string.Empty; 28 | 29 | #if ODIN_INSPECTOR 30 | [InfoBox("Reload spreadsheet on each reimport action")] 31 | #endif 32 | [Tooltip("Reload spreadsheet on each reimport action")] 33 | public bool autoReloadSpreadsheetOnImport = true; 34 | 35 | #if ODIN_INSPECTOR 36 | [ListDrawerSettings(ElementColor = nameof(GetElementColor),ListElementLabelName = "Name")] 37 | #endif 38 | #if ALCHEMY_INSPECTOR 39 | [ListViewSettings(ShowAlternatingRowBackgrounds = AlternatingRowBackground.All, 40 | ShowFoldoutHeader = false,Reorderable = true)] 41 | #endif 42 | public List importers = new(); 43 | 44 | #endregion 45 | 46 | #region private data 47 | 48 | private ISpreadsheetData _spreadsheetData; 49 | private IGoogleSpreadsheetClient _client; 50 | private LifeTime _lifeTime = new (); 51 | 52 | #endregion 53 | 54 | public string Name => string.IsNullOrEmpty(importerName) ? GetType().Name : importerName; 55 | 56 | public ILifeTime LifeTime => _lifeTime ??= new LifeTime(); 57 | 58 | public IEnumerable Importers => importers 59 | .Where(x => x.HasValue) 60 | .Select(x => x.Value); 61 | 62 | public bool CanImport => true; 63 | public bool CanExport => true; 64 | 65 | public void Reset() => _lifeTime?.Restart(); 66 | 67 | public void Initialize(IGoogleSpreadsheetClient client) 68 | { 69 | Reset(); 70 | 71 | _client = client; 72 | _spreadsheetData = client.SpreadsheetData; 73 | 74 | foreach (var importer in Importers) 75 | { 76 | importer.Initialize(client); 77 | } 78 | 79 | LifeTime.AddCleanUpAction(() => _client = null); 80 | LifeTime.AddCleanUpAction(() => _spreadsheetData = null); 81 | } 82 | 83 | public ISpreadsheetData Import() 84 | { 85 | return Import(_spreadsheetData); 86 | } 87 | 88 | public ISpreadsheetData Export() 89 | { 90 | var data = Export(_spreadsheetData); 91 | return ExportSheets(data); 92 | } 93 | 94 | public ISpreadsheetData ExportSheets(ISpreadsheetData data) 95 | { 96 | var sheets = data.Sheets.ToList(); 97 | foreach (var sheetData in sheets.Where(sheetData => sheetData.IsChanged)) 98 | { 99 | _client.Upload(sheetData); 100 | } 101 | 102 | return data; 103 | } 104 | 105 | public ISpreadsheetData Import(ISpreadsheetData spreadsheetData) 106 | { 107 | if (autoReloadSpreadsheetOnImport) 108 | _client.ReloadAll(); 109 | 110 | var importItems = Importers 111 | .Where(x => x.CanImport) 112 | .ToList(); 113 | 114 | foreach (var importer in importItems) 115 | { 116 | var importerResult = importer.Import(spreadsheetData); 117 | } 118 | 119 | return spreadsheetData; 120 | } 121 | 122 | public ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 123 | { 124 | foreach (var importer in Importers.Where(x => x.CanImport)) 125 | { 126 | importer.Import(spreadsheetData); 127 | } 128 | 129 | return spreadsheetData; 130 | } 131 | 132 | public ISpreadsheetData ExportObjects(ISpreadsheetData data) 133 | { 134 | var stage = data; 135 | 136 | foreach (var importer in Importers.Where(x => x.CanImport)) 137 | { 138 | stage = importer.Export(data); 139 | } 140 | 141 | return stage; 142 | } 143 | 144 | public ISpreadsheetData Export(ISpreadsheetData data) 145 | { 146 | foreach (var importer in Importers.Where(x => x.CanExport)) 147 | { 148 | Export(data, importer); 149 | } 150 | 151 | return data; 152 | } 153 | 154 | public virtual string FormatName(string assetName) => assetName; 155 | 156 | private ISpreadsheetData Export(ISpreadsheetData data, ISpreadsheetAssetsProcessor importer) 157 | { 158 | return importer.Export(data); 159 | } 160 | 161 | private ISpreadsheetData Import(ISpreadsheetData data, ISpreadsheetAssetsProcessor importer) 162 | { 163 | return importer.Import(data); 164 | } 165 | 166 | public virtual void Start() 167 | { 168 | } 169 | 170 | 171 | private Color GetElementColor(int index, Color defaultColor) 172 | { 173 | var result = index % 2 == 0 174 | ? _oddColor : defaultColor; 175 | return result; 176 | } 177 | 178 | private string GetImporterName(SpreadsheetProcessorValue importer) 179 | { 180 | return importer.HasValue == false ? "EMPTY" : importer.Value.Name; 181 | } 182 | } 183 | } -------------------------------------------------------------------------------- /Editor/SheetsImporter/Importers/PipelineImporter.cs: -------------------------------------------------------------------------------- 1 | namespace UniGame.GoogleSpreadsheets.Editor 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using UniCore.Runtime.ProfilerTools; 7 | using UnityEditor; 8 | using UnityEngine; 9 | 10 | #if ODIN_INSPECTOR 11 | using Sirenix.OdinInspector; 12 | using Sirenix.Utilities.Editor; 13 | 14 | #endif 15 | 16 | [CreateAssetMenu(menuName = "UniGame/Google/PipelineImporter",fileName = nameof(PipelineImporter))] 17 | public class PipelineImporter : BaseSpreadsheetProcessor 18 | { 19 | private static Color _oddColor = new(0.2f, 0.4f, 0.3f); 20 | 21 | #if ODIN_INSPECTOR 22 | [Tooltip("If true, the asset database will not be refreshed after importing. This is useful if you want to import assets without having them show up in the project view.")] 23 | #endif 24 | public bool disableDBOnImport = false; 25 | 26 | #if ODIN_INSPECTOR 27 | [Tooltip("If true, the asset database will not be refreshed after importing. This is useful if you want to import assets without having them show up in the project view.")] 28 | #endif 29 | public bool disableDBOnExport = false; 30 | 31 | #if ODIN_INSPECTOR 32 | [Tooltip("if true, reimport all assets on each step")] 33 | #endif 34 | public bool reimportOnStep = false; 35 | 36 | #if ODIN_INSPECTOR 37 | [ListDrawerSettings(ElementColor = nameof(GetElementColor),ListElementLabelName = "Name")]//OnEndListElementGUI = "BeginDrawImporterElement" 38 | #endif 39 | public List importers = new(); 40 | 41 | public override bool CanImport => importers 42 | .Where(x => x.HasValue) 43 | .Any(x => x.Value.CanImport); 44 | 45 | public override bool CanExport => importers 46 | .Where(x => x.HasValue) 47 | .Any(x => x.Value.CanExport); 48 | 49 | public bool IsValidData => Client!= null && 50 | Client.Status !=null && 51 | Client.Status.HasConnectedSheets; 52 | 53 | public override ISpreadsheetData ExportObjects(ISpreadsheetData data) 54 | { 55 | if (disableDBOnExport) 56 | AssetDatabase.StartAssetEditing(); 57 | try 58 | { 59 | var items = importers 60 | .Where(x => x.HasValue && x.Value.CanExport); 61 | 62 | foreach (var exporter in items) 63 | { 64 | exporter.Value.Export(data); 65 | if (reimportOnStep) 66 | { 67 | AssetDatabase.SaveAssets(); 68 | AssetDatabase.Refresh(); 69 | } 70 | } 71 | } 72 | catch (Exception e) 73 | { 74 | GameLog.LogError(e); 75 | return data; 76 | } 77 | finally 78 | { 79 | if (disableDBOnExport) 80 | { 81 | AssetDatabase.StopAssetEditing(); 82 | } 83 | } 84 | 85 | return data; 86 | } 87 | 88 | public sealed override ISpreadsheetData ImportObjects(ISpreadsheetData spreadsheetData) 89 | { 90 | var stage = new List(); 91 | 92 | if (disableDBOnImport) 93 | AssetDatabase.StartAssetEditing(); 94 | 95 | try 96 | { 97 | foreach (var importer in importers 98 | .Where(x => x.HasValue)) 99 | { 100 | var value = importer.Value; 101 | value.Import(spreadsheetData); 102 | 103 | if (reimportOnStep) 104 | { 105 | AssetDatabase.SaveAssets(); 106 | AssetDatabase.Refresh(); 107 | } 108 | } 109 | 110 | stage = OnPostImport(stage).ToList(); 111 | } 112 | catch (Exception e) 113 | { 114 | GameLog.LogError(e); 115 | } 116 | finally 117 | { 118 | if (disableDBOnImport) 119 | { 120 | //By adding a call to StopAssetEditing inside 121 | //a "finally" block, we ensure the AssetDatabase 122 | //state will be reset when leaving this function 123 | AssetDatabase.StopAssetEditing(); 124 | } 125 | } 126 | 127 | return spreadsheetData; 128 | } 129 | 130 | 131 | protected override void OnInitialize(IGoogleSpreadsheetClient client) 132 | { 133 | base.OnInitialize(client); 134 | 135 | foreach (var importer in importers.Where(x => x.HasValue)) 136 | { 137 | var value = importer.Value; 138 | value.Initialize(client); 139 | } 140 | } 141 | 142 | 143 | protected virtual IEnumerable OnPreImport(IEnumerable sourceImporters) 144 | { 145 | return sourceImporters; 146 | } 147 | 148 | protected virtual IEnumerable OnPostImport(IEnumerable importedAssets) 149 | { 150 | return importedAssets; 151 | } 152 | 153 | private Color GetElementColor(int index, Color defaultColor) 154 | { 155 | var result = index % 2 == 0 156 | ? _oddColor : defaultColor; 157 | return result; 158 | } 159 | 160 | private void BeginDrawImporterElement(int index) 161 | { 162 | var importer = importers[index]; 163 | var handler = importer.Value; 164 | if (handler == null) return; 165 | 166 | #if ODIN_INSPECTOR 167 | if (handler.CanImport && IsValidData && SirenixEditorGUI.SDFIconButton("import",14,SdfIconType.Download)) 168 | { 169 | handler.Initialize(Client); 170 | handler.Import(Client.SpreadsheetData); 171 | } 172 | 173 | if (handler.CanExport && IsValidData && SirenixEditorGUI.SDFIconButton("export",14,SdfIconType.Upload)) 174 | { 175 | handler.Initialize(Client); 176 | handler.Export(Client.SpreadsheetData); 177 | } 178 | #endif 179 | } 180 | 181 | } 182 | } --------------------------------------------------------------------------------