├── Art ├── Icon_Gear.png ├── Icon_Sort.png ├── Icon_Refresh.png ├── Icon_Collapse.png ├── Polygon_Circle.png ├── GAZE_UI_Panels_01.png ├── GAZE_UI_Panels_02.png ├── GAZE_UI_Panels_03.png ├── GAZE_UI_Panels_PSD.psd ├── GAZE_UI_Panels_PSD.psd.meta ├── Icon_Gear.png.meta ├── GAZE_UI_Panels_01.png.meta ├── GAZE_UI_Panels_02.png.meta ├── GAZE_UI_Panels_03.png.meta ├── Icon_Refresh.png.meta ├── Icon_Sort.png.meta ├── Icon_Collapse.png.meta └── Polygon_Circle.png.meta ├── Resources ├── Fonts │ ├── Lato-Regular.ttf │ ├── Lato-Regular SDF.asset.meta │ └── Lato-Regular.ttf.meta ├── UI │ ├── Toggle.prefab.meta │ ├── InputField.prefab.meta │ ├── MenuButton.prefab.meta │ ├── ToggleField.prefab.meta │ ├── Translator.prefab.meta │ ├── RemoveButton.prefab.meta │ ├── ConfirmationPopup.prefab.meta │ ├── Scrollbar Vertical.prefab.meta │ ├── TranslateHashElement.prefab.meta │ ├── TranslateSheetElement.prefab.meta │ ├── AddElementButton Variant.prefab.meta │ ├── RemoveButton.prefab │ ├── Scrollbar Vertical.prefab │ ├── Toggle.prefab │ ├── MenuButton.prefab │ └── ToggleField.prefab ├── UI.meta ├── FanLangs.meta ├── Fonts.meta └── FanLangs │ ├── FanLang_Mordor.asset.meta │ └── FanLang_Mordor.asset ├── StandaloneFileBrowser ├── Plugins │ ├── Ookii.Dialogs.dll │ ├── System.Windows.Forms.dll │ ├── Linux │ │ ├── x86_64 │ │ │ ├── libStandaloneFileBrowser.so │ │ │ └── libStandaloneFileBrowser.so.meta │ │ └── x86_64.meta │ ├── StandaloneFileBrowser.bundle │ │ ├── Contents │ │ │ ├── MacOS │ │ │ │ ├── StandaloneFileBrowser │ │ │ │ └── StandaloneFileBrowser.meta │ │ │ ├── MacOS.meta │ │ │ ├── Info.plist.meta │ │ │ └── Info.plist │ │ └── Contents.meta │ ├── Linux.meta │ ├── StandaloneFileBrowser.bundle.meta │ ├── StandaloneFileBrowser.jslib.meta │ ├── Ookii.Dialogs.dll.meta │ ├── System.Windows.Forms.dll.meta │ └── StandaloneFileBrowser.jslib ├── StandaloneFileBrowserLinux.cs.meta ├── Plugins.meta ├── IStandaloneFileBrowser.cs.meta ├── StandaloneFileBrowser.cs.meta ├── StandaloneFileBrowserMac.cs.meta ├── StandaloneFileBrowserEditor.cs.meta ├── StandaloneFileBrowserWindows.cs.meta ├── IStandaloneFileBrowser.cs ├── StandaloneFileBrowserEditor.cs ├── StandaloneFileBrowserLinux.cs ├── StandaloneFileBrowserMac.cs ├── StandaloneFileBrowserWindows.cs └── StandaloneFileBrowser.cs ├── README.md.meta ├── Art.meta ├── Editor.meta ├── Resources.meta ├── Scenes.meta ├── Scenes └── TranslatorScene.unity.meta ├── Scripts.meta ├── Scripts ├── Data.meta ├── UI.meta ├── Utils.meta ├── Translator.meta ├── Data │ ├── TranslateData.cs.meta │ ├── TranslateHashData.cs.meta │ ├── TranslateHashType.cs.meta │ ├── TranslateSheetData.cs.meta │ ├── TranslateHashType.cs │ ├── TranslateData.cs │ ├── TranslateHashData.cs │ └── TranslateSheetData.cs ├── UI │ ├── ButtonBinding.cs.meta │ ├── ForceLastChild.cs.meta │ ├── ToggleBinding.cs.meta │ ├── InputFieldBinding.cs.meta │ ├── TranslateDataUIElement.cs.meta │ ├── TranslateHashUIElement.cs.meta │ ├── TranslateSheetUIElement.cs.meta │ ├── ConfirmationPopupBehaviour.cs.meta │ ├── ForceLastChild.cs │ ├── ButtonBinding.cs │ ├── ToggleBinding.cs │ ├── InputFieldBinding.cs │ ├── TranslateHashUIElement.cs │ ├── ConfirmationPopupBehaviour.cs │ ├── TranslateDataUIElement.cs │ └── TranslateSheetUIElement.cs ├── Translator │ ├── Translator.cs.meta │ ├── TranslatorBehaviour.cs.meta │ ├── TranslatorSettings.cs.meta │ ├── TranslatorBehaviour.cs │ ├── Translator.cs │ └── TranslatorSettings.cs └── Utils │ ├── DisposableContainer.cs.meta │ └── DisposableContainer.cs ├── StandaloneFileBrowser.meta ├── Editor ├── ColorSwatches.colors.meta └── ColorSwatches.colors ├── LICENSE ├── .gitignore └── README.md /Art/Icon_Gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/Icon_Gear.png -------------------------------------------------------------------------------- /Art/Icon_Sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/Icon_Sort.png -------------------------------------------------------------------------------- /Art/Icon_Refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/Icon_Refresh.png -------------------------------------------------------------------------------- /Art/Icon_Collapse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/Icon_Collapse.png -------------------------------------------------------------------------------- /Art/Polygon_Circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/Polygon_Circle.png -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/GAZE_UI_Panels_01.png -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/GAZE_UI_Panels_02.png -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/GAZE_UI_Panels_03.png -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_PSD.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Art/GAZE_UI_Panels_PSD.psd -------------------------------------------------------------------------------- /Resources/Fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/Resources/Fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Ookii.Dialogs.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/StandaloneFileBrowser/Plugins/Ookii.Dialogs.dll -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserLinux.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5d3a668018554b8a89c3fe12de72b60c 3 | timeCreated: 1538067919 -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/System.Windows.Forms.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Linux/x86_64/libStandaloneFileBrowser.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/StandaloneFileBrowser/Plugins/Linux/x86_64/libStandaloneFileBrowser.so -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bfdaa2c45991f5a4489a84408dec4b78 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Art.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: feab8b5913cf3744a97b46d084002bb0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI/Toggle.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0080b5860a9ec1744a99e89d8b0c5543 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 56e5a9b3503504442bc511e4074ccf49 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9883585983a8ac944a02e00d85e1bb64 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI/InputField.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2588d26a329c17245be478b3a4e552d5 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/MenuButton.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ee433d8eabde2d24fa93eac3a51b275c 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/ToggleField.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cfb97dfec0a2c284d80e160be30a196e 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/Translator.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8683f6dee7db1824f92ab3bebfb9807a 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 281fe1bb905bf5d4cb35fb5e769ff83c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scenes/TranslatorScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c690f473a0bc84a42bf8bd17bc72594e 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6391fd81cae4d60479fe165f17a47322 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5af84e6ee5a050c41afc534a43af5348 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI/RemoveButton.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 07e36cb96e3db1b4fa7bf262ad14987d 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Scripts/Data.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d1e5e87468c878244a53a9e5e0af36f9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/UI.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 78b910e42e114d74b81008d8792ecd97 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Utils.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7d2b501532511e049a579f0426e9e3dc 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/FanLangs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5d1f9e3d11aaabd428b4ec97bece4137 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/Fonts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c92ae5e9b53d1834ab89a72507cfa27c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI/ConfirmationPopup.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9dd9195d5ccc62d4983d94239bace5f8 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/Scrollbar Vertical.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f735da810e737240996c8fc85b580b4 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/TranslateHashElement.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6ec5f8a7d42000d4d8f1b34b313f1e77 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/UI/TranslateSheetElement.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2cc4c7dac3f6e3d4982f62dcefb3823f 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Scripts/Translator.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f5de31fd53e4c3e4ba6078665711a96f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/UI/AddElementButton Variant.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ef10b4a6db0becc47ba545adbae5f748 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /StandaloneFileBrowser.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 57e25b4a578dba94c9353f4633b20549 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ddc4e7b83981f244ba9a26b88c18cb67 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mickboere/fanlang/HEAD/StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser -------------------------------------------------------------------------------- /Editor/ColorSwatches.colors.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b1ec397499ac2c448b728cad80b42ed6 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/FanLangs/FanLang_Mordor.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c9bc7ef3703c2b44b99d7fd24f46205f 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/Fonts/Lato-Regular SDF.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1922ad64e9e9dbe4f881091755ffe671 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 996ea0b0fb9804844ba9595686ee3e7a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a5a66f5db020f344c9327188aec2c060 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/Info.plist.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce685769797f44046afa3e567860c94c 3 | timeCreated: 1505756861 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Linux.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 82666e520ab4d4cf08bebbb8059cd6f4 3 | folderAsset: yes 4 | timeCreated: 1538224809 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ddf122e0e89124ce78aacfeecb3ec554 3 | timeCreated: 1508179371 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Linux/x86_64.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bd198408642944765b9305bd99404136 3 | folderAsset: yes 4 | timeCreated: 1538230728 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d67e832f3b27de94489cd7ab8abb7ca5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/ButtonBinding.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 09bee59b7020a8e4bb1f43b77d579735 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/ForceLastChild.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ab378ac6d9118384d85d46419cf3a9cf 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/ToggleBinding.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5c37263815237ed449c77350901d2c6d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateHashData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f67b1455781b07f4995956e953f927ad 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateHashType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d2125d775b6631a49b7be1f996d4df6e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateSheetData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 62da9986309f1ac4b88f7783a040e71e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Translator/Translator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9cdc5fed4d29b1e41b12c9c9b4ac4649 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/InputFieldBinding.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4a3333e8ccb56234889d64acdbba5370 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/TranslateDataUIElement.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: abda284bb3ce03b408d3158bb900091a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/TranslateHashUIElement.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c5b1a6c1df4c7f4fa4ca1fa2a2078ae 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/TranslateSheetUIElement.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f0335455a30887e469820fdac85789e4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Utils/DisposableContainer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dcc9d34404364294f9f4a4ca17f17e3d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Translator/TranslatorBehaviour.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 778738a14f9f5424d969eeec33ba7fe6 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Translator/TranslatorSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 10bfbe4f460d7624a941ea63249f3336 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/UI/ConfirmationPopupBehaviour.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f5e5843977dc3174d9d18bb4366b907d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/IStandaloneFileBrowser.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7609f7b6787a54496aa41a3053fcc76a 3 | timeCreated: 1483902788 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowser.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3c708be74128e4ced9b79eaaf80e8443 3 | timeCreated: 1483902788 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserMac.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bcb49ddb0ed5644fda9c3b055cafa27a 3 | timeCreated: 1483902788 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2650af8de2cda46b99b1bc7cf5d30ca5 3 | timeCreated: 1483902788 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserWindows.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 194e247414a78461d83ae606c1b96917 3 | timeCreated: 1483902788 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateHashType.cs: -------------------------------------------------------------------------------- 1 | namespace FanLang 2 | { 3 | /// 4 | /// Defines what type of translate hash we're dealing with, 5 | /// has consequences for how the handles specific situations when replacing characters. 6 | /// 7 | public enum TranslateHashType 8 | { 9 | Default = 0, 10 | Prefix = 1, 11 | Suffix = 2, 12 | Word = 3 13 | } 14 | } -------------------------------------------------------------------------------- /Scripts/UI/ForceLastChild.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace FanLang 4 | { 5 | /// 6 | /// Simple that forces the object to always be the last child in its parent's hierarchy. 7 | /// 8 | public class ForceLastChild : MonoBehaviour 9 | { 10 | protected void LateUpdate() 11 | { 12 | if (transform.GetSiblingIndex() != transform.parent.childCount - 1) 13 | { 14 | transform.SetSiblingIndex(transform.parent.childCount - 1); 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /Resources/Fonts/Lato-Regular.ttf.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9913e0d3b3b875640b7d9b0e4bd1b1ff 3 | TrueTypeFontImporter: 4 | externalObjects: {} 5 | serializedVersion: 4 6 | fontSize: 16 7 | forceTextureCase: -2 8 | characterSpacing: 0 9 | characterPadding: 1 10 | includeFontData: 1 11 | fontNames: 12 | - Lato 13 | fallbackFontReferences: [] 14 | customCharacters: 15 | fontRenderingMode: 0 16 | ascentCalculationMode: 1 17 | useLegacyBoundsCalculation: 0 18 | shouldRoundAdvanceValue: 1 19 | userData: 20 | assetBundleName: 21 | assetBundleVariant: 22 | -------------------------------------------------------------------------------- /Scripts/UI/ButtonBinding.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UI; 2 | using System; 3 | 4 | namespace FanLang 5 | { 6 | /// 7 | /// binding that makes it easier to manage onClick subscriptions. 8 | /// 9 | public class ButtonBinding : IDisposable 10 | { 11 | private Button button; 12 | private Action callback; 13 | 14 | public ButtonBinding(Button button, Action callback) 15 | { 16 | this.button = button; 17 | this.callback = callback; 18 | 19 | button.onClick.AddListener(OnClickedButton); 20 | } 21 | 22 | public void Dispose() 23 | { 24 | if (button != null) 25 | { 26 | button.onClick.RemoveListener(OnClickedButton); 27 | } 28 | } 29 | 30 | private void OnClickedButton() 31 | { 32 | callback(); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /StandaloneFileBrowser/IStandaloneFileBrowser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SFB { 4 | public interface IStandaloneFileBrowser { 5 | string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect); 6 | string[] OpenFolderPanel(string title, string directory, bool multiselect); 7 | string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions); 8 | 9 | void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb); 10 | void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb); 11 | void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Scripts/UI/ToggleBinding.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UI; 2 | using System; 3 | 4 | namespace FanLang 5 | { 6 | /// 7 | /// binding that makes it easier to manage toggle value change subscriptions. 8 | /// 9 | public class ToggleBinding : IDisposable 10 | { 11 | private Toggle toggle; 12 | private Func getData; 13 | private Action setData; 14 | 15 | public ToggleBinding(Toggle toggle, Func getData, Action setData) 16 | { 17 | this.toggle = toggle; 18 | this.getData = getData; 19 | this.setData = setData; 20 | 21 | toggle.SetIsOnWithoutNotify(getData()); 22 | toggle.onValueChanged.AddListener(OnInputChanged); 23 | } 24 | 25 | public void Dispose() 26 | { 27 | if (toggle != null) 28 | { 29 | toggle.onValueChanged.RemoveListener(OnInputChanged); 30 | } 31 | } 32 | 33 | private void OnInputChanged(bool value) 34 | { 35 | setData(value); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 110fdfb459db4fc448a2ccd37e200fa4 3 | folderAsset: yes 4 | PluginImporter: 5 | externalObjects: {} 6 | serializedVersion: 2 7 | iconMap: {} 8 | executionOrder: {} 9 | isPreloaded: 0 10 | isOverridable: 0 11 | platformData: 12 | - first: 13 | Any: 14 | second: 15 | enabled: 0 16 | settings: {} 17 | - first: 18 | Editor: Editor 19 | second: 20 | enabled: 1 21 | settings: 22 | DefaultValueInitialized: true 23 | - first: 24 | Standalone: OSXIntel 25 | second: 26 | enabled: 1 27 | settings: {} 28 | - first: 29 | Standalone: OSXIntel64 30 | second: 31 | enabled: 1 32 | settings: {} 33 | - first: 34 | Standalone: OSXUniversal 35 | second: 36 | enabled: 1 37 | settings: {} 38 | userData: 39 | assetBundleName: 40 | assetBundleVariant: 41 | -------------------------------------------------------------------------------- /Scripts/UI/InputFieldBinding.cs: -------------------------------------------------------------------------------- 1 | using TMPro; 2 | using System; 3 | 4 | namespace FanLang 5 | { 6 | /// 7 | /// binding that makes it easier to manage input data changes. 8 | /// 9 | public class InputFieldBinding : IDisposable 10 | { 11 | private TMP_InputField inputField; 12 | private Func getData; 13 | private Action setData; 14 | 15 | public InputFieldBinding(TMP_InputField inputField, Func getData, Action setData) 16 | { 17 | this.inputField = inputField; 18 | this.getData = getData; 19 | this.setData = setData; 20 | 21 | inputField.SetTextWithoutNotify(getData()); 22 | inputField.onValueChanged.AddListener(OnInputChanged); 23 | } 24 | 25 | public void Dispose() 26 | { 27 | if (inputField != null) 28 | { 29 | inputField.onValueChanged.RemoveListener(OnInputChanged); 30 | } 31 | } 32 | 33 | private void OnInputChanged(string text) 34 | { 35 | setData(text); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Mick Boere 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Asset meta data should only be ignored when the corresponding asset is also ignored 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace FanLang 6 | { 7 | /// 8 | /// The root data object of a FanLang. 9 | /// Contains basic meta data about the FanLang as well as a collection of s used for translation. 10 | /// 11 | [Serializable] 12 | public class TranslateData : ICloneable 13 | { 14 | /// 15 | /// Unique ID (often of type ) used for identifying the language data. 16 | /// 17 | public string ID; 18 | 19 | /// 20 | /// The name of the language. 21 | /// 22 | public string Name; 23 | 24 | /// 25 | /// A description of the language. Could contain some lore, how to use it, etc. 26 | /// 27 | public string Description; 28 | 29 | /// 30 | /// The actual data used to translate our input. 31 | /// 32 | public List TranslateSheets; 33 | 34 | public TranslateData(string id, string name, string description, List translateSheets) 35 | { 36 | ID = id; 37 | Name = name; 38 | Description = description; 39 | TranslateSheets = translateSheets; 40 | } 41 | 42 | public object Clone() 43 | { 44 | return new TranslateData(ID, Name, Description, TranslateSheets.Select((x) => (TranslateSheetData)x.Clone()).ToList()); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /Editor/ColorSwatches.colors: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 52 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: 12323, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: ColorSwatches 14 | m_EditorClassIdentifier: 15 | m_Presets: 16 | - m_Name: 17 | m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} 18 | - m_Name: 19 | m_Color: {r: 0.25, g: 0.25, b: 0.25, a: 1} 20 | - m_Name: 21 | m_Color: {r: 0.375, g: 0.375, b: 0.375, a: 1} 22 | - m_Name: 23 | m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 1} 24 | - m_Name: 25 | m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 1} 26 | - m_Name: 27 | m_Color: {r: 0.85, g: 0.85, b: 0.85, a: 1} 28 | - m_Name: 29 | m_Color: {r: 0.95, g: 0.95, b: 0.95, a: 1} 30 | - m_Name: 31 | m_Color: {r: 1, g: 1, b: 1, a: 1} 32 | - m_Name: 33 | m_Color: {r: 0.23529413, g: 0.2392157, b: 0.2509804, a: 1} 34 | - m_Name: 35 | m_Color: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 36 | - m_Name: 37 | m_Color: {r: 0.18823531, g: 0.1764706, b: 0.5176471, a: 1} 38 | - m_Name: 39 | m_Color: {r: 0.4156863, g: 0.427451, b: 0.5529412, a: 1} 40 | - m_Name: 41 | m_Color: {r: 0.7254902, g: 0.7411765, b: 0.7058824, a: 1} 42 | -------------------------------------------------------------------------------- /Scripts/Data/TranslateHashData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FanLang 4 | { 5 | /// 6 | /// The data that decides the output of the FanLang. 7 | /// Contains a Input, a Output and a to allow for a range of configurable FanLangs. 8 | /// 9 | [Serializable] 10 | public class TranslateHashData : ICloneable 11 | { 12 | /// 13 | /// Should this hash be used? 14 | /// 15 | public bool Enabled; 16 | 17 | /// 18 | /// The input characters required to produce the defined output. 19 | /// 20 | public string Input; 21 | 22 | /// 23 | /// The ouput used to translate the defined input. 24 | /// 25 | public string Output; 26 | 27 | /// 28 | /// Defines the context in which the output is allowed to be used. 29 | /// 30 | public TranslateHashType HashType; 31 | 32 | public TranslateHashData() 33 | { 34 | Enabled = true; 35 | Input = ""; 36 | Output = ""; 37 | HashType = TranslateHashType.Default; 38 | } 39 | 40 | public TranslateHashData(bool enabled, string input, string output, TranslateHashType hashType) 41 | { 42 | Enabled = enabled; 43 | Input = input; 44 | Output = output; 45 | HashType = hashType; 46 | } 47 | 48 | public object Clone() 49 | { 50 | return new TranslateHashData(Enabled, Input, Output, HashType); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /Scripts/Data/TranslateSheetData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace FanLang 6 | { 7 | /// 8 | /// Data object containing s. 9 | /// You can use multiple s to perform several iterations over the output in order to generate more complex languages. 10 | /// 11 | [Serializable] 12 | public class TranslateSheetData : ICloneable 13 | { 14 | /// 15 | /// Should the data in this sheet be used? 16 | /// 17 | public bool Enabled; 18 | 19 | /// 20 | /// The name of this sheet. 21 | /// 22 | public string Name; 23 | 24 | /// 25 | /// List containing the translate hashes which are used for the actual translation of the input. 26 | /// 27 | public List TranslateHashes; 28 | 29 | public TranslateSheetData() 30 | { 31 | Enabled = true; 32 | Name = "New Sheet"; 33 | TranslateHashes = new List(); 34 | TranslateHashes.Add(new TranslateHashData()); 35 | } 36 | 37 | public TranslateSheetData(bool enabled, string name, List translateHashes) 38 | { 39 | Enabled = enabled; 40 | Name = name; 41 | TranslateHashes = translateHashes; 42 | } 43 | 44 | public object Clone() 45 | { 46 | return new TranslateSheetData(Enabled, Name, TranslateHashes.Select((x) => (TranslateHashData)x.Clone()).ToList()); 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 18A391 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | StandaloneFileBrowser 11 | CFBundleIdentifier 12 | com.gkngkc.sfb 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | StandaloneFileBrowser 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.0 29 | CSResourcesFileMapped 30 | 31 | DTCompiler 32 | com.apple.compilers.llvm.clang.1_0 33 | DTPlatformBuild 34 | 10A255 35 | DTPlatformVersion 36 | GM 37 | DTSDKBuild 38 | 18A384 39 | DTSDKName 40 | macosx10.14 41 | DTXcode 42 | 1000 43 | DTXcodeBuild 44 | 10A255 45 | 46 | 47 | -------------------------------------------------------------------------------- /Resources/FanLangs/FanLang_Mordor.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: 38d114a20619afa4abb49ed77ecf3d44, type: 3} 13 | m_Name: FanLang_Mordor 14 | m_EditorClassIdentifier: 15 | translateData: 16 | TranslateSheets: 17 | - Enabled: 1 18 | Name: New Sheet 19 | TranslateHashes: 20 | - Enabled: 1 21 | Input: d 22 | Output: m 23 | HashType: 0 24 | - Enabled: 1 25 | Input: a 26 | Output: o 27 | HashType: 0 28 | - Enabled: 1 29 | Input: k 30 | Output: r 31 | HashType: 0 32 | - Enabled: 1 33 | Input: n 34 | Output: d 35 | HashType: 0 36 | - Enabled: 1 37 | Input: ess 38 | Output: or 39 | HashType: 0 40 | - Enabled: 1 41 | Input: th 42 | Output: l 43 | HashType: 0 44 | - Enabled: 1 45 | Input: e 46 | Output: a 47 | HashType: 0 48 | - Enabled: 1 49 | Input: ed 50 | Output: k 51 | HashType: 0 52 | - Enabled: 1 53 | Input: in 54 | Output: i 55 | HashType: 0 56 | - Enabled: 1 57 | Name: New Sheet 58 | TranslateHashes: 59 | - Enabled: 1 60 | Input: rr 61 | Output: r 62 | HashType: 0 63 | -------------------------------------------------------------------------------- /Scripts/Utils/DisposableContainer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FanLang 5 | { 6 | /// 7 | /// Container object which allows for easy disposing of multiple s. 8 | /// 9 | public class DisposableContainer 10 | { 11 | private List disposables; 12 | 13 | public DisposableContainer() 14 | { 15 | disposables = new List(); 16 | } 17 | 18 | public DisposableContainer(List disposables) 19 | { 20 | this.disposables = disposables; 21 | } 22 | 23 | /// 24 | /// Adds new to the container. 25 | /// 26 | /// 27 | public void Add(IDisposable disposable) 28 | { 29 | disposables.Add(disposable); 30 | } 31 | 32 | /// 33 | /// Removes the from the container but doesn't dispose it. 34 | /// 35 | /// 36 | public void Remove(IDisposable disposable) 37 | { 38 | disposables.Remove(disposable); 39 | } 40 | 41 | /// 42 | /// Disposes of and removes from container. 43 | /// 44 | public void Dispose(IDisposable disposable) 45 | { 46 | Remove(disposable); 47 | disposable.Dispose(); 48 | } 49 | 50 | /// 51 | /// Disposes of all the stored s and clears the container. 52 | /// The container itself is not disposed of. 53 | /// 54 | public void Dispose() 55 | { 56 | foreach (IDisposable disposable in disposables) 57 | { 58 | disposable.Dispose(); 59 | } 60 | disposables.Clear(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.jslib.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 265aaf20a6d564e0fb00a9c4a7a9c300 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | isPreloaded: 0 9 | isOverridable: 0 10 | platformData: 11 | - first: 12 | '': Any 13 | second: 14 | enabled: 0 15 | settings: 16 | Exclude Editor: 1 17 | Exclude Linux: 1 18 | Exclude Linux64: 1 19 | Exclude LinuxUniversal: 1 20 | Exclude OSXUniversal: 1 21 | Exclude Win: 1 22 | Exclude Win64: 1 23 | - first: 24 | Any: 25 | second: 26 | enabled: 0 27 | settings: {} 28 | - first: 29 | Editor: Editor 30 | second: 31 | enabled: 0 32 | settings: 33 | CPU: AnyCPU 34 | DefaultValueInitialized: true 35 | OS: AnyOS 36 | - first: 37 | Facebook: WebGL 38 | second: 39 | enabled: 1 40 | settings: {} 41 | - first: 42 | Facebook: Win 43 | second: 44 | enabled: 0 45 | settings: 46 | CPU: AnyCPU 47 | - first: 48 | Facebook: Win64 49 | second: 50 | enabled: 0 51 | settings: 52 | CPU: AnyCPU 53 | - first: 54 | Standalone: Linux 55 | second: 56 | enabled: 0 57 | settings: 58 | CPU: x86 59 | - first: 60 | Standalone: Linux64 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: x86_64 65 | - first: 66 | Standalone: LinuxUniversal 67 | second: 68 | enabled: 0 69 | settings: 70 | CPU: None 71 | - first: 72 | Standalone: OSXUniversal 73 | second: 74 | enabled: 0 75 | settings: 76 | CPU: AnyCPU 77 | - first: 78 | Standalone: Win 79 | second: 80 | enabled: 0 81 | settings: 82 | CPU: AnyCPU 83 | - first: 84 | Standalone: Win64 85 | second: 86 | enabled: 0 87 | settings: 88 | CPU: AnyCPU 89 | - first: 90 | WebGL: WebGL 91 | second: 92 | enabled: 1 93 | settings: {} 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_PSD.psd.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 05e9e8c46e8481843a38b26063436cc2 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 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: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 2048 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | spriteSheet: 77 | serializedVersion: 2 78 | sprites: [] 79 | outline: [] 80 | physicsShape: [] 81 | bones: [] 82 | spriteID: 5e97eb03825dee720800000000000000 83 | internalID: 0 84 | vertices: [] 85 | indices: 86 | edges: [] 87 | weights: [] 88 | secondaryTextures: [] 89 | spritePackingTag: 90 | pSDRemoveMatte: 0 91 | pSDShowRemoveMatteOption: 0 92 | userData: 93 | assetBundleName: 94 | assetBundleVariant: 95 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_EDITOR 2 | 3 | using System; 4 | using UnityEditor; 5 | 6 | namespace SFB { 7 | public class StandaloneFileBrowserEditor : IStandaloneFileBrowser { 8 | public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) { 9 | string path = ""; 10 | 11 | if (extensions == null) { 12 | path = EditorUtility.OpenFilePanel(title, directory, ""); 13 | } 14 | else { 15 | path = EditorUtility.OpenFilePanelWithFilters(title, directory, GetFilterFromFileExtensionList(extensions)); 16 | } 17 | 18 | return string.IsNullOrEmpty(path) ? new string[0] : new[] { path }; 19 | } 20 | 21 | public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb) { 22 | cb.Invoke(OpenFilePanel(title, directory, extensions, multiselect)); 23 | } 24 | 25 | public string[] OpenFolderPanel(string title, string directory, bool multiselect) { 26 | var path = EditorUtility.OpenFolderPanel(title, directory, ""); 27 | return string.IsNullOrEmpty(path) ? new string[0] : new[] {path}; 28 | } 29 | 30 | public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb) { 31 | cb.Invoke(OpenFolderPanel(title, directory, multiselect)); 32 | } 33 | 34 | public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) { 35 | var ext = extensions != null ? extensions[0].Extensions[0] : ""; 36 | var name = string.IsNullOrEmpty(ext) ? defaultName : defaultName + "." + ext; 37 | return EditorUtility.SaveFilePanel(title, directory, name, ext); 38 | } 39 | 40 | public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb) { 41 | cb.Invoke(SaveFilePanel(title, directory, defaultName, extensions)); 42 | } 43 | 44 | // EditorUtility.OpenFilePanelWithFilters extension filter format 45 | private static string[] GetFilterFromFileExtensionList(ExtensionFilter[] extensions) { 46 | var filters = new string[extensions.Length * 2]; 47 | for (int i = 0; i < extensions.Length; i++) { 48 | filters[(i * 2)] = extensions[i].Name; 49 | filters[(i * 2) + 1] = string.Join(",", extensions[i].Extensions); 50 | } 51 | return filters; 52 | } 53 | } 54 | } 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /Scripts/UI/TranslateHashUIElement.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using TMPro; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | 8 | namespace FanLang 9 | { 10 | /// 11 | /// UI element handling the showing and updating of a 's data. 12 | /// 13 | public class TranslateHashUIElement : MonoBehaviour 14 | { 15 | public event Action TranslateDataChangedEvent; 16 | public event Action RequestDeleteEvent; 17 | 18 | [SerializeField] private Toggle enabledToggle; 19 | [SerializeField] private TMP_InputField inputField; 20 | [SerializeField] private TMP_InputField outputField; 21 | [SerializeField] private TMP_Dropdown hashTypeDropdown; 22 | [SerializeField] private Button deleteHashButton; 23 | 24 | private TranslateHashData hashData; 25 | private DisposableContainer disposables = new DisposableContainer(); 26 | 27 | public void Initialize(TranslateHashData hashData) 28 | { 29 | CleanUp(); 30 | this.hashData = hashData; 31 | 32 | // Set up bindings. 33 | disposables.Add(new ToggleBinding( 34 | enabledToggle, 35 | () => hashData.Enabled, 36 | delegate (bool v) 37 | { 38 | hashData.Enabled = v; 39 | OnDataChange(); 40 | })); 41 | disposables.Add(new InputFieldBinding( 42 | inputField, 43 | () => hashData.Input, 44 | delegate (string t) 45 | { 46 | hashData.Input = t; 47 | OnDataChange(); 48 | })); 49 | disposables.Add(new InputFieldBinding( 50 | outputField, 51 | () => hashData.Output, 52 | delegate (string t) 53 | { 54 | hashData.Output = t; 55 | OnDataChange(); 56 | })); 57 | disposables.Add(new ButtonBinding(deleteHashButton, () => RequestDeleteEvent?.Invoke(hashData))); 58 | 59 | // Fill the dropdown with all available TranslateHashTypes. 60 | hashTypeDropdown.options = new List(((TranslateHashType[])Enum.GetValues(typeof(TranslateHashType))).Select((x) => new TMP_Dropdown.OptionData(x.ToString()))); 61 | hashTypeDropdown.value = (int)hashData.HashType; 62 | hashTypeDropdown.onValueChanged.AddListener(OnHashTypeChanged); 63 | } 64 | 65 | protected void OnDestroy() 66 | { 67 | CleanUp(); 68 | } 69 | 70 | private void OnDataChange() 71 | { 72 | TranslateDataChangedEvent?.Invoke(this); 73 | } 74 | 75 | private void OnHashTypeChanged(int dropdownIndex) 76 | { 77 | hashData.HashType = (TranslateHashType)dropdownIndex; 78 | OnDataChange(); 79 | } 80 | 81 | private void CleanUp() 82 | { 83 | disposables.Dispose(); 84 | hashTypeDropdown.onValueChanged.RemoveListener(OnHashTypeChanged); 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /Scripts/UI/ConfirmationPopupBehaviour.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using TMPro; 4 | using System; 5 | 6 | namespace FanLang 7 | { 8 | /// 9 | /// able to show a confirmation popup to the user and return the user response through a callback. 10 | /// 11 | public class ConfirmationPopupBehaviour : MonoBehaviour 12 | { 13 | [SerializeField] private GameObject blocker; 14 | [SerializeField] private GameObject popup; 15 | [SerializeField] private TMP_Text headerLabel; 16 | [SerializeField] private TMP_Text bodyLabel; 17 | [SerializeField] private Button cancelButton; 18 | [SerializeField] private TMP_Text cancelButtonLabel; 19 | [SerializeField] private Button confirmButton; 20 | [SerializeField] private TMP_Text confirmButtonLabel; 21 | 22 | private Action callback; 23 | 24 | protected void OnEnable() 25 | { 26 | blocker.SetActive(false); 27 | popup.SetActive(false); 28 | 29 | cancelButton.onClick.AddListener(OnCancelButton); 30 | confirmButton.onClick.AddListener(OnConfirmButton); 31 | } 32 | 33 | protected void OnDisable() 34 | { 35 | cancelButton.onClick.RemoveListener(OnCancelButton); 36 | confirmButton.onClick.RemoveListener(OnConfirmButton); 37 | } 38 | 39 | /// 40 | /// Shows the user a new confirmation popup. 41 | /// 42 | /// The header text of the popup. 43 | /// The body text of the popup. 44 | /// The callback to be called once the user has confirmed his input. 45 | /// The text to be displayed on the cancel button. 46 | /// The text to be displayed on the confirm button. 47 | public void Popup(string header, string body, Action callback, string cancelText = "Cancel", string confirmText = "Confirm") 48 | { 49 | this.callback = callback; 50 | 51 | headerLabel.text = header; 52 | bodyLabel.text = body; 53 | cancelButtonLabel.text = cancelText; 54 | confirmButtonLabel.text = confirmText; 55 | 56 | blocker.SetActive(true); 57 | popup.SetActive(true); 58 | } 59 | 60 | /// 61 | /// Force the current popup to close. 62 | /// 63 | /// The result to pass into the callback passed into the last 64 | /// open call. 65 | public void ClosePopup(bool result) 66 | { 67 | blocker.SetActive(false); 68 | popup.SetActive(false); 69 | callback?.Invoke(result); 70 | } 71 | 72 | private void OnCancelButton() 73 | { 74 | ClosePopup(false); 75 | } 76 | 77 | private void OnConfirmButton() 78 | { 79 | ClosePopup(true); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /Art/Icon_Gear.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ed43855b71163f04d88815c0ad876f82 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: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 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: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 512 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 512 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 1 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_01.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8923f79fdf3d5bd41955533befb4568a 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: 1 39 | wrapV: 1 40 | wrapW: 1 41 | nPOTScale: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 2, y: 2, z: 2, w: 2} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 32 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 0 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 32 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 0 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_02.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 757b54d703b059f43b907d76db41c698 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: 1 39 | wrapV: 1 40 | wrapW: 1 41 | nPOTScale: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 8, y: 8, z: 8, w: 8} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 32 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 0 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 32 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 0 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/GAZE_UI_Panels_03.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 229572f5d2f833e44bfb1fdfc9e0af44 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 36 | aniso: -1 37 | mipBias: -100 38 | wrapU: 1 39 | wrapV: 1 40 | wrapW: 1 41 | nPOTScale: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 2, y: 2, z: 2, w: 2} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 32 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 0 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 32 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 0 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/Icon_Refresh.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 448802c7ff09661459d8a579eb58b416 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: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 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: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 1024 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 1024 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 1 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/Icon_Sort.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c29870a63cc81f146b580adb445f9419 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 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: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 1024 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 1024 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 1 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /Art/Icon_Collapse.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 66a26643523f6764da0b5311ba5a590b 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 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: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 1024 67 | resizeAlgorithm: 0 68 | textureFormat: -1 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 1024 79 | resizeAlgorithm: 0 80 | textureFormat: -1 81 | textureCompression: 1 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: [] 92 | physicsShape: [] 93 | bones: [] 94 | spriteID: 5e97eb03825dee720800000000000000 95 | internalID: 0 96 | vertices: [] 97 | indices: 98 | edges: [] 99 | weights: [] 100 | secondaryTextures: [] 101 | spritePackingTag: 102 | pSDRemoveMatte: 0 103 | pSDShowRemoveMatteOption: 0 104 | userData: 105 | assetBundleName: 106 | assetBundleVariant: 107 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Linux/x86_64/libStandaloneFileBrowser.so.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b8c465928f1784a3fac8dc3766f7201c 3 | timeCreated: 1538230728 4 | licenseType: Free 5 | PluginImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | iconMap: {} 9 | executionOrder: {} 10 | isPreloaded: 0 11 | isOverridable: 0 12 | platformData: 13 | - first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 1 19 | Exclude Editor: 0 20 | Exclude Linux: 1 21 | Exclude Linux64: 0 22 | Exclude LinuxUniversal: 0 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude SamsungTV: 1 27 | Exclude Tizen: 1 28 | Exclude WebGL: 1 29 | Exclude Win: 0 30 | Exclude Win64: 0 31 | Exclude iOS: 1 32 | - first: 33 | Android: Android 34 | second: 35 | enabled: 0 36 | settings: 37 | CPU: ARMv7 38 | - first: 39 | Any: 40 | second: 41 | enabled: 0 42 | settings: {} 43 | - first: 44 | Editor: Editor 45 | second: 46 | enabled: 1 47 | settings: 48 | CPU: x86_64 49 | DefaultValueInitialized: true 50 | OS: Linux 51 | - first: 52 | Facebook: Win 53 | second: 54 | enabled: 0 55 | settings: 56 | CPU: AnyCPU 57 | - first: 58 | Facebook: Win64 59 | second: 60 | enabled: 0 61 | settings: 62 | CPU: AnyCPU 63 | - first: 64 | Samsung TV: SamsungTV 65 | second: 66 | enabled: 0 67 | settings: 68 | STV_MODEL: STANDARD_15 69 | - first: 70 | Standalone: Linux 71 | second: 72 | enabled: 0 73 | settings: 74 | CPU: None 75 | - first: 76 | Standalone: Linux64 77 | second: 78 | enabled: 1 79 | settings: 80 | CPU: x86_64 81 | - first: 82 | Standalone: LinuxUniversal 83 | second: 84 | enabled: 1 85 | settings: 86 | CPU: x86_64 87 | - first: 88 | Standalone: OSXIntel 89 | second: 90 | enabled: 0 91 | settings: 92 | CPU: None 93 | - first: 94 | Standalone: OSXIntel64 95 | second: 96 | enabled: 0 97 | settings: 98 | CPU: None 99 | - first: 100 | Standalone: OSXUniversal 101 | second: 102 | enabled: 0 103 | settings: 104 | CPU: None 105 | - first: 106 | Standalone: Win 107 | second: 108 | enabled: 1 109 | settings: 110 | CPU: AnyCPU 111 | - first: 112 | Standalone: Win64 113 | second: 114 | enabled: 1 115 | settings: 116 | CPU: AnyCPU 117 | - first: 118 | iPhone: iOS 119 | second: 120 | enabled: 0 121 | settings: 122 | CompileFlags: 123 | FrameworkDependencies: 124 | userData: 125 | assetBundleName: 126 | assetBundleVariant: 127 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/Ookii.Dialogs.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e60958662eed5413d86143a0a69b731e 3 | timeCreated: 1491979494 4 | licenseType: Pro 5 | PluginImporter: 6 | serializedVersion: 2 7 | iconMap: {} 8 | executionOrder: {} 9 | isPreloaded: 0 10 | isOverridable: 0 11 | platformData: 12 | data: 13 | first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 1 19 | Exclude Editor: 0 20 | Exclude Linux: 1 21 | Exclude Linux64: 1 22 | Exclude LinuxUniversal: 1 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude WebGL: 1 27 | Exclude Win: 0 28 | Exclude Win64: 0 29 | Exclude iOS: 1 30 | data: 31 | first: 32 | '': Editor 33 | second: 34 | enabled: 0 35 | settings: 36 | CPU: AnyCPU 37 | OS: AnyOS 38 | data: 39 | first: 40 | Android: Android 41 | second: 42 | enabled: 0 43 | settings: 44 | CPU: ARMv7 45 | data: 46 | first: 47 | Any: 48 | second: 49 | enabled: 0 50 | settings: {} 51 | data: 52 | first: 53 | Editor: Editor 54 | second: 55 | enabled: 1 56 | settings: 57 | DefaultValueInitialized: true 58 | data: 59 | first: 60 | Facebook: Win 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: AnyCPU 65 | data: 66 | first: 67 | Facebook: Win64 68 | second: 69 | enabled: 0 70 | settings: 71 | CPU: AnyCPU 72 | data: 73 | first: 74 | Standalone: Linux 75 | second: 76 | enabled: 0 77 | settings: 78 | CPU: None 79 | data: 80 | first: 81 | Standalone: Linux64 82 | second: 83 | enabled: 0 84 | settings: 85 | CPU: None 86 | data: 87 | first: 88 | Standalone: LinuxUniversal 89 | second: 90 | enabled: 0 91 | settings: 92 | CPU: None 93 | data: 94 | first: 95 | Standalone: OSXIntel 96 | second: 97 | enabled: 0 98 | settings: 99 | CPU: None 100 | data: 101 | first: 102 | Standalone: OSXIntel64 103 | second: 104 | enabled: 0 105 | settings: 106 | CPU: None 107 | data: 108 | first: 109 | Standalone: OSXUniversal 110 | second: 111 | enabled: 0 112 | settings: 113 | CPU: None 114 | data: 115 | first: 116 | Standalone: Win 117 | second: 118 | enabled: 1 119 | settings: 120 | CPU: AnyCPU 121 | data: 122 | first: 123 | Standalone: Win64 124 | second: 125 | enabled: 1 126 | settings: 127 | CPU: AnyCPU 128 | data: 129 | first: 130 | Windows Store Apps: WindowsStoreApps 131 | second: 132 | enabled: 0 133 | settings: 134 | CPU: AnyCPU 135 | data: 136 | first: 137 | iPhone: iOS 138 | second: 139 | enabled: 0 140 | settings: 141 | CompileFlags: 142 | FrameworkDependencies: 143 | userData: 144 | assetBundleName: 145 | assetBundleVariant: 146 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/System.Windows.Forms.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7d459a96865cc4aaab657012c6dc4833 3 | timeCreated: 1491979494 4 | licenseType: Pro 5 | PluginImporter: 6 | serializedVersion: 2 7 | iconMap: {} 8 | executionOrder: {} 9 | isPreloaded: 0 10 | isOverridable: 0 11 | platformData: 12 | data: 13 | first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 1 19 | Exclude Editor: 0 20 | Exclude Linux: 1 21 | Exclude Linux64: 1 22 | Exclude LinuxUniversal: 1 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude WebGL: 1 27 | Exclude Win: 0 28 | Exclude Win64: 0 29 | Exclude iOS: 1 30 | data: 31 | first: 32 | '': Editor 33 | second: 34 | enabled: 0 35 | settings: 36 | CPU: AnyCPU 37 | OS: AnyOS 38 | data: 39 | first: 40 | Android: Android 41 | second: 42 | enabled: 0 43 | settings: 44 | CPU: ARMv7 45 | data: 46 | first: 47 | Any: 48 | second: 49 | enabled: 0 50 | settings: {} 51 | data: 52 | first: 53 | Editor: Editor 54 | second: 55 | enabled: 1 56 | settings: 57 | DefaultValueInitialized: true 58 | data: 59 | first: 60 | Facebook: Win 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: AnyCPU 65 | data: 66 | first: 67 | Facebook: Win64 68 | second: 69 | enabled: 0 70 | settings: 71 | CPU: AnyCPU 72 | data: 73 | first: 74 | Standalone: Linux 75 | second: 76 | enabled: 0 77 | settings: 78 | CPU: None 79 | data: 80 | first: 81 | Standalone: Linux64 82 | second: 83 | enabled: 0 84 | settings: 85 | CPU: None 86 | data: 87 | first: 88 | Standalone: LinuxUniversal 89 | second: 90 | enabled: 0 91 | settings: 92 | CPU: None 93 | data: 94 | first: 95 | Standalone: OSXIntel 96 | second: 97 | enabled: 0 98 | settings: 99 | CPU: None 100 | data: 101 | first: 102 | Standalone: OSXIntel64 103 | second: 104 | enabled: 0 105 | settings: 106 | CPU: None 107 | data: 108 | first: 109 | Standalone: OSXUniversal 110 | second: 111 | enabled: 0 112 | settings: 113 | CPU: None 114 | data: 115 | first: 116 | Standalone: Win 117 | second: 118 | enabled: 1 119 | settings: 120 | CPU: AnyCPU 121 | data: 122 | first: 123 | Standalone: Win64 124 | second: 125 | enabled: 1 126 | settings: 127 | CPU: AnyCPU 128 | data: 129 | first: 130 | Windows Store Apps: WindowsStoreApps 131 | second: 132 | enabled: 0 133 | settings: 134 | CPU: AnyCPU 135 | data: 136 | first: 137 | iPhone: iOS 138 | second: 139 | enabled: 0 140 | settings: 141 | CompileFlags: 142 | FrameworkDependencies: 143 | userData: 144 | assetBundleName: 145 | assetBundleVariant: 146 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/Plugins/StandaloneFileBrowser.jslib: -------------------------------------------------------------------------------- 1 | var StandaloneFileBrowserWebGLPlugin = { 2 | // Open file. 3 | // gameObjectNamePtr: Unique GameObject name. Required for calling back unity with SendMessage. 4 | // methodNamePtr: Callback method name on given GameObject. 5 | // filter: Filter files. Example filters: 6 | // Match all image files: "image/*" 7 | // Match all video files: "video/*" 8 | // Match all audio files: "audio/*" 9 | // Custom: ".plist, .xml, .yaml" 10 | // multiselect: Allows multiple file selection 11 | UploadFile: function(gameObjectNamePtr, methodNamePtr, filterPtr, multiselect) { 12 | gameObjectName = Pointer_stringify(gameObjectNamePtr); 13 | methodName = Pointer_stringify(methodNamePtr); 14 | filter = Pointer_stringify(filterPtr); 15 | 16 | // Delete if element exist 17 | var fileInput = document.getElementById(gameObjectName) 18 | if (fileInput) { 19 | document.body.removeChild(fileInput); 20 | } 21 | 22 | fileInput = document.createElement('input'); 23 | fileInput.setAttribute('id', gameObjectName); 24 | fileInput.setAttribute('type', 'file'); 25 | fileInput.setAttribute('style','display:none;'); 26 | fileInput.setAttribute('style','visibility:hidden;'); 27 | if (multiselect) { 28 | fileInput.setAttribute('multiple', ''); 29 | } 30 | if (filter) { 31 | fileInput.setAttribute('accept', filter); 32 | } 33 | fileInput.onclick = function (event) { 34 | // File dialog opened 35 | this.value = null; 36 | }; 37 | fileInput.onchange = function (event) { 38 | // multiselect works 39 | var urls = []; 40 | for (var i = 0; i < event.target.files.length; i++) { 41 | urls.push(URL.createObjectURL(event.target.files[i])); 42 | } 43 | // File selected 44 | SendMessage(gameObjectName, methodName, urls.join()); 45 | 46 | // Remove after file selected 47 | document.body.removeChild(fileInput); 48 | } 49 | document.body.appendChild(fileInput); 50 | 51 | document.onmouseup = function() { 52 | fileInput.click(); 53 | document.onmouseup = null; 54 | } 55 | }, 56 | 57 | // Save file 58 | // DownloadFile method does not open SaveFileDialog like standalone builds, its just allows user to download file 59 | // gameObjectNamePtr: Unique GameObject name. Required for calling back unity with SendMessage. 60 | // methodNamePtr: Callback method name on given GameObject. 61 | // filenamePtr: Filename with extension 62 | // byteArray: byte[] 63 | // byteArraySize: byte[].Length 64 | DownloadFile: function(gameObjectNamePtr, methodNamePtr, filenamePtr, byteArray, byteArraySize) { 65 | gameObjectName = Pointer_stringify(gameObjectNamePtr); 66 | methodName = Pointer_stringify(methodNamePtr); 67 | filename = Pointer_stringify(filenamePtr); 68 | 69 | var bytes = new Uint8Array(byteArraySize); 70 | for (var i = 0; i < byteArraySize; i++) { 71 | bytes[i] = HEAPU8[byteArray + i]; 72 | } 73 | 74 | var downloader = window.document.createElement('a'); 75 | downloader.setAttribute('id', gameObjectName); 76 | downloader.href = window.URL.createObjectURL(new Blob([bytes], { type: 'application/octet-stream' })); 77 | downloader.download = filename; 78 | document.body.appendChild(downloader); 79 | 80 | document.onmouseup = function() { 81 | downloader.click(); 82 | document.body.removeChild(downloader); 83 | document.onmouseup = null; 84 | 85 | SendMessage(gameObjectName, methodName); 86 | } 87 | } 88 | }; 89 | 90 | mergeInto(LibraryManager.library, StandaloneFileBrowserWebGLPlugin); -------------------------------------------------------------------------------- /Scripts/UI/TranslateDataUIElement.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using TMPro; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | namespace FanLang 8 | { 9 | /// 10 | /// UI element handling the showing and updating of a 's data. 11 | /// 12 | public class TranslateDataUIElement : MonoBehaviour 13 | { 14 | public event Action TranslateDataChangedEvent; 15 | 16 | public bool Dirty { get; private set; } 17 | 18 | [SerializeField] private RectTransform contentParent; 19 | [SerializeField] private TMP_InputField projectNameField; 20 | [SerializeField] private GameObject projectDirtyMarker; 21 | [SerializeField] private TMP_InputField projectDescriptionField; 22 | [SerializeField] private Button projectDescriptionCollapseButton; 23 | [SerializeField] private Button addTranslateSheetButton; 24 | [SerializeField] private TranslateSheetUIElement translateSheetUIElementPrefab; 25 | 26 | private TranslateData translateData; 27 | private ConfirmationPopupBehaviour confirmation; 28 | 29 | private Dictionary spawnedSheets = new Dictionary(); 30 | private DisposableContainer disposables = new DisposableContainer(); 31 | 32 | public void Initialize(TranslateData translateData, ConfirmationPopupBehaviour confirmationPopupBehaviour) 33 | { 34 | CleanUp(); 35 | 36 | this.translateData = translateData; 37 | this.confirmation = confirmationPopupBehaviour; 38 | 39 | // Set up bindings. 40 | disposables.Add(new InputFieldBinding(projectNameField, () => translateData.Name, delegate (string value) 41 | { 42 | value = value.Trim(' '); 43 | UpdateProjectName(value); 44 | SetDirty(true); 45 | })); 46 | disposables.Add(new InputFieldBinding(projectDescriptionField, () => translateData.Description, delegate (string value) { translateData.Description = value; SetDirty(true); })); 47 | disposables.Add(new ButtonBinding(projectDescriptionCollapseButton, () => projectDescriptionField.gameObject.SetActive(!projectDescriptionField.gameObject.activeSelf))); 48 | disposables.Add(new ButtonBinding(addTranslateSheetButton, delegate 49 | { 50 | TranslateSheetData sheetData = new TranslateSheetData(); 51 | translateData.TranslateSheets.Add(sheetData); 52 | AddTranslateSheetUIElement(sheetData); 53 | })); 54 | 55 | // Set up UI. 56 | SetDirty(false); 57 | UpdateProjectName(); 58 | BuildUI(); 59 | } 60 | 61 | protected void OnDestroy() 62 | { 63 | CleanUp(); 64 | } 65 | 66 | public void SetDirty(bool dirty) 67 | { 68 | Dirty = dirty; 69 | projectDirtyMarker.SetActive(Dirty); 70 | } 71 | 72 | private void CleanUp() 73 | { 74 | disposables.Dispose(); 75 | CleanUpUI(); 76 | } 77 | 78 | private void UpdateProjectName(string name = null) 79 | { 80 | if (!string.IsNullOrEmpty(name)) 81 | { 82 | translateData.Name = name; 83 | } 84 | 85 | projectNameField.SetTextWithoutNotify(translateData.Name); 86 | } 87 | 88 | private void CleanUpUI() 89 | { 90 | foreach (KeyValuePair sheetElement in spawnedSheets) 91 | { 92 | if (sheetElement.Value != null) 93 | { 94 | sheetElement.Value.TranslateDataChangedEvent -= OnTranslateDataChanged; 95 | sheetElement.Value.RequestDeleteEvent -= OnRequestDeleteTranslateSheetEvent; 96 | Destroy(sheetElement.Value.gameObject); 97 | } 98 | } 99 | spawnedSheets.Clear(); 100 | } 101 | 102 | private void BuildUI() 103 | { 104 | foreach (TranslateSheetData sheetData in translateData.TranslateSheets) 105 | { 106 | AddTranslateSheetUIElement(sheetData); 107 | } 108 | } 109 | 110 | private void AddTranslateSheetUIElement(TranslateSheetData sheetData) 111 | { 112 | TranslateSheetUIElement element = Instantiate(translateSheetUIElementPrefab, contentParent); 113 | element.Initialize(sheetData); 114 | spawnedSheets.Add(sheetData, element); 115 | element.TranslateDataChangedEvent += OnTranslateDataChanged; 116 | element.RequestDeleteEvent += OnRequestDeleteTranslateSheetEvent; 117 | } 118 | 119 | private void OnRequestDeleteTranslateSheetEvent(TranslateSheetData sheetData) 120 | { 121 | confirmation.Popup("Please Confirm", "Are you sure you want to delete this translate sheet?", delegate (bool result) 122 | { 123 | if (result) 124 | { 125 | Destroy(spawnedSheets[sheetData].gameObject); 126 | spawnedSheets.Remove(sheetData); 127 | translateData.TranslateSheets.Remove(sheetData); 128 | OnTranslateDataChanged(this); 129 | SetDirty(true); 130 | } 131 | }); 132 | } 133 | 134 | private void OnTranslateDataChanged(object data) 135 | { 136 | SetDirty(true); 137 | TranslateDataChangedEvent?.Invoke(data); 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /Scripts/UI/TranslateSheetUIElement.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using TMPro; 4 | using System; 5 | using System.Linq; 6 | using System.Collections.Generic; 7 | 8 | namespace FanLang 9 | { 10 | /// 11 | /// UI element handling the showing and updating of a 's data. 12 | /// 13 | public class TranslateSheetUIElement : MonoBehaviour 14 | { 15 | public event Action TranslateDataChangedEvent; 16 | public event Action RequestDeleteEvent; 17 | 18 | [SerializeField] private Toggle enabledToggle; 19 | [SerializeField] private TMP_InputField sheetNameField; 20 | [SerializeField] private Button deleteSheetButton; 21 | [SerializeField] private Button addHashButton; 22 | [SerializeField] private RectTransform hashParent; 23 | [SerializeField] private TranslateHashUIElement translateHashUIElementPrefab; 24 | [SerializeField] private Button sortByInputButton; 25 | [SerializeField] private Button sortByOutputButton; 26 | [SerializeField] private Button sortByHashTypeButton; 27 | 28 | private TranslateSheetData sheetData; 29 | private DisposableContainer disposables = new DisposableContainer(); 30 | private Dictionary spawnedHashes = new Dictionary(); 31 | 32 | public void Initialize(TranslateSheetData sheetData) 33 | { 34 | CleanUp(); 35 | this.sheetData = sheetData; 36 | 37 | // Set up bindings. 38 | disposables.Add(new ToggleBinding(enabledToggle, () => sheetData.Enabled, delegate (bool v) { sheetData.Enabled = v; TranslateDataChangedEvent?.Invoke(this); })); 39 | disposables.Add(new InputFieldBinding(sheetNameField, () => sheetData.Name, delegate (string t) { sheetData.Name = t; TranslateDataChangedEvent?.Invoke(this); })); 40 | disposables.Add(new ButtonBinding(deleteSheetButton, () => RequestDeleteEvent?.Invoke(sheetData))); 41 | disposables.Add(new ButtonBinding(addHashButton, delegate { TranslateHashData hash = new TranslateHashData(); sheetData.TranslateHashes.Add(hash); AddTranslateHashUIElement(hash); })); 42 | disposables.Add(new ButtonBinding(sortByInputButton, delegate { List orderedList = sheetData.TranslateHashes.OrderBy((x) => x.Input).ToList(); SortHashes(orderedList); })); 43 | disposables.Add(new ButtonBinding(sortByOutputButton, delegate { List orderedList = sheetData.TranslateHashes.OrderBy((x) => x.Output).ToList(); SortHashes(orderedList); })); 44 | disposables.Add(new ButtonBinding(sortByHashTypeButton, delegate { List orderedList = sheetData.TranslateHashes.OrderBy((x) => x.HashType.ToString()).ToList(); SortHashes(orderedList); })); 45 | 46 | // Create child translate hash UI elements. 47 | RebuildUI(); 48 | } 49 | 50 | protected void OnDestroy() 51 | { 52 | CleanUp(); 53 | } 54 | 55 | private void OnTranslateHashDataChangedEvent(object hash) 56 | { 57 | TranslateDataChangedEvent?.Invoke(hash); 58 | } 59 | 60 | private void OnRequestDeleteTranslateHashEvent(TranslateHashData hashData) 61 | { 62 | Destroy(spawnedHashes[hashData].gameObject); 63 | spawnedHashes.Remove(hashData); 64 | sheetData.TranslateHashes.Remove(hashData); 65 | TranslateDataChangedEvent?.Invoke(this); 66 | } 67 | 68 | private void CleanUp() 69 | { 70 | disposables.Dispose(); 71 | CleanUpUI(); 72 | } 73 | 74 | private void RebuildUI() 75 | { 76 | CleanUpUI(); 77 | foreach (TranslateHashData hashData in sheetData.TranslateHashes) 78 | { 79 | AddTranslateHashUIElement(hashData); 80 | } 81 | } 82 | 83 | private void CleanUpUI() 84 | { 85 | foreach (KeyValuePair translateHashElement in spawnedHashes) 86 | { 87 | if (translateHashElement.Value != null) 88 | { 89 | translateHashElement.Value.TranslateDataChangedEvent -= OnTranslateHashDataChangedEvent; 90 | translateHashElement.Value.RequestDeleteEvent -= OnRequestDeleteTranslateHashEvent; 91 | GameObject.Destroy(translateHashElement.Value.gameObject); 92 | } 93 | } 94 | spawnedHashes.Clear(); 95 | } 96 | 97 | private void AddTranslateHashUIElement(TranslateHashData hashData) 98 | { 99 | TranslateHashUIElement element = Instantiate(translateHashUIElementPrefab, hashParent); 100 | element.Initialize(hashData); 101 | spawnedHashes.Add(hashData, element); 102 | element.TranslateDataChangedEvent += OnTranslateHashDataChangedEvent; 103 | element.RequestDeleteEvent += OnRequestDeleteTranslateHashEvent; 104 | } 105 | 106 | private void SortHashes(List orderedList) 107 | { 108 | // If it's already ordered, reverse the ordering to have a descending list instead of ascending. 109 | if (sheetData.TranslateHashes.SequenceEqual(orderedList)) 110 | { 111 | orderedList.Reverse(); 112 | } 113 | 114 | sheetData.TranslateHashes = orderedList; 115 | TranslateDataChangedEvent(this); 116 | RebuildUI(); 117 | } 118 | } 119 | } -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserLinux.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_STANDALONE_LINUX 2 | 3 | using System; 4 | using System.IO; 5 | using System.Runtime.InteropServices; 6 | using UnityEngine; 7 | 8 | namespace SFB { 9 | 10 | public class StandaloneFileBrowserLinux : IStandaloneFileBrowser { 11 | 12 | private static Action _openFileCb; 13 | private static Action _openFolderCb; 14 | private static Action _saveFileCb; 15 | 16 | [UnmanagedFunctionPointer(CallingConvention.StdCall)] 17 | public delegate void AsyncCallback(string path); 18 | 19 | [DllImport("StandaloneFileBrowser")] 20 | private static extern void DialogInit(); 21 | [DllImport("StandaloneFileBrowser")] 22 | private static extern IntPtr DialogOpenFilePanel(string title, string directory, string extension, bool multiselect); 23 | [DllImport("StandaloneFileBrowser")] 24 | private static extern void DialogOpenFilePanelAsync(string title, string directory, string extension, bool multiselect, AsyncCallback callback); 25 | [DllImport("StandaloneFileBrowser")] 26 | private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect); 27 | [DllImport("StandaloneFileBrowser")] 28 | private static extern void DialogOpenFolderPanelAsync(string title, string directory, bool multiselect, AsyncCallback callback); 29 | [DllImport("StandaloneFileBrowser")] 30 | private static extern IntPtr DialogSaveFilePanel(string title, string directory, string defaultName, string extension); 31 | [DllImport("StandaloneFileBrowser")] 32 | private static extern void DialogSaveFilePanelAsync(string title, string directory, string defaultName, string extension, AsyncCallback callback); 33 | 34 | public StandaloneFileBrowserLinux() 35 | { 36 | DialogInit(); 37 | } 38 | 39 | public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) { 40 | var paths = Marshal.PtrToStringAnsi(DialogOpenFilePanel( 41 | title, 42 | directory, 43 | GetFilterFromFileExtensionList(extensions), 44 | multiselect)); 45 | return paths.Split((char)28); 46 | } 47 | 48 | public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb) { 49 | _openFileCb = cb; 50 | DialogOpenFilePanelAsync( 51 | title, 52 | directory, 53 | GetFilterFromFileExtensionList(extensions), 54 | multiselect, 55 | (string result) => { _openFileCb.Invoke(result.Split((char)28)); }); 56 | } 57 | 58 | public string[] OpenFolderPanel(string title, string directory, bool multiselect) { 59 | var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel( 60 | title, 61 | directory, 62 | multiselect)); 63 | return paths.Split((char)28); 64 | } 65 | 66 | public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb) { 67 | _openFolderCb = cb; 68 | DialogOpenFolderPanelAsync( 69 | title, 70 | directory, 71 | multiselect, 72 | (string result) => { _openFolderCb.Invoke(result.Split((char)28)); }); 73 | } 74 | 75 | public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) { 76 | return Marshal.PtrToStringAnsi(DialogSaveFilePanel( 77 | title, 78 | directory, 79 | defaultName, 80 | GetFilterFromFileExtensionList(extensions))); 81 | } 82 | 83 | public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb) { 84 | _saveFileCb = cb; 85 | DialogSaveFilePanelAsync( 86 | title, 87 | directory, 88 | defaultName, 89 | GetFilterFromFileExtensionList(extensions), 90 | (string result) => { _saveFileCb.Invoke(result); }); 91 | } 92 | 93 | private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions) { 94 | if (extensions == null) { 95 | return ""; 96 | } 97 | 98 | var filterString = ""; 99 | foreach (var filter in extensions) { 100 | filterString += filter.Name + ";"; 101 | 102 | foreach (var ext in filter.Extensions) { 103 | filterString += ext + ","; 104 | } 105 | 106 | filterString = filterString.Remove(filterString.Length - 1); 107 | filterString += "|"; 108 | } 109 | filterString = filterString.Remove(filterString.Length - 1); 110 | return filterString; 111 | } 112 | } 113 | } 114 | 115 | #endif -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserMac.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_STANDALONE_OSX 2 | 3 | using System; 4 | using System.Runtime.InteropServices; 5 | 6 | namespace SFB { 7 | public class StandaloneFileBrowserMac : IStandaloneFileBrowser { 8 | private static Action _openFileCb; 9 | private static Action _openFolderCb; 10 | private static Action _saveFileCb; 11 | 12 | [UnmanagedFunctionPointer(CallingConvention.StdCall)] 13 | public delegate void AsyncCallback(string path); 14 | 15 | [AOT.MonoPInvokeCallback(typeof(AsyncCallback))] 16 | private static void openFileCb(string result) { 17 | _openFileCb.Invoke(result.Split((char)28)); 18 | } 19 | 20 | [AOT.MonoPInvokeCallback(typeof(AsyncCallback))] 21 | private static void openFolderCb(string result) { 22 | _openFolderCb.Invoke(result.Split((char)28)); 23 | } 24 | 25 | [AOT.MonoPInvokeCallback(typeof(AsyncCallback))] 26 | private static void saveFileCb(string result) { 27 | _saveFileCb.Invoke(result); 28 | } 29 | 30 | [DllImport("StandaloneFileBrowser")] 31 | private static extern IntPtr DialogOpenFilePanel(string title, string directory, string extension, bool multiselect); 32 | [DllImport("StandaloneFileBrowser")] 33 | private static extern void DialogOpenFilePanelAsync(string title, string directory, string extension, bool multiselect, AsyncCallback callback); 34 | [DllImport("StandaloneFileBrowser")] 35 | private static extern IntPtr DialogOpenFolderPanel(string title, string directory, bool multiselect); 36 | [DllImport("StandaloneFileBrowser")] 37 | private static extern void DialogOpenFolderPanelAsync(string title, string directory, bool multiselect, AsyncCallback callback); 38 | [DllImport("StandaloneFileBrowser")] 39 | private static extern IntPtr DialogSaveFilePanel(string title, string directory, string defaultName, string extension); 40 | [DllImport("StandaloneFileBrowser")] 41 | private static extern void DialogSaveFilePanelAsync(string title, string directory, string defaultName, string extension, AsyncCallback callback); 42 | 43 | public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) { 44 | var paths = Marshal.PtrToStringAnsi(DialogOpenFilePanel( 45 | title, 46 | directory, 47 | GetFilterFromFileExtensionList(extensions), 48 | multiselect)); 49 | return paths.Split((char)28); 50 | } 51 | 52 | public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb) { 53 | _openFileCb = cb; 54 | DialogOpenFilePanelAsync( 55 | title, 56 | directory, 57 | GetFilterFromFileExtensionList(extensions), 58 | multiselect, 59 | openFileCb); 60 | } 61 | 62 | public string[] OpenFolderPanel(string title, string directory, bool multiselect) { 63 | var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel( 64 | title, 65 | directory, 66 | multiselect)); 67 | return paths.Split((char)28); 68 | } 69 | 70 | public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb) { 71 | _openFolderCb = cb; 72 | DialogOpenFolderPanelAsync( 73 | title, 74 | directory, 75 | multiselect, 76 | openFolderCb); 77 | } 78 | 79 | public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) { 80 | return Marshal.PtrToStringAnsi(DialogSaveFilePanel( 81 | title, 82 | directory, 83 | defaultName, 84 | GetFilterFromFileExtensionList(extensions))); 85 | } 86 | 87 | public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb) { 88 | _saveFileCb = cb; 89 | DialogSaveFilePanelAsync( 90 | title, 91 | directory, 92 | defaultName, 93 | GetFilterFromFileExtensionList(extensions), 94 | saveFileCb); 95 | } 96 | 97 | private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions) { 98 | if (extensions == null) { 99 | return ""; 100 | } 101 | 102 | var filterString = ""; 103 | foreach (var filter in extensions) { 104 | filterString += filter.Name + ";"; 105 | 106 | foreach (var ext in filter.Extensions) { 107 | filterString += ext + ","; 108 | } 109 | 110 | filterString = filterString.Remove(filterString.Length - 1); 111 | filterString += "|"; 112 | } 113 | filterString = filterString.Remove(filterString.Length - 1); 114 | return filterString; 115 | } 116 | } 117 | } 118 | 119 | #endif -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowserWindows.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_STANDALONE_WIN 2 | 3 | using System; 4 | using System.IO; 5 | using System.Windows.Forms; 6 | using System.Runtime.InteropServices; 7 | using Ookii.Dialogs; 8 | 9 | namespace SFB { 10 | // For fullscreen support 11 | // - WindowWrapper class and GetActiveWindow() are required for modal file dialog. 12 | // - "PlayerSettings/Visible In Background" should be enabled, otherwise when file dialog opened app window minimizes automatically. 13 | 14 | public class WindowWrapper : IWin32Window { 15 | private IntPtr _hwnd; 16 | public WindowWrapper(IntPtr handle) { _hwnd = handle; } 17 | public IntPtr Handle { get { return _hwnd; } } 18 | } 19 | 20 | public class StandaloneFileBrowserWindows : IStandaloneFileBrowser { 21 | [DllImport("user32.dll")] 22 | private static extern IntPtr GetActiveWindow(); 23 | 24 | public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) { 25 | var fd = new VistaOpenFileDialog(); 26 | fd.Title = title; 27 | if (extensions != null) { 28 | fd.Filter = GetFilterFromFileExtensionList(extensions); 29 | fd.FilterIndex = 1; 30 | } 31 | else { 32 | fd.Filter = string.Empty; 33 | } 34 | fd.Multiselect = multiselect; 35 | if (!string.IsNullOrEmpty(directory)) { 36 | fd.FileName = GetDirectoryPath(directory); 37 | } 38 | var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow())); 39 | var filenames = res == DialogResult.OK ? fd.FileNames : new string[0]; 40 | fd.Dispose(); 41 | return filenames; 42 | } 43 | 44 | public void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb) { 45 | cb.Invoke(OpenFilePanel(title, directory, extensions, multiselect)); 46 | } 47 | 48 | public string[] OpenFolderPanel(string title, string directory, bool multiselect) { 49 | var fd = new VistaFolderBrowserDialog(); 50 | fd.Description = title; 51 | if (!string.IsNullOrEmpty(directory)) { 52 | fd.SelectedPath = GetDirectoryPath(directory); 53 | } 54 | var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow())); 55 | var filenames = res == DialogResult.OK ? new []{ fd.SelectedPath } : new string[0]; 56 | fd.Dispose(); 57 | return filenames; 58 | } 59 | 60 | public void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb) { 61 | cb.Invoke(OpenFolderPanel(title, directory, multiselect)); 62 | } 63 | 64 | public string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) { 65 | var fd = new VistaSaveFileDialog(); 66 | fd.Title = title; 67 | 68 | var finalFilename = ""; 69 | 70 | if (!string.IsNullOrEmpty(directory)) { 71 | finalFilename = GetDirectoryPath(directory); 72 | } 73 | 74 | if (!string.IsNullOrEmpty(defaultName)) { 75 | finalFilename += defaultName; 76 | } 77 | 78 | fd.FileName = finalFilename; 79 | if (extensions != null) { 80 | fd.Filter = GetFilterFromFileExtensionList(extensions); 81 | fd.FilterIndex = 1; 82 | fd.DefaultExt = extensions[0].Extensions[0]; 83 | fd.AddExtension = true; 84 | } 85 | else { 86 | fd.DefaultExt = string.Empty; 87 | fd.Filter = string.Empty; 88 | fd.AddExtension = false; 89 | } 90 | var res = fd.ShowDialog(new WindowWrapper(GetActiveWindow())); 91 | var filename = res == DialogResult.OK ? fd.FileName : ""; 92 | fd.Dispose(); 93 | return filename; 94 | } 95 | 96 | public void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb) { 97 | cb.Invoke(SaveFilePanel(title, directory, defaultName, extensions)); 98 | } 99 | 100 | // .NET Framework FileDialog Filter format 101 | // https://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.filter 102 | private static string GetFilterFromFileExtensionList(ExtensionFilter[] extensions) { 103 | var filterString = ""; 104 | foreach (var filter in extensions) { 105 | filterString += filter.Name + "("; 106 | 107 | foreach (var ext in filter.Extensions) { 108 | filterString += "*." + ext + ","; 109 | } 110 | 111 | filterString = filterString.Remove(filterString.Length - 1); 112 | filterString += ") |"; 113 | 114 | foreach (var ext in filter.Extensions) { 115 | filterString += "*." + ext + "; "; 116 | } 117 | 118 | filterString += "|"; 119 | } 120 | filterString = filterString.Remove(filterString.Length - 1); 121 | return filterString; 122 | } 123 | 124 | private static string GetDirectoryPath(string directory) { 125 | var directoryPath = Path.GetFullPath(directory); 126 | if (!directoryPath.EndsWith("\\")) { 127 | directoryPath += "\\"; 128 | } 129 | if (Path.GetPathRoot(directoryPath) == directoryPath) { 130 | return directory; 131 | } 132 | return Path.GetDirectoryName(directoryPath) + Path.DirectorySeparatorChar; 133 | } 134 | } 135 | } 136 | 137 | #endif -------------------------------------------------------------------------------- /Scripts/Translator/TranslatorBehaviour.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using TMPro; 4 | using System.Collections.Generic; 5 | 6 | namespace FanLang 7 | { 8 | /// 9 | /// responsible for handling the s required to apply the loaded 10 | /// to an input taken from an and translate to an output . 11 | /// 12 | public class TranslatorBehaviour : MonoBehaviour 13 | { 14 | private const string INPUT_TEXT_PREF_KEY = "TranslatorInput"; 15 | 16 | public bool AlwaysUpdate { get; set; } = true; 17 | public bool LinkScrollbars { get; set; } = true; 18 | private string SaveKey => $"{INPUT_TEXT_PREF_KEY}_{translateData.ID}"; 19 | private bool HasSelection => selectionStart != selectionEnd; 20 | 21 | [SerializeField] private TMP_InputField inputField; 22 | [SerializeField] private TMP_InputField outputField; 23 | [SerializeField] private Scrollbar inputScrollbar; 24 | [SerializeField] private Scrollbar outputScrollbar; 25 | [SerializeField] private Color selectionColor; 26 | 27 | private TranslateData translateData; 28 | private List translators = new List(); 29 | 30 | private int selectionStart; 31 | private int selectionEnd; 32 | private bool requiresTranslationUpdate; 33 | private bool settingScrollbar; 34 | 35 | protected void OnEnable() 36 | { 37 | inputField.onValueChanged.AddListener(OnInputChangedEvent); 38 | inputField.onTextSelection.AddListener(OnInputSelectionChangedEvent); 39 | inputField.onEndTextSelection.AddListener(OnInputSelectionChangedEvent); 40 | inputField.onDeselect.AddListener(OnInputDeselect); 41 | inputScrollbar.onValueChanged.AddListener(OnInputScrollbarValueChanged); 42 | outputScrollbar.onValueChanged.AddListener(OnOutputScrollbarValueChanged); 43 | } 44 | 45 | protected void OnDisable() 46 | { 47 | inputField.onValueChanged.RemoveListener(OnInputChangedEvent); 48 | inputField.onTextSelection.RemoveListener(OnInputSelectionChangedEvent); 49 | inputField.onEndTextSelection.RemoveListener(OnInputSelectionChangedEvent); 50 | inputField.onDeselect.RemoveListener(OnInputDeselect); 51 | inputScrollbar.onValueChanged.RemoveListener(OnInputScrollbarValueChanged); 52 | outputScrollbar.onValueChanged.RemoveListener(OnOutputScrollbarValueChanged); 53 | } 54 | 55 | protected void Update() 56 | { 57 | // If AlwaysUpdate is false, either Reload or Translate will need to be called externally to update the translation. 58 | if (AlwaysUpdate && requiresTranslationUpdate) 59 | { 60 | Translate(); 61 | requiresTranslationUpdate = false; 62 | } 63 | } 64 | 65 | /// 66 | /// Loads the given and creates the required s. 67 | /// 68 | public void Load(TranslateData translateData) 69 | { 70 | this.translateData = translateData; 71 | LoadInputText(); 72 | Reload(); 73 | } 74 | 75 | /// 76 | /// Reloads the currently loaded in case the data structure has changed. 77 | /// 78 | public void Reload() 79 | { 80 | translators.Clear(); 81 | foreach (TranslateSheetData sheet in translateData.TranslateSheets) 82 | { 83 | if (sheet.Enabled) 84 | { 85 | translators.Add(new Translator(sheet)); 86 | } 87 | } 88 | Translate(); 89 | } 90 | 91 | /// 92 | /// Takes input from the input field, applies selected text marking and translates it using the loaded s. 93 | /// Wraps around . 94 | /// 95 | public void Translate() 96 | { 97 | string input = inputField.text; 98 | if (HasSelection && selectionEnd <= input.Length) 99 | { 100 | string markingTag = $""; 101 | input = input.Insert(selectionStart, markingTag); 102 | input = input.Insert(selectionEnd + markingTag.Length, $""); 103 | } 104 | outputField.text = Translate(input); 105 | } 106 | 107 | /// 108 | /// Translates using the currently defined s. 109 | /// 110 | /// The translated input. 111 | private string Translate(string input) 112 | { 113 | string output = input; 114 | foreach (Translator translator in translators) 115 | { 116 | output = translator.Translate(output); 117 | } 118 | 119 | return output; 120 | } 121 | 122 | private void OnInputChangedEvent(string input) 123 | { 124 | // Don't allow tags to be manually added by the user. 125 | input = input.Trim('<', '>'); 126 | inputField.SetTextWithoutNotify(input); 127 | 128 | requiresTranslationUpdate = true; 129 | SaveInputText(); 130 | } 131 | 132 | private void OnInputDeselect(string input) 133 | { 134 | selectionStart = 0; 135 | selectionEnd = 0; 136 | requiresTranslationUpdate = true; 137 | } 138 | 139 | private void OnInputSelectionChangedEvent(string text, int start, int end) 140 | { 141 | if (!inputField.isFocused) 142 | { 143 | return; 144 | } 145 | 146 | selectionStart = Mathf.Min(start, end); 147 | selectionEnd = Mathf.Max(start, end); 148 | requiresTranslationUpdate = true; 149 | } 150 | 151 | private void OnInputScrollbarValueChanged(float value) 152 | { 153 | if (!settingScrollbar && LinkScrollbars) 154 | { 155 | settingScrollbar = true; // To prevent looping callbacks 156 | outputScrollbar.value = value; 157 | settingScrollbar = false; 158 | } 159 | } 160 | 161 | private void OnOutputScrollbarValueChanged(float value) 162 | { 163 | if (!settingScrollbar && LinkScrollbars) 164 | { 165 | settingScrollbar = true; // To prevent looping callbacks 166 | inputScrollbar.value = value; 167 | settingScrollbar = false; 168 | } 169 | } 170 | 171 | private void LoadInputText() 172 | { 173 | inputField.SetTextWithoutNotify(PlayerPrefs.GetString(SaveKey, "")); 174 | } 175 | 176 | private void SaveInputText() 177 | { 178 | PlayerPrefs.SetString(SaveKey, inputField.text); 179 | PlayerPrefs.Save(); 180 | } 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /Resources/UI/RemoveButton.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3056044079578875854 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 4311630151510584308} 12 | - component: {fileID: 3905991056591101447} 13 | - component: {fileID: 5888270938877873378} 14 | - component: {fileID: 3395923229525944761} 15 | m_Layer: 5 16 | m_Name: RemoveButton 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!224 &4311630151510584308 23 | RectTransform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 3056044079578875854} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: 33 | - {fileID: 4511536942889061930} 34 | m_Father: {fileID: 0} 35 | m_RootOrder: 0 36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 37 | m_AnchorMin: {x: 1, y: 0.5} 38 | m_AnchorMax: {x: 1, y: 0.5} 39 | m_AnchoredPosition: {x: -5, y: 0} 40 | m_SizeDelta: {x: 25, y: 25} 41 | m_Pivot: {x: 1, y: 0.5} 42 | --- !u!222 &3905991056591101447 43 | CanvasRenderer: 44 | m_ObjectHideFlags: 0 45 | m_CorrespondingSourceObject: {fileID: 0} 46 | m_PrefabInstance: {fileID: 0} 47 | m_PrefabAsset: {fileID: 0} 48 | m_GameObject: {fileID: 3056044079578875854} 49 | m_CullTransparentMesh: 0 50 | --- !u!114 &5888270938877873378 51 | MonoBehaviour: 52 | m_ObjectHideFlags: 0 53 | m_CorrespondingSourceObject: {fileID: 0} 54 | m_PrefabInstance: {fileID: 0} 55 | m_PrefabAsset: {fileID: 0} 56 | m_GameObject: {fileID: 3056044079578875854} 57 | m_Enabled: 1 58 | m_EditorHideFlags: 0 59 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 60 | m_Name: 61 | m_EditorClassIdentifier: 62 | m_Material: {fileID: 0} 63 | m_Color: {r: 1, g: 1, b: 1, a: 1} 64 | m_RaycastTarget: 1 65 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 66 | m_Maskable: 1 67 | m_OnCullStateChanged: 68 | m_PersistentCalls: 69 | m_Calls: [] 70 | m_Sprite: {fileID: 21300000, guid: 757b54d703b059f43b907d76db41c698, type: 3} 71 | m_Type: 0 72 | m_PreserveAspect: 1 73 | m_FillCenter: 1 74 | m_FillMethod: 4 75 | m_FillAmount: 1 76 | m_FillClockwise: 1 77 | m_FillOrigin: 0 78 | m_UseSpriteMesh: 1 79 | m_PixelsPerUnitMultiplier: 1 80 | --- !u!114 &3395923229525944761 81 | MonoBehaviour: 82 | m_ObjectHideFlags: 0 83 | m_CorrespondingSourceObject: {fileID: 0} 84 | m_PrefabInstance: {fileID: 0} 85 | m_PrefabAsset: {fileID: 0} 86 | m_GameObject: {fileID: 3056044079578875854} 87 | m_Enabled: 1 88 | m_EditorHideFlags: 0 89 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 90 | m_Name: 91 | m_EditorClassIdentifier: 92 | m_Navigation: 93 | m_Mode: 3 94 | m_SelectOnUp: {fileID: 0} 95 | m_SelectOnDown: {fileID: 0} 96 | m_SelectOnLeft: {fileID: 0} 97 | m_SelectOnRight: {fileID: 0} 98 | m_Transition: 1 99 | m_Colors: 100 | m_NormalColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 101 | m_HighlightedColor: {r: 1, g: 0.6273585, b: 0.6560233, a: 1} 102 | m_PressedColor: {r: 0.8679245, g: 0.20060521, b: 0.25193766, a: 1} 103 | m_SelectedColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 104 | m_DisabledColor: {r: 0.4811321, g: 0.2246796, b: 0.24440679, a: 1} 105 | m_ColorMultiplier: 1 106 | m_FadeDuration: 0.1 107 | m_SpriteState: 108 | m_HighlightedSprite: {fileID: 0} 109 | m_PressedSprite: {fileID: 0} 110 | m_SelectedSprite: {fileID: 0} 111 | m_DisabledSprite: {fileID: 0} 112 | m_AnimationTriggers: 113 | m_NormalTrigger: Normal 114 | m_HighlightedTrigger: Highlighted 115 | m_PressedTrigger: Pressed 116 | m_SelectedTrigger: Selected 117 | m_DisabledTrigger: Disabled 118 | m_Interactable: 1 119 | m_TargetGraphic: {fileID: 5888270938877873378} 120 | m_OnClick: 121 | m_PersistentCalls: 122 | m_Calls: [] 123 | --- !u!1 &3847795195932344601 124 | GameObject: 125 | m_ObjectHideFlags: 0 126 | m_CorrespondingSourceObject: {fileID: 0} 127 | m_PrefabInstance: {fileID: 0} 128 | m_PrefabAsset: {fileID: 0} 129 | serializedVersion: 6 130 | m_Component: 131 | - component: {fileID: 4511536942889061930} 132 | - component: {fileID: 5195659267112979347} 133 | - component: {fileID: 832971070055872464} 134 | m_Layer: 5 135 | m_Name: Image 136 | m_TagString: Untagged 137 | m_Icon: {fileID: 0} 138 | m_NavMeshLayer: 0 139 | m_StaticEditorFlags: 0 140 | m_IsActive: 1 141 | --- !u!224 &4511536942889061930 142 | RectTransform: 143 | m_ObjectHideFlags: 0 144 | m_CorrespondingSourceObject: {fileID: 0} 145 | m_PrefabInstance: {fileID: 0} 146 | m_PrefabAsset: {fileID: 0} 147 | m_GameObject: {fileID: 3847795195932344601} 148 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 149 | m_LocalPosition: {x: 0, y: 0, z: 0} 150 | m_LocalScale: {x: 1, y: 1, z: 1} 151 | m_Children: [] 152 | m_Father: {fileID: 4311630151510584308} 153 | m_RootOrder: 0 154 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 155 | m_AnchorMin: {x: 0, y: 0.5} 156 | m_AnchorMax: {x: 1, y: 0.5} 157 | m_AnchoredPosition: {x: 0, y: 0} 158 | m_SizeDelta: {x: -10, y: 2} 159 | m_Pivot: {x: 0.5, y: 0.5} 160 | --- !u!222 &5195659267112979347 161 | CanvasRenderer: 162 | m_ObjectHideFlags: 0 163 | m_CorrespondingSourceObject: {fileID: 0} 164 | m_PrefabInstance: {fileID: 0} 165 | m_PrefabAsset: {fileID: 0} 166 | m_GameObject: {fileID: 3847795195932344601} 167 | m_CullTransparentMesh: 0 168 | --- !u!114 &832971070055872464 169 | MonoBehaviour: 170 | m_ObjectHideFlags: 0 171 | m_CorrespondingSourceObject: {fileID: 0} 172 | m_PrefabInstance: {fileID: 0} 173 | m_PrefabAsset: {fileID: 0} 174 | m_GameObject: {fileID: 3847795195932344601} 175 | m_Enabled: 1 176 | m_EditorHideFlags: 0 177 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 178 | m_Name: 179 | m_EditorClassIdentifier: 180 | m_Material: {fileID: 0} 181 | m_Color: {r: 0.7254902, g: 0.7411765, b: 0.7058824, a: 1} 182 | m_RaycastTarget: 1 183 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 184 | m_Maskable: 1 185 | m_OnCullStateChanged: 186 | m_PersistentCalls: 187 | m_Calls: [] 188 | m_Sprite: {fileID: 0} 189 | m_Type: 0 190 | m_PreserveAspect: 0 191 | m_FillCenter: 1 192 | m_FillMethod: 4 193 | m_FillAmount: 1 194 | m_FillClockwise: 1 195 | m_FillOrigin: 0 196 | m_UseSpriteMesh: 0 197 | m_PixelsPerUnitMultiplier: 1 198 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FanLang 2 | 3 | Cyphering software for creating fictional languages; read input text and replace it using a configurable data set. 4 | 5 | [Quick video demonstration of everything below can be found here](https://www.youtube.com/watch?v=Vk4Ewopi_K4) 6 | 7 | ![](https://mickboere.com/wp-content/uploads/2021/01/ExampleLanguageScreenshot.png) 8 | 9 | > Example project demonstrating how I go about creating languages. Download the example project [HERE](https://drive.google.com/file/d/1afVMiwYk5kExp4PT5wBZzKlSC8fi9DKt/view?usp=sharing). 10 | > Note that the example project does not contain the example input, since input is saved in player prefs (per system). 11 | 12 | ## Who is this for? 13 | 14 | You, if you are into worldbuilding and the like but are too lazy to figure out how to create proper languages. 15 | Hell, even if you aren't into worldbuilding this software could probably be used for many other things than just creating languages. You could turn it into an UWU generator, replacing all the R's and L's with W's. You could turn it into any type of generator you want as long as it's possible to reach your desired result through reading and replacing strings of characters. 16 | 17 | **The beauty of FanLang is that you don't have to make up complex grammar and lingual rules, since your input language already contains all the necessary logics.** 18 | 19 | ## How does it work? 20 | 21 | Being a fan of simple things, I decided to to keep this application as simple as possible. FanLang operates on a simple read and replace principle. Character by character, the software tries to find a match from a list of input hashes. Should a matching input be found, we write away the corresponding output to our final translation. If no matching hash is found, we keep the original input. 22 | 23 | By utilizing this simple set of provided tools, the complexity of the fantasy language is limited almost solely by the lengths the user is willing to go in defining the translate rules (hashes). 24 | 25 | Find a more detailed breakdown of the exact steps the application follows to translate input to output below: 26 | 27 | 1. From our current character index in the input, read ahead by the length of the longest possible match. 28 | 2. Check the context of the input string in the following order: Is the input a word? (no letter before and no letter after) Is the input a prefix? (no letter before) Is the input a suffix? (no letter after) 29 | 3. Until a match is found, keep decreasing our match check length. 30 | 4. If no match is found at all, write away the current input character to our translation. 31 | 5. If a match is found, write away the corresponding output to our translation and increase the current index by the length of the matching input hash. 32 | 6. Repeat. 33 | 34 | This set of steps is repeated for EACH defined *sheet*, using the output from the previous sheet as the input for the next. 35 | 36 | The **order of priority** in terms of replacing is: 37 | 38 | 1. **Input length:** Longer hashes have priority over shorter hashes. 39 | 2. **Context** (Hash Type): Word > Prefix > Suffix > Default 40 | 41 | ## Features 42 | 43 | - Translate input to output through a definable data set. 44 | - Stackable translate sheets to allow for exponentially complex languages. 45 | - Enabling / disabling sheets / hashes. 46 | - Sorting by input / output / hash type. 47 | - Saving / loading projects. 48 | - Undo (will undo all changes by reloading the data set) 49 | - Automatically saving / loading input text on a per-project basis (saved in player prefs, not in the project itself) 50 | - Linked scrolling. 51 | - Highlighting translated text by selecting input text. 52 | 53 | ## Planned Features 54 | 55 | A list of "planned" features that are by no means actually planned to be in the application some specific day but are rather nice-to-haves in case I ever have time to add them. 56 | Or, since it's open source, if anyone else has time to add them ;) 57 | 58 | - Dropdown options as flags to enable or disable hash types (medium effort) 59 | - Add dropdown option for interfix; require letter before ánd after (low effort) 60 | - Improve UPPER CASING logic by checking neighboring characters. (low effort) 61 | - Multi threaded translation (medium effort) 62 | - Highlighting of hashes in sidebar depending on similarity when hovering over an input or output field. (medium effort) 63 | - Highlighting of hashes within the input and output when hovering over a hash. (higher effort) 64 | - Marking words to skip their translation using brackets [], leaving the input as the output. (low effort) 65 | 66 | ## Known Issues 67 | 68 | - Saving a new project will clear the input text, presumably because the project ID changes. (low prio) 69 | - User is able to insert '<' and '>' unless when typing at the end of the input. The user should never be able to enter these characters since it could mess with the reading functionality. Either that, or the reader should be able to handle those characters while still being able to apply the < mark > tags used for highlighting the text. 70 | 71 | ## Open Source 72 | 73 | This tool was created in Unity 3D (C#) for no other reason than that I'm very comfortable with Unity and didn't feel like figuring out Windows Forms. But since this project is open source, if you're willing to recreate the UI it should be pretty easy to convert it to whatever software you like since I decoupled the UI, data and functionality as much as possible. 74 | 75 | To use this repo in a Unity project, you can simply add it as a submodule to your project repo. 76 | Do note that you're required to add the Newtonsoft.Json package to your project. To do this simply go to the Unity Package Manager and add the following URL as package: [https://github.com/JamesNK/Newtonsoft.Json.git](https://github.com/JamesNK/Newtonsoft.Json.git) 77 | 78 | ## FAQish 79 | 80 | Issues 81 | 82 | > Please report it and I'll see if I can fix it anytime soon. 83 | 84 | Dislikes 85 | 86 | > It's open source, feel free to grab it and do with it whatever you please. 87 | If you think your changes would be a valuable to the project, please open a pull request! 88 | 89 | Suggestions 90 | 91 | > Feel free to leave a message or create it yourself and open a pull request. I may put it on the "planned" features list but I can't promise it'll ever be implemented. 92 | 93 | ## License 94 | 95 | > MIT License 96 | > 97 | > Copyright (c) 2021 Mick Boere 98 | > 99 | > Permission is hereby granted, free of charge, to any person obtaining 100 | > a copy of this software and associated documentation files (the 101 | > "Software"), to deal in the Software without restriction, including 102 | > without limitation the rights to use, copy, modify, merge, publish, 103 | > distribute, sublicense, and/or sell copies of the Software, and to 104 | > permit persons to whom the Software is furnished to do so, subject to 105 | > the following conditions: 106 | > 107 | > The above copyright notice and this permission notice shall be 108 | > included in all copies or substantial portions of the Software. 109 | > 110 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 111 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 112 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 113 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 114 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 115 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 116 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 117 | 118 | ### Additional credit 119 | Includes the [UnityStandaloneFileBrowser](https://github.com/gkngkc/UnityStandaloneFileBrowser). 120 | 121 | -------------------------------------------------------------------------------- /Resources/UI/Scrollbar Vertical.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &5334783837540337480 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3740623110937564} 12 | m_Layer: 5 13 | m_Name: Sliding Area 14 | m_TagString: Untagged 15 | m_Icon: {fileID: 0} 16 | m_NavMeshLayer: 0 17 | m_StaticEditorFlags: 0 18 | m_IsActive: 1 19 | --- !u!224 &3740623110937564 20 | RectTransform: 21 | m_ObjectHideFlags: 0 22 | m_CorrespondingSourceObject: {fileID: 0} 23 | m_PrefabInstance: {fileID: 0} 24 | m_PrefabAsset: {fileID: 0} 25 | m_GameObject: {fileID: 5334783837540337480} 26 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 27 | m_LocalPosition: {x: 0, y: 0, z: 0} 28 | m_LocalScale: {x: 1, y: 1, z: 1} 29 | m_Children: 30 | - {fileID: 7772354896798814913} 31 | m_Father: {fileID: 1491868551669573804} 32 | m_RootOrder: 0 33 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 34 | m_AnchorMin: {x: 0, y: 0} 35 | m_AnchorMax: {x: 1, y: 1} 36 | m_AnchoredPosition: {x: 0, y: 0} 37 | m_SizeDelta: {x: 0, y: 0} 38 | m_Pivot: {x: 0.5, y: 0.5} 39 | --- !u!1 &6133832033666368340 40 | GameObject: 41 | m_ObjectHideFlags: 0 42 | m_CorrespondingSourceObject: {fileID: 0} 43 | m_PrefabInstance: {fileID: 0} 44 | m_PrefabAsset: {fileID: 0} 45 | serializedVersion: 6 46 | m_Component: 47 | - component: {fileID: 7772354896798814913} 48 | - component: {fileID: 923049372554422633} 49 | - component: {fileID: 8250438647179058092} 50 | m_Layer: 5 51 | m_Name: Handle 52 | m_TagString: Untagged 53 | m_Icon: {fileID: 0} 54 | m_NavMeshLayer: 0 55 | m_StaticEditorFlags: 0 56 | m_IsActive: 1 57 | --- !u!224 &7772354896798814913 58 | RectTransform: 59 | m_ObjectHideFlags: 0 60 | m_CorrespondingSourceObject: {fileID: 0} 61 | m_PrefabInstance: {fileID: 0} 62 | m_PrefabAsset: {fileID: 0} 63 | m_GameObject: {fileID: 6133832033666368340} 64 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 65 | m_LocalPosition: {x: 0, y: 0, z: 0} 66 | m_LocalScale: {x: 1, y: 1, z: 1} 67 | m_Children: [] 68 | m_Father: {fileID: 3740623110937564} 69 | m_RootOrder: 0 70 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 71 | m_AnchorMin: {x: 0, y: 0} 72 | m_AnchorMax: {x: 0, y: 0} 73 | m_AnchoredPosition: {x: 0, y: 0} 74 | m_SizeDelta: {x: 0, y: 0} 75 | m_Pivot: {x: 0.5, y: 0.5} 76 | --- !u!222 &923049372554422633 77 | CanvasRenderer: 78 | m_ObjectHideFlags: 0 79 | m_CorrespondingSourceObject: {fileID: 0} 80 | m_PrefabInstance: {fileID: 0} 81 | m_PrefabAsset: {fileID: 0} 82 | m_GameObject: {fileID: 6133832033666368340} 83 | m_CullTransparentMesh: 0 84 | --- !u!114 &8250438647179058092 85 | MonoBehaviour: 86 | m_ObjectHideFlags: 0 87 | m_CorrespondingSourceObject: {fileID: 0} 88 | m_PrefabInstance: {fileID: 0} 89 | m_PrefabAsset: {fileID: 0} 90 | m_GameObject: {fileID: 6133832033666368340} 91 | m_Enabled: 1 92 | m_EditorHideFlags: 0 93 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 94 | m_Name: 95 | m_EditorClassIdentifier: 96 | m_Material: {fileID: 0} 97 | m_Color: {r: 1, g: 1, b: 1, a: 1} 98 | m_RaycastTarget: 1 99 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 100 | m_Maskable: 1 101 | m_OnCullStateChanged: 102 | m_PersistentCalls: 103 | m_Calls: [] 104 | m_Sprite: {fileID: 21300000, guid: 757b54d703b059f43b907d76db41c698, type: 3} 105 | m_Type: 1 106 | m_PreserveAspect: 0 107 | m_FillCenter: 1 108 | m_FillMethod: 4 109 | m_FillAmount: 1 110 | m_FillClockwise: 1 111 | m_FillOrigin: 0 112 | m_UseSpriteMesh: 0 113 | m_PixelsPerUnitMultiplier: 1 114 | --- !u!1 &6182323340783616575 115 | GameObject: 116 | m_ObjectHideFlags: 0 117 | m_CorrespondingSourceObject: {fileID: 0} 118 | m_PrefabInstance: {fileID: 0} 119 | m_PrefabAsset: {fileID: 0} 120 | serializedVersion: 6 121 | m_Component: 122 | - component: {fileID: 1491868551669573804} 123 | - component: {fileID: 7201244319404559537} 124 | - component: {fileID: 4390680118496412787} 125 | - component: {fileID: 8824075144176460392} 126 | m_Layer: 5 127 | m_Name: Scrollbar Vertical 128 | m_TagString: Untagged 129 | m_Icon: {fileID: 0} 130 | m_NavMeshLayer: 0 131 | m_StaticEditorFlags: 0 132 | m_IsActive: 1 133 | --- !u!224 &1491868551669573804 134 | RectTransform: 135 | m_ObjectHideFlags: 0 136 | m_CorrespondingSourceObject: {fileID: 0} 137 | m_PrefabInstance: {fileID: 0} 138 | m_PrefabAsset: {fileID: 0} 139 | m_GameObject: {fileID: 6182323340783616575} 140 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 141 | m_LocalPosition: {x: 0, y: 0, z: 0} 142 | m_LocalScale: {x: 1, y: 1, z: 1} 143 | m_Children: 144 | - {fileID: 3740623110937564} 145 | m_Father: {fileID: 0} 146 | m_RootOrder: 0 147 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 148 | m_AnchorMin: {x: 1, y: 0} 149 | m_AnchorMax: {x: 1, y: 1} 150 | m_AnchoredPosition: {x: 0, y: 0} 151 | m_SizeDelta: {x: 10, y: 0} 152 | m_Pivot: {x: 1, y: 0.5} 153 | --- !u!222 &7201244319404559537 154 | CanvasRenderer: 155 | m_ObjectHideFlags: 0 156 | m_CorrespondingSourceObject: {fileID: 0} 157 | m_PrefabInstance: {fileID: 0} 158 | m_PrefabAsset: {fileID: 0} 159 | m_GameObject: {fileID: 6182323340783616575} 160 | m_CullTransparentMesh: 0 161 | --- !u!114 &4390680118496412787 162 | MonoBehaviour: 163 | m_ObjectHideFlags: 0 164 | m_CorrespondingSourceObject: {fileID: 0} 165 | m_PrefabInstance: {fileID: 0} 166 | m_PrefabAsset: {fileID: 0} 167 | m_GameObject: {fileID: 6182323340783616575} 168 | m_Enabled: 1 169 | m_EditorHideFlags: 0 170 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 171 | m_Name: 172 | m_EditorClassIdentifier: 173 | m_Material: {fileID: 0} 174 | m_Color: {r: 1, g: 1, b: 1, a: 0.019607844} 175 | m_RaycastTarget: 1 176 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 177 | m_Maskable: 1 178 | m_OnCullStateChanged: 179 | m_PersistentCalls: 180 | m_Calls: [] 181 | m_Sprite: {fileID: 0} 182 | m_Type: 1 183 | m_PreserveAspect: 0 184 | m_FillCenter: 1 185 | m_FillMethod: 4 186 | m_FillAmount: 1 187 | m_FillClockwise: 1 188 | m_FillOrigin: 0 189 | m_UseSpriteMesh: 0 190 | m_PixelsPerUnitMultiplier: 1 191 | --- !u!114 &8824075144176460392 192 | MonoBehaviour: 193 | m_ObjectHideFlags: 0 194 | m_CorrespondingSourceObject: {fileID: 0} 195 | m_PrefabInstance: {fileID: 0} 196 | m_PrefabAsset: {fileID: 0} 197 | m_GameObject: {fileID: 6182323340783616575} 198 | m_Enabled: 1 199 | m_EditorHideFlags: 0 200 | m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} 201 | m_Name: 202 | m_EditorClassIdentifier: 203 | m_Navigation: 204 | m_Mode: 3 205 | m_SelectOnUp: {fileID: 0} 206 | m_SelectOnDown: {fileID: 0} 207 | m_SelectOnLeft: {fileID: 0} 208 | m_SelectOnRight: {fileID: 0} 209 | m_Transition: 1 210 | m_Colors: 211 | m_NormalColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 212 | m_HighlightedColor: {r: 1, g: 0.627451, b: 0.654902, a: 1} 213 | m_PressedColor: {r: 0.86666673, g: 0.20000002, b: 0.2509804, a: 1} 214 | m_SelectedColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 215 | m_DisabledColor: {r: 0.48235297, g: 0.22352943, b: 0.24313727, a: 1} 216 | m_ColorMultiplier: 1 217 | m_FadeDuration: 0.1 218 | m_SpriteState: 219 | m_HighlightedSprite: {fileID: 0} 220 | m_PressedSprite: {fileID: 0} 221 | m_SelectedSprite: {fileID: 0} 222 | m_DisabledSprite: {fileID: 0} 223 | m_AnimationTriggers: 224 | m_NormalTrigger: Normal 225 | m_HighlightedTrigger: Highlighted 226 | m_PressedTrigger: Pressed 227 | m_SelectedTrigger: Selected 228 | m_DisabledTrigger: Disabled 229 | m_Interactable: 1 230 | m_TargetGraphic: {fileID: 8250438647179058092} 231 | m_HandleRect: {fileID: 7772354896798814913} 232 | m_Direction: 3 233 | m_Value: 0 234 | m_Size: 1 235 | m_NumberOfSteps: 0 236 | m_OnValueChanged: 237 | m_PersistentCalls: 238 | m_Calls: [] 239 | -------------------------------------------------------------------------------- /Scripts/Translator/Translator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Text; 4 | using UnityEngine; 5 | 6 | namespace FanLang 7 | { 8 | /// 9 | /// Base translator class, able to load a object which will 10 | /// be used to translate input text passed through . 11 | /// 12 | public class Translator 13 | { 14 | private Dictionary> table; 15 | private int longestHash = 0; 16 | 17 | /// 18 | /// Creates a new object. 19 | /// 20 | /// The data which will be used to translate the given input. 21 | public Translator(TranslateSheetData sheet) 22 | { 23 | // We convert the translate sheet to a dictionary for easy access. 24 | table = new Dictionary>(); 25 | for (int i = 0; i < sheet.TranslateHashes.Count; i++) 26 | { 27 | TranslateHashData hash = sheet.TranslateHashes[i]; 28 | if (!hash.Enabled || IsEmpty(hash.Output) || IsEmpty(hash.Input)) 29 | { 30 | continue; 31 | } 32 | 33 | if (!table.ContainsKey(hash.Input)) 34 | { 35 | table.Add(hash.Input, new List()); 36 | } 37 | table[hash.Input].Add(sheet.TranslateHashes[i]); 38 | 39 | // We store the longest available hash to get the max-check-length. 40 | if (hash.Input.Length > longestHash) 41 | { 42 | longestHash = sheet.TranslateHashes[i].Input.Length; 43 | } 44 | } 45 | } 46 | 47 | /// 48 | /// Replace the given string hash by hash. 49 | /// 50 | public string Translate(string text) 51 | { 52 | if (IsEmpty(text)) 53 | { 54 | return ""; 55 | } 56 | 57 | StringBuilder translated = new StringBuilder(); 58 | for (int index = 0; index < text.Length; index++) 59 | { 60 | string output = null; 61 | 62 | // 1: If we encounter a tag, append the tag and continue to the next iteration. 63 | if (TryGetTag(text, index, out string tag, out _)) 64 | { 65 | index += tag.Length - 1; 66 | translated.Append(tag); 67 | continue; 68 | } 69 | 70 | // 2: See if we can find a matching hash starting from the current character, starting with the longest possible. 71 | int checkLength = Mathf.Min(text.Length - index, longestHash); 72 | int nextIndex = index + checkLength; 73 | while (checkLength > 0) 74 | { 75 | RichSubstring(text, index, checkLength, out string input, out string openingTags, out string closingTags); 76 | nextIndex = index + openingTags.Length + input.Length + closingTags.Length; 77 | 78 | // Is the current input a prefix? Check whether the previous character is a letter. 79 | bool foundPreviousCharacter = TryGetPreviousChar(text, index, out char previousCharacter); 80 | bool prefix = index == 0 || (foundPreviousCharacter && !char.IsLetter(previousCharacter)); 81 | 82 | // Is the current input a suffix? Check whether the next character is a letter. 83 | RichSubstring(text, nextIndex, 1, out string nextCharacter, out _, out _); 84 | bool suffix = nextIndex >= text.Length || (nextCharacter.Length > 0 && !char.IsLetter(nextCharacter[0])); 85 | 86 | if (table.ContainsKey(input.ToLower())) 87 | { 88 | string rawOutput = GetOutput(input.ToLower(), prefix, suffix); 89 | if (!IsEmpty(rawOutput)) 90 | { 91 | output = openingTags + TransferCases(input, rawOutput.ToLower()) + closingTags; 92 | break; 93 | } 94 | } 95 | 96 | checkLength--; 97 | } 98 | 99 | if (output != null) 100 | { 101 | // A matching hash was found, append and continue. 102 | translated.Append(output); 103 | index = nextIndex - 1; 104 | } 105 | else 106 | { 107 | // No matching hash was found, append the current character and continue. 108 | translated.Append(text[index]); 109 | } 110 | } 111 | 112 | return translated.ToString(); 113 | } 114 | 115 | /// 116 | /// Tries to get the previous character while reading over HTML tags. 117 | /// 118 | private bool TryGetPreviousChar(string text, int current, out char previousCharacter) 119 | { 120 | int index = current - 1; 121 | bool inTag = false; 122 | while (index >= 0) 123 | { 124 | char c = text[index]; 125 | if (c == '>') 126 | { 127 | inTag = true; 128 | } 129 | else if (inTag && c == '<') 130 | { 131 | inTag = false; 132 | } 133 | else if (!inTag) 134 | { 135 | previousCharacter = c; 136 | return true; 137 | } 138 | 139 | index--; 140 | } 141 | 142 | previousCharacter = ' '; 143 | return false; 144 | } 145 | 146 | /// 147 | /// variant that reads over HTML tags and stores them separately. 148 | /// 149 | private void RichSubstring(string text, int startIndex, int length, out string input, out string openingTags, out string closingTags) 150 | { 151 | input = ""; 152 | openingTags = ""; 153 | closingTags = ""; 154 | 155 | int index = startIndex; 156 | while (input.Length < length && index < text.Length) 157 | { 158 | if (TryGetTag(text, index, out string tag, out bool isClosingTag)) 159 | { 160 | if (isClosingTag) 161 | { 162 | closingTags += tag; 163 | } 164 | else 165 | { 166 | openingTags += tag; 167 | } 168 | 169 | index += tag.Length; 170 | } 171 | else 172 | { 173 | input += text[index]; 174 | index++; 175 | } 176 | } 177 | } 178 | 179 | private bool TryGetTag(string text, int start, out string tag, out bool isClosingTag) 180 | { 181 | if (text[start] != '<') 182 | { 183 | // We're definetely not at a tag. 184 | tag = null; 185 | isClosingTag = false; 186 | return false; 187 | } 188 | 189 | // Is the tag a closing tag or an opening tag? 190 | isClosingTag = start + 1 < text.Length && text.Substring(start, 2) == "') 199 | { 200 | // Tag closed 201 | return true; 202 | } 203 | else if (i > start && c == '<') 204 | { 205 | // Opening another tag - return false 206 | return false; 207 | } 208 | } 209 | 210 | // Out of range; incomplete tag. 211 | return false; 212 | } 213 | 214 | private string TransferCases(string from, string to) 215 | { 216 | if (IsEmpty(from) || IsEmpty(to)) 217 | { 218 | return to; 219 | } 220 | 221 | if (char.IsUpper(from[0])) 222 | { 223 | if (to.Length > 1) 224 | { 225 | return to[0].ToString().ToUpper() + to.Substring(1); 226 | } 227 | else 228 | { 229 | return to[0].ToString().ToUpper(); 230 | } 231 | } 232 | 233 | return to; 234 | } 235 | 236 | private string GetOutput(string input, bool prefix, bool suffix) 237 | { 238 | List hashes = table[input]; 239 | if (prefix && suffix && HasHash(TranslateHashType.Word)) 240 | { 241 | return GetHash(TranslateHashType.Word); 242 | } 243 | else if (prefix && HasHash(TranslateHashType.Prefix)) 244 | { 245 | return GetHash(TranslateHashType.Prefix); 246 | } 247 | else if (suffix && HasHash(TranslateHashType.Suffix)) 248 | { 249 | return GetHash(TranslateHashType.Suffix); 250 | } 251 | else if (HasHash(TranslateHashType.Default)) 252 | { 253 | return GetHash(TranslateHashType.Default); 254 | } 255 | else 256 | { 257 | return null; 258 | } 259 | 260 | bool HasHash(TranslateHashType type) 261 | { 262 | return hashes.Any((x) => x.HashType == type); 263 | } 264 | 265 | string GetHash(TranslateHashType type) 266 | { 267 | return hashes.First((x) => x.HashType == type).Output; 268 | } 269 | } 270 | 271 | private bool IsEmpty(string s) 272 | { 273 | return string.IsNullOrEmpty(s) || string.IsNullOrWhiteSpace(s); 274 | } 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /StandaloneFileBrowser/StandaloneFileBrowser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SFB { 4 | public struct ExtensionFilter { 5 | public string Name; 6 | public string[] Extensions; 7 | 8 | public ExtensionFilter(string filterName, params string[] filterExtensions) { 9 | Name = filterName; 10 | Extensions = filterExtensions; 11 | } 12 | } 13 | 14 | public class StandaloneFileBrowser { 15 | private static IStandaloneFileBrowser _platformWrapper = null; 16 | 17 | static StandaloneFileBrowser() { 18 | #if UNITY_STANDALONE_OSX 19 | _platformWrapper = new StandaloneFileBrowserMac(); 20 | #elif UNITY_STANDALONE_WIN 21 | _platformWrapper = new StandaloneFileBrowserWindows(); 22 | #elif UNITY_STANDALONE_LINUX 23 | _platformWrapper = new StandaloneFileBrowserLinux(); 24 | #elif UNITY_EDITOR 25 | _platformWrapper = new StandaloneFileBrowserEditor(); 26 | #endif 27 | } 28 | 29 | /// 30 | /// Native open file dialog 31 | /// 32 | /// Dialog title 33 | /// Root directory 34 | /// Allowed extension 35 | /// Allow multiple file selection 36 | /// Returns array of chosen paths. Zero length array when cancelled 37 | public static string[] OpenFilePanel(string title, string directory, string extension, bool multiselect) { 38 | var extensions = string.IsNullOrEmpty(extension) ? null : new [] { new ExtensionFilter("", extension) }; 39 | return OpenFilePanel(title, directory, extensions, multiselect); 40 | } 41 | 42 | /// 43 | /// Native open file dialog 44 | /// 45 | /// Dialog title 46 | /// Root directory 47 | /// List of extension filters. Filter Example: new ExtensionFilter("Image Files", "jpg", "png") 48 | /// Allow multiple file selection 49 | /// Returns array of chosen paths. Zero length array when cancelled 50 | public static string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) { 51 | return _platformWrapper.OpenFilePanel(title, directory, extensions, multiselect); 52 | } 53 | 54 | /// 55 | /// Native open file dialog async 56 | /// 57 | /// Dialog title 58 | /// Root directory 59 | /// Allowed extension 60 | /// Allow multiple file selection 61 | /// Callback") 62 | public static void OpenFilePanelAsync(string title, string directory, string extension, bool multiselect, Action cb) { 63 | var extensions = string.IsNullOrEmpty(extension) ? null : new [] { new ExtensionFilter("", extension) }; 64 | OpenFilePanelAsync(title, directory, extensions, multiselect, cb); 65 | } 66 | 67 | /// 68 | /// Native open file dialog async 69 | /// 70 | /// Dialog title 71 | /// Root directory 72 | /// List of extension filters. Filter Example: new ExtensionFilter("Image Files", "jpg", "png") 73 | /// Allow multiple file selection 74 | /// Callback") 75 | public static void OpenFilePanelAsync(string title, string directory, ExtensionFilter[] extensions, bool multiselect, Action cb) { 76 | _platformWrapper.OpenFilePanelAsync(title, directory, extensions, multiselect, cb); 77 | } 78 | 79 | /// 80 | /// Native open folder dialog 81 | /// NOTE: Multiple folder selection doesn't supported on Windows 82 | /// 83 | /// 84 | /// Root directory 85 | /// 86 | /// Returns array of chosen paths. Zero length array when cancelled 87 | public static string[] OpenFolderPanel(string title, string directory, bool multiselect) { 88 | return _platformWrapper.OpenFolderPanel(title, directory, multiselect); 89 | } 90 | 91 | /// 92 | /// Native open folder dialog async 93 | /// NOTE: Multiple folder selection doesn't supported on Windows 94 | /// 95 | /// 96 | /// Root directory 97 | /// 98 | /// Callback") 99 | public static void OpenFolderPanelAsync(string title, string directory, bool multiselect, Action cb) { 100 | _platformWrapper.OpenFolderPanelAsync(title, directory, multiselect, cb); 101 | } 102 | 103 | /// 104 | /// Native save file dialog 105 | /// 106 | /// Dialog title 107 | /// Root directory 108 | /// Default file name 109 | /// File extension 110 | /// Returns chosen path. Empty string when cancelled 111 | public static string SaveFilePanel(string title, string directory, string defaultName , string extension) { 112 | var extensions = string.IsNullOrEmpty(extension) ? null : new [] { new ExtensionFilter("", extension) }; 113 | return SaveFilePanel(title, directory, defaultName, extensions); 114 | } 115 | 116 | /// 117 | /// Native save file dialog 118 | /// 119 | /// Dialog title 120 | /// Root directory 121 | /// Default file name 122 | /// List of extension filters. Filter Example: new ExtensionFilter("Image Files", "jpg", "png") 123 | /// Returns chosen path. Empty string when cancelled 124 | public static string SaveFilePanel(string title, string directory, string defaultName, ExtensionFilter[] extensions) { 125 | return _platformWrapper.SaveFilePanel(title, directory, defaultName, extensions); 126 | } 127 | 128 | /// 129 | /// Native save file dialog async 130 | /// 131 | /// Dialog title 132 | /// Root directory 133 | /// Default file name 134 | /// File extension 135 | /// Callback") 136 | public static void SaveFilePanelAsync(string title, string directory, string defaultName , string extension, Action cb) { 137 | var extensions = string.IsNullOrEmpty(extension) ? null : new [] { new ExtensionFilter("", extension) }; 138 | SaveFilePanelAsync(title, directory, defaultName, extensions, cb); 139 | } 140 | 141 | /// 142 | /// Native save file dialog async 143 | /// 144 | /// Dialog title 145 | /// Root directory 146 | /// Default file name 147 | /// List of extension filters. Filter Example: new ExtensionFilter("Image Files", "jpg", "png") 148 | /// Callback") 149 | public static void SaveFilePanelAsync(string title, string directory, string defaultName, ExtensionFilter[] extensions, Action cb) { 150 | _platformWrapper.SaveFilePanelAsync(title, directory, defaultName, extensions, cb); 151 | } 152 | } 153 | } -------------------------------------------------------------------------------- /Scripts/Translator/TranslatorSettings.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using System.Collections.Generic; 4 | using SFB; 5 | using Newtonsoft.Json; 6 | using System.IO; 7 | using System; 8 | 9 | namespace FanLang 10 | { 11 | /// 12 | /// handling all the visuals in the settings panel of the translator. 13 | /// 14 | [RequireComponent(typeof(TranslatorBehaviour))] 15 | [RequireComponent(typeof(ConfirmationPopupBehaviour))] 16 | public class TranslatorSettings : MonoBehaviour 17 | { 18 | [SerializeField] private string dataPath; 19 | [SerializeField] private TranslateDataUIElement translateDataUI; 20 | 21 | [Header("Translator Settings")] 22 | [SerializeField] private Toggle alwaysUpdateToggle; 23 | [SerializeField] private Button updateTranslationButton; 24 | [SerializeField] private GameObject updateTranslationButtonContainer; 25 | [SerializeField] private Toggle linkScrollingToggle; 26 | 27 | [Header("Project Settings")] 28 | [SerializeField] private Button newButton; 29 | [SerializeField] private Button loadButton; 30 | [SerializeField] private Button saveButton; 31 | [SerializeField] private Button saveAsButton; 32 | [SerializeField] private Button undoAllButton; 33 | 34 | private TranslatorBehaviour translatorBehaviour; 35 | private ConfirmationPopupBehaviour confirmation; 36 | private TranslateData loadedTranslateData; 37 | private DisposableContainer disposables = new DisposableContainer(); 38 | 39 | protected void OnEnable() 40 | { 41 | translatorBehaviour = GetComponent(); 42 | confirmation = GetComponent(); 43 | translateDataUI = GetComponent(); 44 | Subscribe(); 45 | } 46 | 47 | protected void OnDisable() 48 | { 49 | Unsubscribe(); 50 | } 51 | 52 | protected void Start() 53 | { 54 | Load(); 55 | } 56 | 57 | protected void Update() 58 | { 59 | saveButton.interactable = translateDataUI.Dirty; 60 | undoAllButton.interactable = translateDataUI.Dirty; 61 | } 62 | 63 | private void Load() 64 | { 65 | if (!string.IsNullOrEmpty(dataPath)) 66 | { 67 | LoadFromPath(dataPath); 68 | } 69 | else 70 | { 71 | LoadData(CreateDefaultProject()); 72 | } 73 | 74 | alwaysUpdateToggle.SetIsOnWithoutNotify(translatorBehaviour.AlwaysUpdate); 75 | updateTranslationButtonContainer.SetActive(!translatorBehaviour.AlwaysUpdate); 76 | linkScrollingToggle.SetIsOnWithoutNotify(translatorBehaviour.LinkScrollbars); 77 | } 78 | 79 | private void LoadFromPath(string path) 80 | { 81 | if (File.Exists(path)) 82 | { 83 | dataPath = path; 84 | TranslateData data = JsonConvert.DeserializeObject(File.ReadAllText(path)); 85 | LoadData(data); 86 | } 87 | else 88 | { 89 | Debug.LogError($"File at path '{path}' does not exist."); 90 | } 91 | } 92 | 93 | private void LoadData(TranslateData translateData) 94 | { 95 | loadedTranslateData = translateData; 96 | CleanData(); 97 | translatorBehaviour.Load(translateData); 98 | translateDataUI.Initialize(translateData, confirmation); 99 | } 100 | 101 | private void SaveData(TranslateData translateData, string path, bool reload) 102 | { 103 | string json = JsonConvert.SerializeObject(translateData, Formatting.Indented); 104 | File.WriteAllText(path, json); 105 | if (reload) 106 | { 107 | LoadFromPath(path); 108 | } 109 | translateDataUI.SetDirty(false); 110 | } 111 | 112 | private void SaveAs() 113 | { 114 | StandaloneFileBrowser.SaveFilePanelAsync("Save FanLangData file", "", loadedTranslateData.Name, "fld", delegate (string path) 115 | { 116 | if (path != dataPath) 117 | { 118 | loadedTranslateData.ID = Guid.NewGuid().ToString(); 119 | } 120 | SaveData(loadedTranslateData, path, true); 121 | }); 122 | } 123 | 124 | private void CleanData() 125 | { 126 | // Make sure we have an ID, if not, generate it. 127 | if (string.IsNullOrEmpty(loadedTranslateData.ID)) 128 | { 129 | loadedTranslateData.ID = Guid.NewGuid().ToString(); 130 | } 131 | 132 | // Remove all empty data from the loaded TranslateData. 133 | for (int s = 0; s < loadedTranslateData.TranslateSheets.Count; s++) 134 | { 135 | TranslateSheetData sheet = loadedTranslateData.TranslateSheets[s]; 136 | if (sheet.TranslateHashes.Count == 0) 137 | { 138 | loadedTranslateData.TranslateSheets.Remove(sheet); 139 | s--; 140 | } 141 | else 142 | { 143 | for (int h = 0; h < sheet.TranslateHashes.Count; h++) 144 | { 145 | TranslateHashData hash = sheet.TranslateHashes[h]; 146 | if (string.IsNullOrEmpty(hash.Input) || 147 | string.IsNullOrEmpty(hash.Output)) 148 | { 149 | sheet.TranslateHashes.Remove(hash); 150 | h--; 151 | } 152 | } 153 | } 154 | } 155 | } 156 | 157 | private TranslateData CreateDefaultProject() 158 | { 159 | List sheets = new List(); 160 | sheets.Add(new TranslateSheetData()); 161 | return new TranslateData(Guid.NewGuid().ToString(), "New FanLang Project", "", sheets); 162 | } 163 | 164 | private void OnTranslateDataChanged(object data) 165 | { 166 | if (translatorBehaviour.AlwaysUpdate) 167 | { 168 | translatorBehaviour.Reload(); 169 | } 170 | } 171 | 172 | private void Subscribe() 173 | { 174 | translateDataUI.TranslateDataChangedEvent += OnTranslateDataChanged; 175 | 176 | // Set up UI bindings. 177 | disposables.Add(new ToggleBinding(alwaysUpdateToggle, () => translatorBehaviour.AlwaysUpdate, delegate (bool value) 178 | { 179 | translatorBehaviour.AlwaysUpdate = value; 180 | updateTranslationButtonContainer.SetActive(!translatorBehaviour.AlwaysUpdate); 181 | translatorBehaviour.Reload(); 182 | })); 183 | disposables.Add(new ToggleBinding(linkScrollingToggle, () => translatorBehaviour.LinkScrollbars, delegate (bool value) 184 | { 185 | translatorBehaviour.LinkScrollbars = value; 186 | })); 187 | disposables.Add(new ButtonBinding(updateTranslationButton, () => translatorBehaviour.Reload())); 188 | 189 | // NEW button. 190 | disposables.Add(new ButtonBinding(newButton, delegate 191 | { 192 | if (translateDataUI.Dirty) 193 | { 194 | confirmation.Popup("Please Confirm", "You have unsaved changes, are you sure you want to start a new project?", delegate (bool result) 195 | { 196 | if (result) 197 | { 198 | New(); 199 | } 200 | }); 201 | } 202 | else 203 | { 204 | New(); 205 | } 206 | 207 | void New() 208 | { 209 | dataPath = ""; 210 | Load(); 211 | } 212 | })); 213 | 214 | // LOAD button. 215 | disposables.Add(new ButtonBinding(loadButton, delegate 216 | { 217 | if (translateDataUI.Dirty) 218 | { 219 | confirmation.Popup("Please Confirm", "You have unsaved changes, are you sure you want to load another project?", delegate (bool result) 220 | { 221 | if (result) 222 | { 223 | Load(); 224 | } 225 | }); 226 | } 227 | else 228 | { 229 | Load(); 230 | } 231 | 232 | void Load() 233 | { 234 | StandaloneFileBrowser.OpenFilePanelAsync("Select FanLangData file to load", "", "fld", false, delegate (string[] paths) 235 | { 236 | if (paths != null && paths.Length > 0) 237 | { 238 | LoadFromPath(paths[0]); 239 | } 240 | }); 241 | } 242 | })); 243 | 244 | // SAVE button. 245 | disposables.Add(new ButtonBinding(saveButton, delegate 246 | { 247 | if (!string.IsNullOrEmpty(dataPath) && File.Exists(dataPath)) 248 | { 249 | SaveData(loadedTranslateData, dataPath, false); 250 | } 251 | else 252 | { 253 | SaveAs(); 254 | } 255 | })); 256 | 257 | // SAVE AS button. 258 | disposables.Add(new ButtonBinding(saveAsButton, SaveAs)); 259 | 260 | // UNDO ALL button. 261 | disposables.Add(new ButtonBinding(undoAllButton, delegate 262 | { 263 | confirmation.Popup("Please Confirm", "Are you sure you want to undo all unsaved changes?", delegate (bool result) 264 | { 265 | if (result) 266 | { 267 | Load(); 268 | } 269 | }); 270 | })); 271 | } 272 | 273 | private void Unsubscribe() 274 | { 275 | translateDataUI.TranslateDataChangedEvent -= OnTranslateDataChanged; 276 | // Dispose of all UI bindings. 277 | disposables.Dispose(); 278 | } 279 | } 280 | } -------------------------------------------------------------------------------- /Resources/UI/Toggle.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1305453214900633127 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3771849255777647639} 12 | - component: {fileID: 9053928616055281601} 13 | - component: {fileID: 5724935387113910741} 14 | m_Layer: 5 15 | m_Name: Background 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &3771849255777647639 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 1305453214900633127} 28 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: 32 | - {fileID: 4007290765851050734} 33 | - {fileID: 4149909431204232274} 34 | m_Father: {fileID: 3754138353344965448} 35 | m_RootOrder: 0 36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 37 | m_AnchorMin: {x: 0, y: 0} 38 | m_AnchorMax: {x: 1, y: 1} 39 | m_AnchoredPosition: {x: 0.000015258789, y: 0} 40 | m_SizeDelta: {x: 0, y: 0} 41 | m_Pivot: {x: 0.5, y: 0.5} 42 | --- !u!222 &9053928616055281601 43 | CanvasRenderer: 44 | m_ObjectHideFlags: 0 45 | m_CorrespondingSourceObject: {fileID: 0} 46 | m_PrefabInstance: {fileID: 0} 47 | m_PrefabAsset: {fileID: 0} 48 | m_GameObject: {fileID: 1305453214900633127} 49 | m_CullTransparentMesh: 0 50 | --- !u!114 &5724935387113910741 51 | MonoBehaviour: 52 | m_ObjectHideFlags: 0 53 | m_CorrespondingSourceObject: {fileID: 0} 54 | m_PrefabInstance: {fileID: 0} 55 | m_PrefabAsset: {fileID: 0} 56 | m_GameObject: {fileID: 1305453214900633127} 57 | m_Enabled: 1 58 | m_EditorHideFlags: 0 59 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 60 | m_Name: 61 | m_EditorClassIdentifier: 62 | m_Material: {fileID: 0} 63 | m_Color: {r: 0.23529413, g: 0.2392157, b: 0.2509804, a: 1} 64 | m_RaycastTarget: 1 65 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 66 | m_Maskable: 1 67 | m_OnCullStateChanged: 68 | m_PersistentCalls: 69 | m_Calls: [] 70 | m_Sprite: {fileID: 0} 71 | m_Type: 0 72 | m_PreserveAspect: 0 73 | m_FillCenter: 1 74 | m_FillMethod: 4 75 | m_FillAmount: 1 76 | m_FillClockwise: 1 77 | m_FillOrigin: 0 78 | m_UseSpriteMesh: 1 79 | m_PixelsPerUnitMultiplier: 1 80 | --- !u!1 &4590716345578061398 81 | GameObject: 82 | m_ObjectHideFlags: 0 83 | m_CorrespondingSourceObject: {fileID: 0} 84 | m_PrefabInstance: {fileID: 0} 85 | m_PrefabAsset: {fileID: 0} 86 | serializedVersion: 6 87 | m_Component: 88 | - component: {fileID: 4149909431204232274} 89 | - component: {fileID: 1683560697127512500} 90 | - component: {fileID: 4614621990791786608} 91 | m_Layer: 5 92 | m_Name: Checkmark 93 | m_TagString: Untagged 94 | m_Icon: {fileID: 0} 95 | m_NavMeshLayer: 0 96 | m_StaticEditorFlags: 0 97 | m_IsActive: 1 98 | --- !u!224 &4149909431204232274 99 | RectTransform: 100 | m_ObjectHideFlags: 0 101 | m_CorrespondingSourceObject: {fileID: 0} 102 | m_PrefabInstance: {fileID: 0} 103 | m_PrefabAsset: {fileID: 0} 104 | m_GameObject: {fileID: 4590716345578061398} 105 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 106 | m_LocalPosition: {x: 0, y: 0, z: 0} 107 | m_LocalScale: {x: 1, y: 1, z: 1} 108 | m_Children: [] 109 | m_Father: {fileID: 3771849255777647639} 110 | m_RootOrder: 1 111 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 112 | m_AnchorMin: {x: 0, y: 0} 113 | m_AnchorMax: {x: 1, y: 1} 114 | m_AnchoredPosition: {x: 0, y: 0} 115 | m_SizeDelta: {x: -8, y: -8} 116 | m_Pivot: {x: 0.5, y: 0.5} 117 | --- !u!222 &1683560697127512500 118 | CanvasRenderer: 119 | m_ObjectHideFlags: 0 120 | m_CorrespondingSourceObject: {fileID: 0} 121 | m_PrefabInstance: {fileID: 0} 122 | m_PrefabAsset: {fileID: 0} 123 | m_GameObject: {fileID: 4590716345578061398} 124 | m_CullTransparentMesh: 0 125 | --- !u!114 &4614621990791786608 126 | MonoBehaviour: 127 | m_ObjectHideFlags: 0 128 | m_CorrespondingSourceObject: {fileID: 0} 129 | m_PrefabInstance: {fileID: 0} 130 | m_PrefabAsset: {fileID: 0} 131 | m_GameObject: {fileID: 4590716345578061398} 132 | m_Enabled: 1 133 | m_EditorHideFlags: 0 134 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 135 | m_Name: 136 | m_EditorClassIdentifier: 137 | m_Material: {fileID: 0} 138 | m_Color: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 139 | m_RaycastTarget: 1 140 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 141 | m_Maskable: 1 142 | m_OnCullStateChanged: 143 | m_PersistentCalls: 144 | m_Calls: [] 145 | m_Sprite: {fileID: 0} 146 | m_Type: 0 147 | m_PreserveAspect: 0 148 | m_FillCenter: 1 149 | m_FillMethod: 4 150 | m_FillAmount: 1 151 | m_FillClockwise: 1 152 | m_FillOrigin: 0 153 | m_UseSpriteMesh: 0 154 | m_PixelsPerUnitMultiplier: 1 155 | --- !u!1 &5150125095879783183 156 | GameObject: 157 | m_ObjectHideFlags: 0 158 | m_CorrespondingSourceObject: {fileID: 0} 159 | m_PrefabInstance: {fileID: 0} 160 | m_PrefabAsset: {fileID: 0} 161 | serializedVersion: 6 162 | m_Component: 163 | - component: {fileID: 4007290765851050734} 164 | - component: {fileID: 3377781278049878522} 165 | - component: {fileID: 4243087234076043924} 166 | m_Layer: 5 167 | m_Name: Image_1 168 | m_TagString: Untagged 169 | m_Icon: {fileID: 0} 170 | m_NavMeshLayer: 0 171 | m_StaticEditorFlags: 0 172 | m_IsActive: 1 173 | --- !u!224 &4007290765851050734 174 | RectTransform: 175 | m_ObjectHideFlags: 0 176 | m_CorrespondingSourceObject: {fileID: 0} 177 | m_PrefabInstance: {fileID: 0} 178 | m_PrefabAsset: {fileID: 0} 179 | m_GameObject: {fileID: 5150125095879783183} 180 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 181 | m_LocalPosition: {x: 0, y: 0, z: 0} 182 | m_LocalScale: {x: 1, y: 1, z: 1} 183 | m_Children: [] 184 | m_Father: {fileID: 3771849255777647639} 185 | m_RootOrder: 0 186 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 187 | m_AnchorMin: {x: 0, y: 0} 188 | m_AnchorMax: {x: 1, y: 1} 189 | m_AnchoredPosition: {x: 0, y: 0} 190 | m_SizeDelta: {x: 0, y: 0} 191 | m_Pivot: {x: 0.5, y: 0.5} 192 | --- !u!222 &3377781278049878522 193 | CanvasRenderer: 194 | m_ObjectHideFlags: 0 195 | m_CorrespondingSourceObject: {fileID: 0} 196 | m_PrefabInstance: {fileID: 0} 197 | m_PrefabAsset: {fileID: 0} 198 | m_GameObject: {fileID: 5150125095879783183} 199 | m_CullTransparentMesh: 0 200 | --- !u!114 &4243087234076043924 201 | MonoBehaviour: 202 | m_ObjectHideFlags: 0 203 | m_CorrespondingSourceObject: {fileID: 0} 204 | m_PrefabInstance: {fileID: 0} 205 | m_PrefabAsset: {fileID: 0} 206 | m_GameObject: {fileID: 5150125095879783183} 207 | m_Enabled: 1 208 | m_EditorHideFlags: 0 209 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 210 | m_Name: 211 | m_EditorClassIdentifier: 212 | m_Material: {fileID: 0} 213 | m_Color: {r: 1, g: 1, b: 1, a: 1} 214 | m_RaycastTarget: 1 215 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 216 | m_Maskable: 1 217 | m_OnCullStateChanged: 218 | m_PersistentCalls: 219 | m_Calls: [] 220 | m_Sprite: {fileID: 21300000, guid: 8923f79fdf3d5bd41955533befb4568a, type: 3} 221 | m_Type: 2 222 | m_PreserveAspect: 0 223 | m_FillCenter: 1 224 | m_FillMethod: 4 225 | m_FillAmount: 1 226 | m_FillClockwise: 1 227 | m_FillOrigin: 0 228 | m_UseSpriteMesh: 0 229 | m_PixelsPerUnitMultiplier: 1 230 | --- !u!1 &5227449837369567003 231 | GameObject: 232 | m_ObjectHideFlags: 0 233 | m_CorrespondingSourceObject: {fileID: 0} 234 | m_PrefabInstance: {fileID: 0} 235 | m_PrefabAsset: {fileID: 0} 236 | serializedVersion: 6 237 | m_Component: 238 | - component: {fileID: 3754138353344965448} 239 | - component: {fileID: 5032932092522932226} 240 | m_Layer: 5 241 | m_Name: Toggle 242 | m_TagString: Untagged 243 | m_Icon: {fileID: 0} 244 | m_NavMeshLayer: 0 245 | m_StaticEditorFlags: 0 246 | m_IsActive: 1 247 | --- !u!224 &3754138353344965448 248 | RectTransform: 249 | m_ObjectHideFlags: 0 250 | m_CorrespondingSourceObject: {fileID: 0} 251 | m_PrefabInstance: {fileID: 0} 252 | m_PrefabAsset: {fileID: 0} 253 | m_GameObject: {fileID: 5227449837369567003} 254 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 255 | m_LocalPosition: {x: 0, y: 0, z: 0} 256 | m_LocalScale: {x: 1, y: 1, z: 1} 257 | m_Children: 258 | - {fileID: 3771849255777647639} 259 | m_Father: {fileID: 0} 260 | m_RootOrder: 0 261 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 262 | m_AnchorMin: {x: 0, y: 0.5} 263 | m_AnchorMax: {x: 0, y: 0.5} 264 | m_AnchoredPosition: {x: 5, y: 0} 265 | m_SizeDelta: {x: 20, y: 20} 266 | m_Pivot: {x: 0, y: 0.5} 267 | --- !u!114 &5032932092522932226 268 | MonoBehaviour: 269 | m_ObjectHideFlags: 0 270 | m_CorrespondingSourceObject: {fileID: 0} 271 | m_PrefabInstance: {fileID: 0} 272 | m_PrefabAsset: {fileID: 0} 273 | m_GameObject: {fileID: 5227449837369567003} 274 | m_Enabled: 1 275 | m_EditorHideFlags: 0 276 | m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} 277 | m_Name: 278 | m_EditorClassIdentifier: 279 | m_Navigation: 280 | m_Mode: 3 281 | m_SelectOnUp: {fileID: 0} 282 | m_SelectOnDown: {fileID: 0} 283 | m_SelectOnLeft: {fileID: 0} 284 | m_SelectOnRight: {fileID: 0} 285 | m_Transition: 1 286 | m_Colors: 287 | m_NormalColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 288 | m_HighlightedColor: {r: 1, g: 0.627451, b: 0.654902, a: 1} 289 | m_PressedColor: {r: 0.86666673, g: 0.20000002, b: 0.2509804, a: 1} 290 | m_SelectedColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 291 | m_DisabledColor: {r: 0.48235297, g: 0.22352943, b: 0.24313727, a: 1} 292 | m_ColorMultiplier: 1 293 | m_FadeDuration: 0.1 294 | m_SpriteState: 295 | m_HighlightedSprite: {fileID: 0} 296 | m_PressedSprite: {fileID: 0} 297 | m_SelectedSprite: {fileID: 0} 298 | m_DisabledSprite: {fileID: 0} 299 | m_AnimationTriggers: 300 | m_NormalTrigger: Normal 301 | m_HighlightedTrigger: Highlighted 302 | m_PressedTrigger: Pressed 303 | m_SelectedTrigger: Selected 304 | m_DisabledTrigger: Disabled 305 | m_Interactable: 1 306 | m_TargetGraphic: {fileID: 4243087234076043924} 307 | toggleTransition: 1 308 | graphic: {fileID: 4614621990791786608} 309 | m_Group: {fileID: 0} 310 | onValueChanged: 311 | m_PersistentCalls: 312 | m_Calls: [] 313 | m_IsOn: 1 314 | -------------------------------------------------------------------------------- /Resources/UI/MenuButton.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &615829030540557148 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 8110885035204915752} 12 | - component: {fileID: 6577433196152882448} 13 | - component: {fileID: 9197447210404343796} 14 | m_Layer: 5 15 | m_Name: Text (TMP) 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &8110885035204915752 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 615829030540557148} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: [] 32 | m_Father: {fileID: 6942455437132277396} 33 | m_RootOrder: 1 34 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 35 | m_AnchorMin: {x: 0, y: 0} 36 | m_AnchorMax: {x: 1, y: 1} 37 | m_AnchoredPosition: {x: 0, y: 0} 38 | m_SizeDelta: {x: 0, y: 0} 39 | m_Pivot: {x: 0.5, y: 0.5} 40 | --- !u!222 &6577433196152882448 41 | CanvasRenderer: 42 | m_ObjectHideFlags: 0 43 | m_CorrespondingSourceObject: {fileID: 0} 44 | m_PrefabInstance: {fileID: 0} 45 | m_PrefabAsset: {fileID: 0} 46 | m_GameObject: {fileID: 615829030540557148} 47 | m_CullTransparentMesh: 0 48 | --- !u!114 &9197447210404343796 49 | MonoBehaviour: 50 | m_ObjectHideFlags: 0 51 | m_CorrespondingSourceObject: {fileID: 0} 52 | m_PrefabInstance: {fileID: 0} 53 | m_PrefabAsset: {fileID: 0} 54 | m_GameObject: {fileID: 615829030540557148} 55 | m_Enabled: 1 56 | m_EditorHideFlags: 0 57 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 58 | m_Name: 59 | m_EditorClassIdentifier: 60 | m_Material: {fileID: 0} 61 | m_Color: {r: 1, g: 1, b: 1, a: 1} 62 | m_RaycastTarget: 1 63 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 64 | m_Maskable: 1 65 | m_OnCullStateChanged: 66 | m_PersistentCalls: 67 | m_Calls: [] 68 | m_text: New 69 | m_isRightToLeft: 0 70 | m_fontAsset: {fileID: 11400000, guid: 1922ad64e9e9dbe4f881091755ffe671, type: 2} 71 | m_sharedMaterial: {fileID: -3923861552156722563, guid: 1922ad64e9e9dbe4f881091755ffe671, 72 | type: 2} 73 | m_fontSharedMaterials: [] 74 | m_fontMaterial: {fileID: 0} 75 | m_fontMaterials: [] 76 | m_fontColor32: 77 | serializedVersion: 2 78 | rgba: 4290035129 79 | m_fontColor: {r: 0.7254902, g: 0.7411765, b: 0.7058824, a: 1} 80 | m_enableVertexGradient: 0 81 | m_colorMode: 3 82 | m_fontColorGradient: 83 | topLeft: {r: 1, g: 1, b: 1, a: 1} 84 | topRight: {r: 1, g: 1, b: 1, a: 1} 85 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 86 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 87 | m_fontColorGradientPreset: {fileID: 0} 88 | m_spriteAsset: {fileID: 0} 89 | m_tintAllSprites: 0 90 | m_StyleSheet: {fileID: 0} 91 | m_TextStyleHashCode: -1183493901 92 | m_overrideHtmlColors: 0 93 | m_faceColor: 94 | serializedVersion: 2 95 | rgba: 4294967295 96 | m_fontSize: 14 97 | m_fontSizeBase: 14 98 | m_fontWeight: 400 99 | m_enableAutoSizing: 0 100 | m_fontSizeMin: 18 101 | m_fontSizeMax: 72 102 | m_fontStyle: 17 103 | m_HorizontalAlignment: 2 104 | m_VerticalAlignment: 512 105 | m_textAlignment: 65535 106 | m_characterSpacing: 0 107 | m_wordSpacing: 0 108 | m_lineSpacing: 0 109 | m_lineSpacingMax: 0 110 | m_paragraphSpacing: 0 111 | m_charWidthMaxAdj: 0 112 | m_enableWordWrapping: 1 113 | m_wordWrappingRatios: 0.4 114 | m_overflowMode: 0 115 | m_linkedTextComponent: {fileID: 0} 116 | parentLinkedComponent: {fileID: 0} 117 | m_enableKerning: 1 118 | m_enableExtraPadding: 0 119 | checkPaddingRequired: 0 120 | m_isRichText: 1 121 | m_parseCtrlCharacters: 1 122 | m_isOrthographic: 1 123 | m_isCullingEnabled: 0 124 | m_horizontalMapping: 0 125 | m_verticalMapping: 0 126 | m_uvLineOffset: 0 127 | m_geometrySortingOrder: 0 128 | m_IsTextObjectScaleStatic: 0 129 | m_VertexBufferAutoSizeReduction: 1 130 | m_useMaxVisibleDescender: 1 131 | m_pageToDisplay: 1 132 | m_margin: {x: 0, y: 0, z: 0, w: 0} 133 | m_isUsingLegacyAnimationComponent: 0 134 | m_isVolumetricText: 0 135 | m_hasFontAssetChanged: 0 136 | m_baseMaterial: {fileID: 0} 137 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 138 | --- !u!1 &6256729419677454633 139 | GameObject: 140 | m_ObjectHideFlags: 0 141 | m_CorrespondingSourceObject: {fileID: 0} 142 | m_PrefabInstance: {fileID: 0} 143 | m_PrefabAsset: {fileID: 0} 144 | serializedVersion: 6 145 | m_Component: 146 | - component: {fileID: 6942455437132277396} 147 | - component: {fileID: 6302113460002128200} 148 | - component: {fileID: 3870006931198771379} 149 | - component: {fileID: 1380094530133258783} 150 | m_Layer: 5 151 | m_Name: MenuButton 152 | m_TagString: Untagged 153 | m_Icon: {fileID: 0} 154 | m_NavMeshLayer: 0 155 | m_StaticEditorFlags: 0 156 | m_IsActive: 1 157 | --- !u!224 &6942455437132277396 158 | RectTransform: 159 | m_ObjectHideFlags: 0 160 | m_CorrespondingSourceObject: {fileID: 0} 161 | m_PrefabInstance: {fileID: 0} 162 | m_PrefabAsset: {fileID: 0} 163 | m_GameObject: {fileID: 6256729419677454633} 164 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 165 | m_LocalPosition: {x: 0, y: 0, z: 0} 166 | m_LocalScale: {x: 1, y: 1, z: 1} 167 | m_Children: 168 | - {fileID: 9043919517118556106} 169 | - {fileID: 8110885035204915752} 170 | m_Father: {fileID: 0} 171 | m_RootOrder: 0 172 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 173 | m_AnchorMin: {x: 0, y: 0} 174 | m_AnchorMax: {x: 0, y: 0} 175 | m_AnchoredPosition: {x: 0, y: 0} 176 | m_SizeDelta: {x: 0, y: 0} 177 | m_Pivot: {x: 0.5, y: 0.5} 178 | --- !u!222 &6302113460002128200 179 | CanvasRenderer: 180 | m_ObjectHideFlags: 0 181 | m_CorrespondingSourceObject: {fileID: 0} 182 | m_PrefabInstance: {fileID: 0} 183 | m_PrefabAsset: {fileID: 0} 184 | m_GameObject: {fileID: 6256729419677454633} 185 | m_CullTransparentMesh: 0 186 | --- !u!114 &3870006931198771379 187 | MonoBehaviour: 188 | m_ObjectHideFlags: 0 189 | m_CorrespondingSourceObject: {fileID: 0} 190 | m_PrefabInstance: {fileID: 0} 191 | m_PrefabAsset: {fileID: 0} 192 | m_GameObject: {fileID: 6256729419677454633} 193 | m_Enabled: 1 194 | m_EditorHideFlags: 0 195 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 196 | m_Name: 197 | m_EditorClassIdentifier: 198 | m_Material: {fileID: 0} 199 | m_Color: {r: 0.23529413, g: 0.2392157, b: 0.2509804, a: 1} 200 | m_RaycastTarget: 1 201 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 202 | m_Maskable: 1 203 | m_OnCullStateChanged: 204 | m_PersistentCalls: 205 | m_Calls: [] 206 | m_Sprite: {fileID: 0} 207 | m_Type: 1 208 | m_PreserveAspect: 0 209 | m_FillCenter: 1 210 | m_FillMethod: 4 211 | m_FillAmount: 1 212 | m_FillClockwise: 1 213 | m_FillOrigin: 0 214 | m_UseSpriteMesh: 0 215 | m_PixelsPerUnitMultiplier: 1 216 | --- !u!114 &1380094530133258783 217 | MonoBehaviour: 218 | m_ObjectHideFlags: 0 219 | m_CorrespondingSourceObject: {fileID: 0} 220 | m_PrefabInstance: {fileID: 0} 221 | m_PrefabAsset: {fileID: 0} 222 | m_GameObject: {fileID: 6256729419677454633} 223 | m_Enabled: 1 224 | m_EditorHideFlags: 0 225 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 226 | m_Name: 227 | m_EditorClassIdentifier: 228 | m_Navigation: 229 | m_Mode: 3 230 | m_SelectOnUp: {fileID: 0} 231 | m_SelectOnDown: {fileID: 0} 232 | m_SelectOnLeft: {fileID: 0} 233 | m_SelectOnRight: {fileID: 0} 234 | m_Transition: 1 235 | m_Colors: 236 | m_NormalColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 237 | m_HighlightedColor: {r: 1, g: 0.6273585, b: 0.6560233, a: 1} 238 | m_PressedColor: {r: 0.8679245, g: 0.20060521, b: 0.25193766, a: 1} 239 | m_SelectedColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 240 | m_DisabledColor: {r: 0.4811321, g: 0.2246796, b: 0.24440679, a: 1} 241 | m_ColorMultiplier: 1 242 | m_FadeDuration: 0.1 243 | m_SpriteState: 244 | m_HighlightedSprite: {fileID: 0} 245 | m_PressedSprite: {fileID: 0} 246 | m_SelectedSprite: {fileID: 0} 247 | m_DisabledSprite: {fileID: 0} 248 | m_AnimationTriggers: 249 | m_NormalTrigger: Normal 250 | m_HighlightedTrigger: Highlighted 251 | m_PressedTrigger: Pressed 252 | m_SelectedTrigger: Selected 253 | m_DisabledTrigger: Disabled 254 | m_Interactable: 1 255 | m_TargetGraphic: {fileID: 7690886191265284628} 256 | m_OnClick: 257 | m_PersistentCalls: 258 | m_Calls: [] 259 | --- !u!1 &7214502557086458813 260 | GameObject: 261 | m_ObjectHideFlags: 0 262 | m_CorrespondingSourceObject: {fileID: 0} 263 | m_PrefabInstance: {fileID: 0} 264 | m_PrefabAsset: {fileID: 0} 265 | serializedVersion: 6 266 | m_Component: 267 | - component: {fileID: 9043919517118556106} 268 | - component: {fileID: 5723885653980136758} 269 | - component: {fileID: 7690886191265284628} 270 | m_Layer: 5 271 | m_Name: Image 272 | m_TagString: Untagged 273 | m_Icon: {fileID: 0} 274 | m_NavMeshLayer: 0 275 | m_StaticEditorFlags: 0 276 | m_IsActive: 1 277 | --- !u!224 &9043919517118556106 278 | RectTransform: 279 | m_ObjectHideFlags: 0 280 | m_CorrespondingSourceObject: {fileID: 0} 281 | m_PrefabInstance: {fileID: 0} 282 | m_PrefabAsset: {fileID: 0} 283 | m_GameObject: {fileID: 7214502557086458813} 284 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 285 | m_LocalPosition: {x: 0, y: 0, z: 0} 286 | m_LocalScale: {x: 1, y: 1, z: 1} 287 | m_Children: [] 288 | m_Father: {fileID: 6942455437132277396} 289 | m_RootOrder: 0 290 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 291 | m_AnchorMin: {x: 0, y: 0} 292 | m_AnchorMax: {x: 1, y: 1} 293 | m_AnchoredPosition: {x: 0, y: 0} 294 | m_SizeDelta: {x: 0, y: 0} 295 | m_Pivot: {x: 0.5, y: 0.5} 296 | --- !u!222 &5723885653980136758 297 | CanvasRenderer: 298 | m_ObjectHideFlags: 0 299 | m_CorrespondingSourceObject: {fileID: 0} 300 | m_PrefabInstance: {fileID: 0} 301 | m_PrefabAsset: {fileID: 0} 302 | m_GameObject: {fileID: 7214502557086458813} 303 | m_CullTransparentMesh: 0 304 | --- !u!114 &7690886191265284628 305 | MonoBehaviour: 306 | m_ObjectHideFlags: 0 307 | m_CorrespondingSourceObject: {fileID: 0} 308 | m_PrefabInstance: {fileID: 0} 309 | m_PrefabAsset: {fileID: 0} 310 | m_GameObject: {fileID: 7214502557086458813} 311 | m_Enabled: 1 312 | m_EditorHideFlags: 0 313 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 314 | m_Name: 315 | m_EditorClassIdentifier: 316 | m_Material: {fileID: 0} 317 | m_Color: {r: 1, g: 1, b: 1, a: 1} 318 | m_RaycastTarget: 1 319 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 320 | m_Maskable: 1 321 | m_OnCullStateChanged: 322 | m_PersistentCalls: 323 | m_Calls: [] 324 | m_Sprite: {fileID: 21300000, guid: 8923f79fdf3d5bd41955533befb4568a, type: 3} 325 | m_Type: 2 326 | m_PreserveAspect: 0 327 | m_FillCenter: 1 328 | m_FillMethod: 4 329 | m_FillAmount: 1 330 | m_FillClockwise: 1 331 | m_FillOrigin: 0 332 | m_UseSpriteMesh: 0 333 | m_PixelsPerUnitMultiplier: 1 334 | -------------------------------------------------------------------------------- /Art/Polygon_Circle.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6e1537fdc15a83d48a08be4f55bf12ac 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 3 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 4 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | maxTextureSizeSet: 0 59 | compressionQualitySet: 0 60 | textureFormatSet: 0 61 | ignorePngGamma: 0 62 | applyGammaDecoding: 0 63 | platformSettings: 64 | - serializedVersion: 3 65 | buildTarget: DefaultTexturePlatform 66 | maxTextureSize: 1024 67 | resizeAlgorithm: 0 68 | textureFormat: 4 69 | textureCompression: 1 70 | compressionQuality: 50 71 | crunchedCompression: 0 72 | allowsAlphaSplitting: 0 73 | overridden: 0 74 | androidETC2FallbackOverride: 0 75 | forceMaximumCompressionQuality_BC6H_BC7: 0 76 | - serializedVersion: 3 77 | buildTarget: Standalone 78 | maxTextureSize: 1024 79 | resizeAlgorithm: 0 80 | textureFormat: 4 81 | textureCompression: 1 82 | compressionQuality: 50 83 | crunchedCompression: 0 84 | allowsAlphaSplitting: 0 85 | overridden: 0 86 | androidETC2FallbackOverride: 0 87 | forceMaximumCompressionQuality_BC6H_BC7: 0 88 | spriteSheet: 89 | serializedVersion: 2 90 | sprites: [] 91 | outline: 92 | - - {x: 0, y: 2} 93 | - {x: -0.09813535, y: 1.9975909} 94 | - {x: -0.19603428, y: 1.9903694} 95 | - {x: -0.29346094, y: 1.978353} 96 | - {x: -0.39018065, y: 1.9615705} 97 | - {x: -0.4859604, y: 1.9400625} 98 | - {x: -0.5805693, y: 1.9138807} 99 | - {x: -0.67377967, y: 1.8830881} 100 | - {x: -0.76536685, y: 1.8477591} 101 | - {x: -0.8551101, y: 1.8079786} 102 | - {x: -0.9427934, y: 1.7638426} 103 | - {x: -1.0282055, y: 1.7154572} 104 | - {x: -1.1111405, y: 1.6629392} 105 | - {x: -1.1913986, y: 1.606415} 106 | - {x: -1.2687867, y: 1.5460209} 107 | - {x: -1.343118, y: 1.4819021} 108 | - {x: -1.4142137, y: 1.4142134} 109 | - {x: -1.4819024, y: 1.3431177} 110 | - {x: -1.5460211, y: 1.2687864} 111 | - {x: -1.6064153, y: 1.1913984} 112 | - {x: -1.6629394, y: 1.1111403} 113 | - {x: -1.7154574, y: 1.0282052} 114 | - {x: -1.7638427, y: 0.94279313} 115 | - {x: -1.8079787, y: 0.8551098} 116 | - {x: -1.8477592, y: 0.76536644} 117 | - {x: -1.8830884, y: 0.6737792} 118 | - {x: -1.9138808, y: 0.5805688} 119 | - {x: -1.9400626, y: 0.48595977} 120 | - {x: -1.9615707, y: 0.39018002} 121 | - {x: -1.9783531, y: 0.29346028} 122 | - {x: -1.9903696, y: 0.19603357} 123 | - {x: -1.9975909, y: 0.098134585} 124 | - {x: -2, y: -0.0000008026785} 125 | - {x: -1.9975909, y: -0.09813619} 126 | - {x: -1.9903693, y: -0.19603516} 127 | - {x: -1.9783529, y: -0.29346186} 128 | - {x: -1.9615704, y: -0.3901816} 129 | - {x: -1.9400623, y: -0.48596132} 130 | - {x: -1.9138803, y: -0.58057034} 131 | - {x: -1.8830878, y: -0.67378074} 132 | - {x: -1.8477587, y: -0.7653679} 133 | - {x: -1.8079782, y: -0.855111} 134 | - {x: -1.7638422, y: -0.9427941} 135 | - {x: -1.715457, y: -1.028206} 136 | - {x: -1.6629391, y: -1.1111407} 137 | - {x: -1.606415, y: -1.1913987} 138 | - {x: -1.546021, y: -1.2687865} 139 | - {x: -1.4819025, y: -1.3431177} 140 | - {x: -1.4142139, y: -1.4142132} 141 | - {x: -1.3431184, y: -1.4819018} 142 | - {x: -1.2687873, y: -1.5460204} 143 | - {x: -1.1913995, y: -1.6064144} 144 | - {x: -1.1111416, y: -1.6629385} 145 | - {x: -1.0282067, y: -1.7154565} 146 | - {x: -0.9427949, y: -1.7638417} 147 | - {x: -0.85511184, y: -1.8079778} 148 | - {x: -0.76536876, y: -1.8477583} 149 | - {x: -0.6737818, y: -1.8830874} 150 | - {x: -0.5805717, y: -1.91388} 151 | - {x: -0.48596293, y: -1.9400618} 152 | - {x: -0.39018345, y: -1.96157} 153 | - {x: -0.29346398, y: -1.9783525} 154 | - {x: -0.1960375, y: -1.9903691} 155 | - {x: -0.09813879, y: -1.9975908} 156 | - {x: -0.0000036398517, y: -2} 157 | - {x: 0.098131515, y: -1.9975911} 158 | - {x: 0.19603026, y: -1.9903698} 159 | - {x: 0.29345676, y: -1.9783536} 160 | - {x: 0.3901763, y: -1.9615715} 161 | - {x: 0.48595586, y: -1.9400636} 162 | - {x: 0.58056474, y: -1.913882} 163 | - {x: 0.67377496, y: -1.8830898} 164 | - {x: 0.765362, y: -1.847761} 165 | - {x: 0.8551053, y: -1.8079809} 166 | - {x: 0.94278854, y: -1.7638452} 167 | - {x: 1.0282005, y: -1.7154602} 168 | - {x: 1.1111355, y: -1.6629425} 169 | - {x: 1.1913936, y: -1.6064187} 170 | - {x: 1.2687817, y: -1.5460249} 171 | - {x: 1.3431131, y: -1.4819067} 172 | - {x: 1.4142088, y: -1.4142184} 173 | - {x: 1.4818976, y: -1.3431231} 174 | - {x: 1.5460167, y: -1.2687918} 175 | - {x: 1.6064112, y: -1.1914037} 176 | - {x: 1.6629357, y: -1.1111456} 177 | - {x: 1.7154542, y: -1.0282105} 178 | - {x: 1.7638398, y: -0.94279844} 179 | - {x: 1.8079762, y: -0.855115} 180 | - {x: 1.8477571, y: -0.76537156} 181 | - {x: 1.8830866, y: -0.6737842} 182 | - {x: 1.9138794, y: -0.5805737} 183 | - {x: 1.9400615, y: -0.48596448} 184 | - {x: 1.9615698, y: -0.39018452} 185 | - {x: 1.9783524, y: -0.29346457} 186 | - {x: 1.9903691, y: -0.19603767} 187 | - {x: 1.9975908, y: -0.09813846} 188 | - {x: 2, y: -0.0000028371733} 189 | - {x: 1.997591, y: 0.0981328} 190 | - {x: 1.9903697, y: 0.19603202} 191 | - {x: 1.9783533, y: 0.29345897} 192 | - {x: 1.9615709, y: 0.39017895} 193 | - {x: 1.9400629, y: 0.48595896} 194 | - {x: 1.9138811, y: 0.58056825} 195 | - {x: 1.8830885, y: 0.6737789} 196 | - {x: 1.8477592, y: 0.7653663} 197 | - {x: 1.8079787, y: 0.8551099} 198 | - {x: 1.7638426, y: 0.9427934} 199 | - {x: 1.7154571, y: 1.0282056} 200 | - {x: 1.662939, y: 1.1111408} 201 | - {x: 1.6064146, y: 1.1913992} 202 | - {x: 1.5460203, y: 1.2687874} 203 | - {x: 1.4819014, y: 1.3431189} 204 | - {x: 1.4142125, y: 1.4142147} 205 | - {x: 1.3431165, y: 1.4819036} 206 | - {x: 1.2687849, y: 1.5460223} 207 | - {x: 1.1913966, y: 1.6064166} 208 | - {x: 1.1111382, y: 1.6629407} 209 | - {x: 1.0282029, y: 1.7154588} 210 | - {x: 0.94279057, y: 1.7638441} 211 | - {x: 0.85510695, y: 1.8079801} 212 | - {x: 0.76536334, y: 1.8477606} 213 | - {x: 0.67377585, y: 1.8830895} 214 | - {x: 0.58056515, y: 1.9138819} 215 | - {x: 0.48595583, y: 1.9400636} 216 | - {x: 0.3901758, y: 1.9615716} 217 | - {x: 0.29345578, y: 1.9783537} 218 | - {x: 0.1960288, y: 1.99037} 219 | - {x: 0.09812956, y: 1.9975911} 220 | physicsShape: 221 | - - {x: 0, y: 2} 222 | - {x: -0.09813535, y: 1.9975909} 223 | - {x: -0.19603428, y: 1.9903694} 224 | - {x: -0.29346094, y: 1.978353} 225 | - {x: -0.39018065, y: 1.9615705} 226 | - {x: -0.4859604, y: 1.9400625} 227 | - {x: -0.5805693, y: 1.9138807} 228 | - {x: -0.67377967, y: 1.8830881} 229 | - {x: -0.76536685, y: 1.8477591} 230 | - {x: -0.8551101, y: 1.8079786} 231 | - {x: -0.9427934, y: 1.7638426} 232 | - {x: -1.0282055, y: 1.7154572} 233 | - {x: -1.1111405, y: 1.6629392} 234 | - {x: -1.1913986, y: 1.606415} 235 | - {x: -1.2687867, y: 1.5460209} 236 | - {x: -1.343118, y: 1.4819021} 237 | - {x: -1.4142137, y: 1.4142134} 238 | - {x: -1.4819024, y: 1.3431177} 239 | - {x: -1.5460211, y: 1.2687864} 240 | - {x: -1.6064153, y: 1.1913984} 241 | - {x: -1.6629394, y: 1.1111403} 242 | - {x: -1.7154574, y: 1.0282052} 243 | - {x: -1.7638427, y: 0.94279313} 244 | - {x: -1.8079787, y: 0.8551098} 245 | - {x: -1.8477592, y: 0.76536644} 246 | - {x: -1.8830884, y: 0.6737792} 247 | - {x: -1.9138808, y: 0.5805688} 248 | - {x: -1.9400626, y: 0.48595977} 249 | - {x: -1.9615707, y: 0.39018002} 250 | - {x: -1.9783531, y: 0.29346028} 251 | - {x: -1.9903696, y: 0.19603357} 252 | - {x: -1.9975909, y: 0.098134585} 253 | - {x: -2, y: -0.0000008026785} 254 | - {x: -1.9975909, y: -0.09813619} 255 | - {x: -1.9903693, y: -0.19603516} 256 | - {x: -1.9783529, y: -0.29346186} 257 | - {x: -1.9615704, y: -0.3901816} 258 | - {x: -1.9400623, y: -0.48596132} 259 | - {x: -1.9138803, y: -0.58057034} 260 | - {x: -1.8830878, y: -0.67378074} 261 | - {x: -1.8477587, y: -0.7653679} 262 | - {x: -1.8079782, y: -0.855111} 263 | - {x: -1.7638422, y: -0.9427941} 264 | - {x: -1.715457, y: -1.028206} 265 | - {x: -1.6629391, y: -1.1111407} 266 | - {x: -1.606415, y: -1.1913987} 267 | - {x: -1.546021, y: -1.2687865} 268 | - {x: -1.4819025, y: -1.3431177} 269 | - {x: -1.4142139, y: -1.4142132} 270 | - {x: -1.3431184, y: -1.4819018} 271 | - {x: -1.2687873, y: -1.5460204} 272 | - {x: -1.1913995, y: -1.6064144} 273 | - {x: -1.1111416, y: -1.6629385} 274 | - {x: -1.0282067, y: -1.7154565} 275 | - {x: -0.9427949, y: -1.7638417} 276 | - {x: -0.85511184, y: -1.8079778} 277 | - {x: -0.76536876, y: -1.8477583} 278 | - {x: -0.6737818, y: -1.8830874} 279 | - {x: -0.5805717, y: -1.91388} 280 | - {x: -0.48596293, y: -1.9400618} 281 | - {x: -0.39018345, y: -1.96157} 282 | - {x: -0.29346398, y: -1.9783525} 283 | - {x: -0.1960375, y: -1.9903691} 284 | - {x: -0.09813879, y: -1.9975908} 285 | - {x: -0.0000036398517, y: -2} 286 | - {x: 0.098131515, y: -1.9975911} 287 | - {x: 0.19603026, y: -1.9903698} 288 | - {x: 0.29345676, y: -1.9783536} 289 | - {x: 0.3901763, y: -1.9615715} 290 | - {x: 0.48595586, y: -1.9400636} 291 | - {x: 0.58056474, y: -1.913882} 292 | - {x: 0.67377496, y: -1.8830898} 293 | - {x: 0.765362, y: -1.847761} 294 | - {x: 0.8551053, y: -1.8079809} 295 | - {x: 0.94278854, y: -1.7638452} 296 | - {x: 1.0282005, y: -1.7154602} 297 | - {x: 1.1111355, y: -1.6629425} 298 | - {x: 1.1913936, y: -1.6064187} 299 | - {x: 1.2687817, y: -1.5460249} 300 | - {x: 1.3431131, y: -1.4819067} 301 | - {x: 1.4142088, y: -1.4142184} 302 | - {x: 1.4818976, y: -1.3431231} 303 | - {x: 1.5460167, y: -1.2687918} 304 | - {x: 1.6064112, y: -1.1914037} 305 | - {x: 1.6629357, y: -1.1111456} 306 | - {x: 1.7154542, y: -1.0282105} 307 | - {x: 1.7638398, y: -0.94279844} 308 | - {x: 1.8079762, y: -0.855115} 309 | - {x: 1.8477571, y: -0.76537156} 310 | - {x: 1.8830866, y: -0.6737842} 311 | - {x: 1.9138794, y: -0.5805737} 312 | - {x: 1.9400615, y: -0.48596448} 313 | - {x: 1.9615698, y: -0.39018452} 314 | - {x: 1.9783524, y: -0.29346457} 315 | - {x: 1.9903691, y: -0.19603767} 316 | - {x: 1.9975908, y: -0.09813846} 317 | - {x: 2, y: -0.0000028371733} 318 | - {x: 1.997591, y: 0.0981328} 319 | - {x: 1.9903697, y: 0.19603202} 320 | - {x: 1.9783533, y: 0.29345897} 321 | - {x: 1.9615709, y: 0.39017895} 322 | - {x: 1.9400629, y: 0.48595896} 323 | - {x: 1.9138811, y: 0.58056825} 324 | - {x: 1.8830885, y: 0.6737789} 325 | - {x: 1.8477592, y: 0.7653663} 326 | - {x: 1.8079787, y: 0.8551099} 327 | - {x: 1.7638426, y: 0.9427934} 328 | - {x: 1.7154571, y: 1.0282056} 329 | - {x: 1.662939, y: 1.1111408} 330 | - {x: 1.6064146, y: 1.1913992} 331 | - {x: 1.5460203, y: 1.2687874} 332 | - {x: 1.4819014, y: 1.3431189} 333 | - {x: 1.4142125, y: 1.4142147} 334 | - {x: 1.3431165, y: 1.4819036} 335 | - {x: 1.2687849, y: 1.5460223} 336 | - {x: 1.1913966, y: 1.6064166} 337 | - {x: 1.1111382, y: 1.6629407} 338 | - {x: 1.0282029, y: 1.7154588} 339 | - {x: 0.94279057, y: 1.7638441} 340 | - {x: 0.85510695, y: 1.8079801} 341 | - {x: 0.76536334, y: 1.8477606} 342 | - {x: 0.67377585, y: 1.8830895} 343 | - {x: 0.58056515, y: 1.9138819} 344 | - {x: 0.48595583, y: 1.9400636} 345 | - {x: 0.3901758, y: 1.9615716} 346 | - {x: 0.29345578, y: 1.9783537} 347 | - {x: 0.1960288, y: 1.99037} 348 | - {x: 0.09812956, y: 1.9975911} 349 | bones: [] 350 | spriteID: 5e97eb03825dee720800000000000000 351 | internalID: 0 352 | vertices: [] 353 | indices: 354 | edges: [] 355 | weights: [] 356 | secondaryTextures: [] 357 | spritePackingTag: 358 | pSDRemoveMatte: 0 359 | pSDShowRemoveMatteOption: 0 360 | userData: 361 | assetBundleName: 362 | assetBundleVariant: 363 | -------------------------------------------------------------------------------- /Resources/UI/ToggleField.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1410103977229262360 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 4721853841521377207} 12 | - component: {fileID: 4012296033325034568} 13 | - component: {fileID: 205355001356421858} 14 | m_Layer: 5 15 | m_Name: Image 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &4721853841521377207 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 1410103977229262360} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: [] 32 | m_Father: {fileID: 2120532207630833023} 33 | m_RootOrder: 0 34 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 35 | m_AnchorMin: {x: 0, y: 0} 36 | m_AnchorMax: {x: 1, y: 1} 37 | m_AnchoredPosition: {x: 0.0000076293945, y: -0.0000009536743} 38 | m_SizeDelta: {x: 0, y: 0} 39 | m_Pivot: {x: 0.5, y: 0.5} 40 | --- !u!222 &4012296033325034568 41 | CanvasRenderer: 42 | m_ObjectHideFlags: 0 43 | m_CorrespondingSourceObject: {fileID: 0} 44 | m_PrefabInstance: {fileID: 0} 45 | m_PrefabAsset: {fileID: 0} 46 | m_GameObject: {fileID: 1410103977229262360} 47 | m_CullTransparentMesh: 0 48 | --- !u!114 &205355001356421858 49 | MonoBehaviour: 50 | m_ObjectHideFlags: 0 51 | m_CorrespondingSourceObject: {fileID: 0} 52 | m_PrefabInstance: {fileID: 0} 53 | m_PrefabAsset: {fileID: 0} 54 | m_GameObject: {fileID: 1410103977229262360} 55 | m_Enabled: 1 56 | m_EditorHideFlags: 0 57 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 58 | m_Name: 59 | m_EditorClassIdentifier: 60 | m_Material: {fileID: 0} 61 | m_Color: {r: 1, g: 1, b: 1, a: 1} 62 | m_RaycastTarget: 1 63 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 64 | m_Maskable: 1 65 | m_OnCullStateChanged: 66 | m_PersistentCalls: 67 | m_Calls: [] 68 | m_Sprite: {fileID: 21300000, guid: 8923f79fdf3d5bd41955533befb4568a, type: 3} 69 | m_Type: 2 70 | m_PreserveAspect: 0 71 | m_FillCenter: 1 72 | m_FillMethod: 4 73 | m_FillAmount: 1 74 | m_FillClockwise: 1 75 | m_FillOrigin: 0 76 | m_UseSpriteMesh: 0 77 | m_PixelsPerUnitMultiplier: 1 78 | --- !u!1 &1671795252796475213 79 | GameObject: 80 | m_ObjectHideFlags: 0 81 | m_CorrespondingSourceObject: {fileID: 0} 82 | m_PrefabInstance: {fileID: 0} 83 | m_PrefabAsset: {fileID: 0} 84 | serializedVersion: 6 85 | m_Component: 86 | - component: {fileID: 3692166085279232403} 87 | - component: {fileID: 7733276592719380880} 88 | - component: {fileID: 276925802677267010} 89 | m_Layer: 5 90 | m_Name: Text (TMP) 91 | m_TagString: Untagged 92 | m_Icon: {fileID: 0} 93 | m_NavMeshLayer: 0 94 | m_StaticEditorFlags: 0 95 | m_IsActive: 1 96 | --- !u!224 &3692166085279232403 97 | RectTransform: 98 | m_ObjectHideFlags: 0 99 | m_CorrespondingSourceObject: {fileID: 0} 100 | m_PrefabInstance: {fileID: 0} 101 | m_PrefabAsset: {fileID: 0} 102 | m_GameObject: {fileID: 1671795252796475213} 103 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 104 | m_LocalPosition: {x: 0, y: 0, z: 0} 105 | m_LocalScale: {x: 1, y: 1, z: 1} 106 | m_Children: [] 107 | m_Father: {fileID: 4855879496927424586} 108 | m_RootOrder: 1 109 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 110 | m_AnchorMin: {x: 0, y: 0} 111 | m_AnchorMax: {x: 1, y: 1} 112 | m_AnchoredPosition: {x: 12.4999695, y: 0} 113 | m_SizeDelta: {x: -25.000061, y: 0} 114 | m_Pivot: {x: 0.5, y: 0.5} 115 | --- !u!222 &7733276592719380880 116 | CanvasRenderer: 117 | m_ObjectHideFlags: 0 118 | m_CorrespondingSourceObject: {fileID: 0} 119 | m_PrefabInstance: {fileID: 0} 120 | m_PrefabAsset: {fileID: 0} 121 | m_GameObject: {fileID: 1671795252796475213} 122 | m_CullTransparentMesh: 0 123 | --- !u!114 &276925802677267010 124 | MonoBehaviour: 125 | m_ObjectHideFlags: 0 126 | m_CorrespondingSourceObject: {fileID: 0} 127 | m_PrefabInstance: {fileID: 0} 128 | m_PrefabAsset: {fileID: 0} 129 | m_GameObject: {fileID: 1671795252796475213} 130 | m_Enabled: 1 131 | m_EditorHideFlags: 0 132 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 133 | m_Name: 134 | m_EditorClassIdentifier: 135 | m_Material: {fileID: 0} 136 | m_Color: {r: 1, g: 1, b: 1, a: 1} 137 | m_RaycastTarget: 1 138 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 139 | m_Maskable: 1 140 | m_OnCullStateChanged: 141 | m_PersistentCalls: 142 | m_Calls: [] 143 | m_text: Always update 144 | m_isRightToLeft: 0 145 | m_fontAsset: {fileID: 11400000, guid: 1922ad64e9e9dbe4f881091755ffe671, type: 2} 146 | m_sharedMaterial: {fileID: -3923861552156722563, guid: 1922ad64e9e9dbe4f881091755ffe671, 147 | type: 2} 148 | m_fontSharedMaterials: [] 149 | m_fontMaterial: {fileID: 0} 150 | m_fontMaterials: [] 151 | m_fontColor32: 152 | serializedVersion: 2 153 | rgba: 4290035129 154 | m_fontColor: {r: 0.7254902, g: 0.7411765, b: 0.7058824, a: 1} 155 | m_enableVertexGradient: 0 156 | m_colorMode: 3 157 | m_fontColorGradient: 158 | topLeft: {r: 1, g: 1, b: 1, a: 1} 159 | topRight: {r: 1, g: 1, b: 1, a: 1} 160 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 161 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 162 | m_fontColorGradientPreset: {fileID: 0} 163 | m_spriteAsset: {fileID: 0} 164 | m_tintAllSprites: 0 165 | m_StyleSheet: {fileID: 0} 166 | m_TextStyleHashCode: -1183493901 167 | m_overrideHtmlColors: 0 168 | m_faceColor: 169 | serializedVersion: 2 170 | rgba: 4294967295 171 | m_fontSize: 12 172 | m_fontSizeBase: 12 173 | m_fontWeight: 400 174 | m_enableAutoSizing: 0 175 | m_fontSizeMin: 18 176 | m_fontSizeMax: 72 177 | m_fontStyle: 0 178 | m_HorizontalAlignment: 1 179 | m_VerticalAlignment: 512 180 | m_textAlignment: 65535 181 | m_characterSpacing: 0 182 | m_wordSpacing: 0 183 | m_lineSpacing: 0 184 | m_lineSpacingMax: 0 185 | m_paragraphSpacing: 0 186 | m_charWidthMaxAdj: 0 187 | m_enableWordWrapping: 1 188 | m_wordWrappingRatios: 0.4 189 | m_overflowMode: 0 190 | m_linkedTextComponent: {fileID: 0} 191 | parentLinkedComponent: {fileID: 0} 192 | m_enableKerning: 1 193 | m_enableExtraPadding: 0 194 | checkPaddingRequired: 0 195 | m_isRichText: 1 196 | m_parseCtrlCharacters: 1 197 | m_isOrthographic: 1 198 | m_isCullingEnabled: 0 199 | m_horizontalMapping: 0 200 | m_verticalMapping: 0 201 | m_uvLineOffset: 0 202 | m_geometrySortingOrder: 0 203 | m_IsTextObjectScaleStatic: 0 204 | m_VertexBufferAutoSizeReduction: 1 205 | m_useMaxVisibleDescender: 1 206 | m_pageToDisplay: 1 207 | m_margin: {x: 0, y: 0, z: 0, w: 0} 208 | m_isUsingLegacyAnimationComponent: 0 209 | m_isVolumetricText: 0 210 | m_hasFontAssetChanged: 0 211 | m_baseMaterial: {fileID: 0} 212 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 213 | --- !u!1 &1893708749569248859 214 | GameObject: 215 | m_ObjectHideFlags: 0 216 | m_CorrespondingSourceObject: {fileID: 0} 217 | m_PrefabInstance: {fileID: 0} 218 | m_PrefabAsset: {fileID: 0} 219 | serializedVersion: 6 220 | m_Component: 221 | - component: {fileID: 4855879496927424586} 222 | - component: {fileID: 1810193312496466138} 223 | m_Layer: 5 224 | m_Name: ToggleField 225 | m_TagString: Untagged 226 | m_Icon: {fileID: 0} 227 | m_NavMeshLayer: 0 228 | m_StaticEditorFlags: 0 229 | m_IsActive: 1 230 | --- !u!224 &4855879496927424586 231 | RectTransform: 232 | m_ObjectHideFlags: 0 233 | m_CorrespondingSourceObject: {fileID: 0} 234 | m_PrefabInstance: {fileID: 0} 235 | m_PrefabAsset: {fileID: 0} 236 | m_GameObject: {fileID: 1893708749569248859} 237 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 238 | m_LocalPosition: {x: 0, y: 0, z: 0} 239 | m_LocalScale: {x: 1, y: 1, z: 1} 240 | m_Children: 241 | - {fileID: 2120532207630833023} 242 | - {fileID: 3692166085279232403} 243 | m_Father: {fileID: 0} 244 | m_RootOrder: 0 245 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 246 | m_AnchorMin: {x: 0, y: 0} 247 | m_AnchorMax: {x: 0, y: 0} 248 | m_AnchoredPosition: {x: 0, y: 0} 249 | m_SizeDelta: {x: 0, y: 0} 250 | m_Pivot: {x: 0.5, y: 0.5} 251 | --- !u!114 &1810193312496466138 252 | MonoBehaviour: 253 | m_ObjectHideFlags: 0 254 | m_CorrespondingSourceObject: {fileID: 0} 255 | m_PrefabInstance: {fileID: 0} 256 | m_PrefabAsset: {fileID: 0} 257 | m_GameObject: {fileID: 1893708749569248859} 258 | m_Enabled: 1 259 | m_EditorHideFlags: 0 260 | m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} 261 | m_Name: 262 | m_EditorClassIdentifier: 263 | m_Navigation: 264 | m_Mode: 3 265 | m_SelectOnUp: {fileID: 0} 266 | m_SelectOnDown: {fileID: 0} 267 | m_SelectOnLeft: {fileID: 0} 268 | m_SelectOnRight: {fileID: 0} 269 | m_Transition: 1 270 | m_Colors: 271 | m_NormalColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 272 | m_HighlightedColor: {r: 1, g: 0.627451, b: 0.654902, a: 1} 273 | m_PressedColor: {r: 0.86666673, g: 0.20000002, b: 0.2509804, a: 1} 274 | m_SelectedColor: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 275 | m_DisabledColor: {r: 0.48235297, g: 0.22352943, b: 0.24313727, a: 1} 276 | m_ColorMultiplier: 1 277 | m_FadeDuration: 0.1 278 | m_SpriteState: 279 | m_HighlightedSprite: {fileID: 0} 280 | m_PressedSprite: {fileID: 0} 281 | m_SelectedSprite: {fileID: 0} 282 | m_DisabledSprite: {fileID: 0} 283 | m_AnimationTriggers: 284 | m_NormalTrigger: Normal 285 | m_HighlightedTrigger: Highlighted 286 | m_PressedTrigger: Pressed 287 | m_SelectedTrigger: Selected 288 | m_DisabledTrigger: Disabled 289 | m_Interactable: 1 290 | m_TargetGraphic: {fileID: 205355001356421858} 291 | toggleTransition: 1 292 | graphic: {fileID: 7316496871120764731} 293 | m_Group: {fileID: 0} 294 | onValueChanged: 295 | m_PersistentCalls: 296 | m_Calls: [] 297 | m_IsOn: 1 298 | --- !u!1 &2373136476622836524 299 | GameObject: 300 | m_ObjectHideFlags: 0 301 | m_CorrespondingSourceObject: {fileID: 0} 302 | m_PrefabInstance: {fileID: 0} 303 | m_PrefabAsset: {fileID: 0} 304 | serializedVersion: 6 305 | m_Component: 306 | - component: {fileID: 2120532207630833023} 307 | - component: {fileID: 7586613332040736281} 308 | - component: {fileID: 5424051288070968284} 309 | m_Layer: 5 310 | m_Name: Background 311 | m_TagString: Untagged 312 | m_Icon: {fileID: 0} 313 | m_NavMeshLayer: 0 314 | m_StaticEditorFlags: 0 315 | m_IsActive: 1 316 | --- !u!224 &2120532207630833023 317 | RectTransform: 318 | m_ObjectHideFlags: 0 319 | m_CorrespondingSourceObject: {fileID: 0} 320 | m_PrefabInstance: {fileID: 0} 321 | m_PrefabAsset: {fileID: 0} 322 | m_GameObject: {fileID: 2373136476622836524} 323 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 324 | m_LocalPosition: {x: 0, y: 0, z: 0} 325 | m_LocalScale: {x: 1, y: 1, z: 1} 326 | m_Children: 327 | - {fileID: 4721853841521377207} 328 | - {fileID: 5174615078549780711} 329 | m_Father: {fileID: 4855879496927424586} 330 | m_RootOrder: 0 331 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 332 | m_AnchorMin: {x: 0, y: 0.5} 333 | m_AnchorMax: {x: 0, y: 0.5} 334 | m_AnchoredPosition: {x: -0.000030517578, y: 0} 335 | m_SizeDelta: {x: 20, y: 20} 336 | m_Pivot: {x: 0, y: 0.5} 337 | --- !u!222 &7586613332040736281 338 | CanvasRenderer: 339 | m_ObjectHideFlags: 0 340 | m_CorrespondingSourceObject: {fileID: 0} 341 | m_PrefabInstance: {fileID: 0} 342 | m_PrefabAsset: {fileID: 0} 343 | m_GameObject: {fileID: 2373136476622836524} 344 | m_CullTransparentMesh: 0 345 | --- !u!114 &5424051288070968284 346 | MonoBehaviour: 347 | m_ObjectHideFlags: 0 348 | m_CorrespondingSourceObject: {fileID: 0} 349 | m_PrefabInstance: {fileID: 0} 350 | m_PrefabAsset: {fileID: 0} 351 | m_GameObject: {fileID: 2373136476622836524} 352 | m_Enabled: 1 353 | m_EditorHideFlags: 0 354 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 355 | m_Name: 356 | m_EditorClassIdentifier: 357 | m_Material: {fileID: 0} 358 | m_Color: {r: 0.23529413, g: 0.2392157, b: 0.2509804, a: 1} 359 | m_RaycastTarget: 1 360 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 361 | m_Maskable: 1 362 | m_OnCullStateChanged: 363 | m_PersistentCalls: 364 | m_Calls: [] 365 | m_Sprite: {fileID: 0} 366 | m_Type: 1 367 | m_PreserveAspect: 0 368 | m_FillCenter: 1 369 | m_FillMethod: 4 370 | m_FillAmount: 1 371 | m_FillClockwise: 1 372 | m_FillOrigin: 0 373 | m_UseSpriteMesh: 0 374 | m_PixelsPerUnitMultiplier: 1 375 | --- !u!1 &5111519611858674781 376 | GameObject: 377 | m_ObjectHideFlags: 0 378 | m_CorrespondingSourceObject: {fileID: 0} 379 | m_PrefabInstance: {fileID: 0} 380 | m_PrefabAsset: {fileID: 0} 381 | serializedVersion: 6 382 | m_Component: 383 | - component: {fileID: 5174615078549780711} 384 | - component: {fileID: 2691928939489891311} 385 | - component: {fileID: 7316496871120764731} 386 | m_Layer: 5 387 | m_Name: Checkmark 388 | m_TagString: Untagged 389 | m_Icon: {fileID: 0} 390 | m_NavMeshLayer: 0 391 | m_StaticEditorFlags: 0 392 | m_IsActive: 1 393 | --- !u!224 &5174615078549780711 394 | RectTransform: 395 | m_ObjectHideFlags: 0 396 | m_CorrespondingSourceObject: {fileID: 0} 397 | m_PrefabInstance: {fileID: 0} 398 | m_PrefabAsset: {fileID: 0} 399 | m_GameObject: {fileID: 5111519611858674781} 400 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 401 | m_LocalPosition: {x: 0, y: 0, z: 0} 402 | m_LocalScale: {x: 1, y: 1, z: 1} 403 | m_Children: [] 404 | m_Father: {fileID: 2120532207630833023} 405 | m_RootOrder: 1 406 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 407 | m_AnchorMin: {x: 0, y: 0} 408 | m_AnchorMax: {x: 1, y: 1} 409 | m_AnchoredPosition: {x: 0, y: 0} 410 | m_SizeDelta: {x: -8, y: -8} 411 | m_Pivot: {x: 0.5, y: 0.5} 412 | --- !u!222 &2691928939489891311 413 | CanvasRenderer: 414 | m_ObjectHideFlags: 0 415 | m_CorrespondingSourceObject: {fileID: 0} 416 | m_PrefabInstance: {fileID: 0} 417 | m_PrefabAsset: {fileID: 0} 418 | m_GameObject: {fileID: 5111519611858674781} 419 | m_CullTransparentMesh: 0 420 | --- !u!114 &7316496871120764731 421 | MonoBehaviour: 422 | m_ObjectHideFlags: 0 423 | m_CorrespondingSourceObject: {fileID: 0} 424 | m_PrefabInstance: {fileID: 0} 425 | m_PrefabAsset: {fileID: 0} 426 | m_GameObject: {fileID: 5111519611858674781} 427 | m_Enabled: 1 428 | m_EditorHideFlags: 0 429 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 430 | m_Name: 431 | m_EditorClassIdentifier: 432 | m_Material: {fileID: 0} 433 | m_Color: {r: 0.9490197, g: 0.23529413, b: 0.2901961, a: 1} 434 | m_RaycastTarget: 1 435 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 436 | m_Maskable: 1 437 | m_OnCullStateChanged: 438 | m_PersistentCalls: 439 | m_Calls: [] 440 | m_Sprite: {fileID: 0} 441 | m_Type: 1 442 | m_PreserveAspect: 0 443 | m_FillCenter: 1 444 | m_FillMethod: 4 445 | m_FillAmount: 1 446 | m_FillClockwise: 1 447 | m_FillOrigin: 0 448 | m_UseSpriteMesh: 0 449 | m_PixelsPerUnitMultiplier: 1 450 | --------------------------------------------------------------------------------