modify scripts
This commit is contained in:
8
Assets/ExternalDependencyManager.meta
Normal file
8
Assets/ExternalDependencyManager.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b90734360169d4f6e9a0d45c7e68b868
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/ExternalDependencyManager/Editor.meta
Normal file
8
Assets/ExternalDependencyManager/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 00ae6535975cc4831b66a2a9668ff033
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/ExternalDependencyManager/Editor/1.2.186.meta
Normal file
8
Assets/ExternalDependencyManager/Editor/1.2.186.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bf62de139853544faadf65eb92d0d55d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: baf24db2bf904e729e7796721c09e8ad
|
||||||
|
labels:
|
||||||
|
- gvh
|
||||||
|
- gvh_version-1.2.186
|
||||||
|
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.186/Google.IOSResolver.pdb
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d13c8602d5e14e43b0e92459754c4315
|
||||||
|
labels:
|
||||||
|
- gvh
|
||||||
|
- gvh_version-1.2.186
|
||||||
|
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.186/Google.JarResolver.pdb
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a695eb9f64fe49569a2db0c4246c877d
|
||||||
|
labels:
|
||||||
|
- gvh
|
||||||
|
- gvh_version-1.2.186
|
||||||
|
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.186/Google.PackageManagerResolver.pdb
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9f56badf3ca84753b00163c3b632d4e5
|
||||||
|
labels:
|
||||||
|
- gvh
|
||||||
|
- gvh_version-1.2.186
|
||||||
|
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.186/Google.VersionHandlerImpl.pdb
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 57f5a82a79ab4b098f09326c8f3c73a6
|
||||||
|
labels:
|
||||||
|
- gvh
|
||||||
|
- gvh_version-1.2.186
|
||||||
|
- gvh_version-10.4.2
|
||||||
|
- gvhp_exportpath-ExternalDependencyManager/Editor/Google.VersionHandler.pdb
|
||||||
|
timeCreated: 1538009133
|
||||||
|
licenseType: Store
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/WordConnectGameToolkit/Editor.meta
Normal file
8
Assets/WordConnectGameToolkit/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 333c08c9aed6c4f9cb7b1d08c7b23dd2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,106 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace WordsToolkit.Editor
|
||||||
|
{
|
||||||
|
[InitializeOnLoad]
|
||||||
|
public static class SentisToInferenceEngineMigrator
|
||||||
|
{
|
||||||
|
private const string MIGRATION_KEY = "SentisToInferenceEngineMigrated";
|
||||||
|
|
||||||
|
static SentisToInferenceEngineMigrator()
|
||||||
|
{
|
||||||
|
if (!SessionState.GetBool(MIGRATION_KEY, false))
|
||||||
|
{
|
||||||
|
EditorApplication.delayCall += PerformMigration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PerformMigration()
|
||||||
|
{
|
||||||
|
bool migrationPerformed = false;
|
||||||
|
|
||||||
|
// Force remove any Sentis references from PackageCache
|
||||||
|
string packageCachePath = Path.Combine(Application.dataPath, "..", "Library", "PackageCache");
|
||||||
|
if (Directory.Exists(packageCachePath))
|
||||||
|
{
|
||||||
|
var sentisDirectories = Directory.GetDirectories(packageCachePath, "com.unity.sentis*");
|
||||||
|
foreach (var dir in sentisDirectories)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(dir, true);
|
||||||
|
Debug.Log($"Removed Sentis package cache: {dir}");
|
||||||
|
migrationPerformed = true;
|
||||||
|
}
|
||||||
|
catch (System.Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Could not remove Sentis cache directory {dir}: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up any remaining Sentis meta files
|
||||||
|
CleanupMetaFiles();
|
||||||
|
|
||||||
|
if (migrationPerformed)
|
||||||
|
{
|
||||||
|
Debug.Log("Sentis to Inference Engine migration completed automatically. Restarting Unity...");
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
|
||||||
|
// Restart Unity to ensure clean state
|
||||||
|
EditorApplication.delayCall += () => {
|
||||||
|
EditorApplication.OpenProject(System.IO.Path.GetDirectoryName(Application.dataPath));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionState.SetBool(MIGRATION_KEY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ForceMigrationAndRestart()
|
||||||
|
{
|
||||||
|
SessionState.SetBool(MIGRATION_KEY, false);
|
||||||
|
PerformMigration();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RestartUnity()
|
||||||
|
{
|
||||||
|
Debug.Log("Restarting Unity...");
|
||||||
|
EditorApplication.OpenProject(System.IO.Path.GetDirectoryName(Application.dataPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CleanupMetaFiles()
|
||||||
|
{
|
||||||
|
string[] searchPaths = {
|
||||||
|
Path.Combine(Application.dataPath, "Scripts"),
|
||||||
|
Path.Combine(Application.dataPath, "WordConnectGameToolkit")
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (string searchPath in searchPaths)
|
||||||
|
{
|
||||||
|
if (Directory.Exists(searchPath))
|
||||||
|
{
|
||||||
|
var metaFiles = Directory.GetFiles(searchPath, "*.meta", SearchOption.AllDirectories);
|
||||||
|
foreach (var metaFile in metaFiles)
|
||||||
|
{
|
||||||
|
string content = File.ReadAllText(metaFile);
|
||||||
|
if (content.Contains("com.unity.sentis"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
content = content.Replace("com.unity.sentis", "com.unity.ai.inference");
|
||||||
|
File.WriteAllText(metaFile, content);
|
||||||
|
Debug.Log($"Updated meta file: {metaFile}");
|
||||||
|
}
|
||||||
|
catch (System.Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Could not update meta file {metaFile}: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b732c2cfd0cf0433a85b0cd7e48d100c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
BIN
Assets/WordConnectGameToolkit/Font/BalooBhai-Regular.ttf
Normal file
BIN
Assets/WordConnectGameToolkit/Font/BalooBhai-Regular.ttf
Normal file
Binary file not shown.
@ -0,0 +1,21 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 06fea1744dabf414c8bdadfe687197d6
|
||||||
|
TrueTypeFontImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 4
|
||||||
|
fontSize: 16
|
||||||
|
forceTextureCase: -2
|
||||||
|
characterSpacing: 0
|
||||||
|
characterPadding: 1
|
||||||
|
includeFontData: 1
|
||||||
|
fontNames:
|
||||||
|
- Baloo Bhai
|
||||||
|
fallbackFontReferences: []
|
||||||
|
customCharacters:
|
||||||
|
fontRenderingMode: 0
|
||||||
|
ascentCalculationMode: 1
|
||||||
|
useLegacyBoundsCalculation: 0
|
||||||
|
shouldRoundAdvanceValue: 1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -6882,6 +6882,7 @@ MonoBehaviour:
|
|||||||
m_GlyphPairAdjustmentRecords: []
|
m_GlyphPairAdjustmentRecords: []
|
||||||
fallbackFontAssets: []
|
fallbackFontAssets: []
|
||||||
m_FallbackFontAssetTable:
|
m_FallbackFontAssetTable:
|
||||||
|
- {fileID: 11400000, guid: cdb8507d60e4b4e5fadb9b1825d39fb0, type: 2}
|
||||||
- {fileID: 11400000, guid: 0dfe64dccfb1419084fb31e94bf08869, type: 2}
|
- {fileID: 11400000, guid: 0dfe64dccfb1419084fb31e94bf08869, type: 2}
|
||||||
- {fileID: 11400000, guid: f18c6f2f696cf48b2a4e92b7f29b7fc3, type: 2}
|
- {fileID: 11400000, guid: f18c6f2f696cf48b2a4e92b7f29b7fc3, type: 2}
|
||||||
m_CreationSettings:
|
m_CreationSettings:
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
2363
Assets/WordConnectGameToolkit/Font/turkish_font.asset
Normal file
2363
Assets/WordConnectGameToolkit/Font/turkish_font.asset
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cdb8507d60e4b4e5fadb9b1825d39fb0
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -88,6 +88,7 @@ GameObject:
|
|||||||
- component: {fileID: 4245167539472542765}
|
- component: {fileID: 4245167539472542765}
|
||||||
- component: {fileID: 4013824183019657187}
|
- component: {fileID: 4013824183019657187}
|
||||||
- component: {fileID: 8023491363183538939}
|
- component: {fileID: 8023491363183538939}
|
||||||
|
- component: {fileID: 1068866132162880213}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Coins
|
m_Name: Coins
|
||||||
m_TagString: Coins
|
m_TagString: Coins
|
||||||
@ -202,6 +203,7 @@ MonoBehaviour:
|
|||||||
onClick:
|
onClick:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
|
noSound: 0
|
||||||
--- !u!114 &8023491363183538939
|
--- !u!114 &8023491363183538939
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -219,6 +221,21 @@ MonoBehaviour:
|
|||||||
associatedResource: {fileID: 11400000, guid: 05af233fe9cfa409abb37d57d2cceaea, type: 2}
|
associatedResource: {fileID: 11400000, guid: 05af233fe9cfa409abb37d57d2cceaea, type: 2}
|
||||||
fxPrefab: {fileID: 7046139580850344571, guid: 3372b6fd62f2b4e058c6757fe9d4afd3, type: 3}
|
fxPrefab: {fileID: 7046139580850344571, guid: 3372b6fd62f2b4e058c6757fe9d4afd3, type: 3}
|
||||||
coinsTextPrefab: {fileID: 6331716406342226620, guid: 4dedea56b3321416b95d34dc8b7efba5, type: 3}
|
coinsTextPrefab: {fileID: 6331716406342226620, guid: 4dedea56b3321416b95d34dc8b7efba5, type: 3}
|
||||||
|
OnAnimationComplete:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
--- !u!114 &1068866132162880213
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1287760599166922580}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c9c6b14262f434e07ad593f7b28fbfba, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
--- !u!1 &4301976480888807572
|
--- !u!1 &4301976480888807572
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@ -222,6 +222,7 @@ GameObject:
|
|||||||
- component: {fileID: 4094651174836377014}
|
- component: {fileID: 4094651174836377014}
|
||||||
- component: {fileID: 5140382344608309896}
|
- component: {fileID: 5140382344608309896}
|
||||||
- component: {fileID: 3974817099587506368}
|
- component: {fileID: 3974817099587506368}
|
||||||
|
- component: {fileID: 7945160288457162381}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Gems
|
m_Name: Gems
|
||||||
m_TagString: Gems
|
m_TagString: Gems
|
||||||
@ -336,6 +337,7 @@ MonoBehaviour:
|
|||||||
onClick:
|
onClick:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
|
noSound: 0
|
||||||
--- !u!114 &3974817099587506368
|
--- !u!114 &3974817099587506368
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -356,6 +358,18 @@ MonoBehaviour:
|
|||||||
OnAnimationComplete:
|
OnAnimationComplete:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
|
--- !u!114 &7945160288457162381
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 8282061143723735201}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c9c6b14262f434e07ad593f7b28fbfba, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
--- !u!1 &8288800362416271104
|
--- !u!1 &8288800362416271104
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@ -0,0 +1,14 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 229059528153459db318609c350eea5f, type: 3}
|
||||||
|
m_Name: IronsourceBannerHandler
|
||||||
|
m_EditorClassIdentifier:
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 796df1b72912f46b09a0545be43c896e
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -15,3 +15,6 @@ MonoBehaviour:
|
|||||||
bannedWordsByLanguage:
|
bannedWordsByLanguage:
|
||||||
- languageCode: en
|
- languageCode: en
|
||||||
bannedWords: []
|
bannedWords: []
|
||||||
|
- languageCode: tr
|
||||||
|
bannedWords:
|
||||||
|
- "\xFCre"
|
||||||
|
|||||||
@ -36,5 +36,10 @@ MonoBehaviour:
|
|||||||
- language: fr
|
- language: fr
|
||||||
title:
|
title:
|
||||||
text:
|
text:
|
||||||
|
- language: tr
|
||||||
|
title: "\u015Eelaleler"
|
||||||
|
text: "D\xFCnyan\u0131n en y\xFCksek \u015Felalesi Venezuela'daki Angel \u015Eelalesi
|
||||||
|
Dir. Su 979 metre y\xFCkseklikten d\xFC\u015Fer ve ak\u0131nt\u0131n\u0131n
|
||||||
|
bir k\u0131sm\u0131 yere ula\u015Fmadan buharla\u015F\u0131r!"
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
targetExtraWords: 8
|
targetExtraWords: 8
|
||||||
|
|||||||
@ -77,9 +77,10 @@ MonoBehaviour:
|
|||||||
rows: 7
|
rows: 7
|
||||||
placements: []
|
placements: []
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid:
|
serializedGrid: ' | | | | |
|
||||||
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
|
|||||||
@ -84,9 +84,10 @@ MonoBehaviour:
|
|||||||
rows: 7
|
rows: 7
|
||||||
placements: []
|
placements: []
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid:
|
serializedGrid: ' | | | | |
|
||||||
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
|
|||||||
@ -98,9 +98,10 @@ MonoBehaviour:
|
|||||||
rows: 7
|
rows: 7
|
||||||
placements: []
|
placements: []
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid:
|
serializedGrid: ' | | | | |
|
||||||
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
|
|||||||
@ -120,6 +120,18 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 9, y: 6}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters:
|
||||||
|
wordsAmount: 5
|
||||||
|
words: []
|
||||||
|
crosswordData:
|
||||||
|
columns: 0
|
||||||
|
rows: 0
|
||||||
|
placements: []
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 0, y: 0}
|
||||||
|
maxBounds: {x: 0, y: 0}
|
||||||
|
serializedGrid:
|
||||||
colorsTile: {fileID: 11400000, guid: 530ee400bda75ad44bcc4067e5f57ab8, type: 2}
|
colorsTile: {fileID: 11400000, guid: 530ee400bda75ad44bcc4067e5f57ab8, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 7
|
letters: 7
|
||||||
|
|||||||
@ -70,9 +70,10 @@ MonoBehaviour:
|
|||||||
rows: 7
|
rows: 7
|
||||||
placements: []
|
placements: []
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid:
|
serializedGrid: ' | | | | |
|
||||||
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
|
|||||||
@ -94,37 +94,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: citar
|
letters: citar
|
||||||
wordsAmount: 4
|
wordsAmount: 4
|
||||||
words:
|
words: []
|
||||||
- citar
|
|
||||||
- ira
|
|
||||||
- cat
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: citar
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: ira
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 4, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: cat
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 3, y: 5}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 3, y: 3}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 5}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | | | citar | r |
|
serializedGrid: ' | | | | |
|
||||||
cat | '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -137,9 +116,36 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 9, y: 6}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: ask
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- ask
|
||||||
|
- sak
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: ask
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 3, y: 1}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: sAK
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 4, y: 1}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 3, y: 1}
|
||||||
|
maxBounds: {x: 5, y: 3}
|
||||||
|
serializedGrid: ' | ask | A | K | |
|
||||||
|
| '
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 3
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -100,51 +100,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: cabra
|
letters: cabra
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- cabra
|
|
||||||
- cara
|
|
||||||
- bar
|
|
||||||
- barca
|
|
||||||
- arca
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: cabra
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 3, y: 0}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: cara
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 0}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: bar
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 1, y: 2}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: barca
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 1, y: 2}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: arca
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 1, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' cabra | a | bar | a arca | r | c
|
serializedGrid: ' | | | | |
|
||||||
| a '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -157,9 +122,43 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: suz
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- suz
|
||||||
|
- us
|
||||||
|
- uz
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: suz
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 3, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: uS
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 4, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: Uz
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 5, y: 1}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 3, y: 1}
|
||||||
|
maxBounds: {x: 5, y: 3}
|
||||||
|
serializedGrid: ' | U | suz | S | |
|
||||||
|
| '
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 3
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -101,50 +101,15 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: saldo
|
letters: saldo
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- sol
|
|
||||||
- sal
|
|
||||||
- ola
|
|
||||||
- oda
|
|
||||||
- osa
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: sol
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 5, y: 1}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: sal
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 5, y: 1}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: ola
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 4, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: oda
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 4, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: osa
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 2, y: 5}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 2, y: 1}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 5}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | sol | a | ola | d | osa
|
serializedGrid: ' | | | | |
|
||||||
| '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
@ -158,6 +123,40 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: "k\xFCre"
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- "k\xFCre"
|
||||||
|
- "k\xFCr"
|
||||||
|
- ek
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: ek
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 4, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "k\xFCre"
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 3, y: 4}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "k\xFCr"
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 3, y: 2}
|
||||||
|
maxBounds: {x: 6, y: 4}
|
||||||
|
serializedGrid: " | | ek | \xFC | k\xFCre
|
||||||
|
| | "
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 4
|
letters: 4
|
||||||
|
|||||||
@ -114,51 +114,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: radio
|
letters: radio
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- ira
|
|
||||||
- ida
|
|
||||||
- aro
|
|
||||||
- oda
|
|
||||||
- dar
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: ira
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 4, y: 1}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: ida
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 4, y: 1}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: aro
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 4, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: oda
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 6, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: dar
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 6, y: 4}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 4, y: 1}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 8, y: 5}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | ira | d | aro | dar |
|
serializedGrid: ' | | | | |
|
||||||
a | '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -171,9 +136,43 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: geri
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- geri
|
||||||
|
- gir
|
||||||
|
- eri
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: geri
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 3, y: 3}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: gir
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 3, y: 5}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: eri
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 4, y: 3}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 3, y: 3}
|
||||||
|
maxBounds: {x: 6, y: 5}
|
||||||
|
serializedGrid: ' | | | geri | r |
|
||||||
|
gir | '
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -109,44 +109,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: motor
|
letters: motor
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- specialitem
|
|
||||||
- motor
|
|
||||||
- moro
|
|
||||||
- toro
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: Motor
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: Moro
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: toro
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 0, y: 4}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: SpecialItem
|
|
||||||
wordNumber: -1
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 1
|
|
||||||
specialItemPath: Assets/WordConnectGameToolkit/Sprites/game_ui/in-game-item-1.png
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 3}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | | | Motor |toro |
|
serializedGrid: ' | | | | |
|
||||||
r | o '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -159,9 +131,50 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: "ko\u015Fa"
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- ok
|
||||||
|
- "ko\u015Fa"
|
||||||
|
- ak
|
||||||
|
- "ka\u015F"
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: Ok
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 4, y: 1}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "ko\u015Fa"
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 3, y: 3}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: ak
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 3, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "ka\u015F"
|
||||||
|
wordNumber: 4
|
||||||
|
startPosition: {x: 5, y: 1}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 3, y: 1}
|
||||||
|
maxBounds: {x: 6, y: 3}
|
||||||
|
serializedGrid: " | Ok | a a | ko\u015Fa |
|
||||||
|
| | "
|
||||||
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
colorsTile: {fileID: 11400000, guid: 63f1377c90d84ec478676a869dc2a2c1, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -115,51 +115,15 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: salir
|
letters: salir
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- sal
|
|
||||||
- liar
|
|
||||||
- ira
|
|
||||||
- risa
|
|
||||||
- asir
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: sal
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 1, y: 0}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: liar
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 0}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: ira
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 3, y: 1}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: risa
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: asir
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 6, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 1, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 6, y: 6}
|
maxBounds: {x: 9, y: 6}
|
||||||
serializedGrid: ' sal | ira | a | risa | s |
|
serializedGrid:
|
||||||
i | r '
|
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -172,9 +136,50 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: "\xE7al\u0131"
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- al
|
||||||
|
- "a\xE7"
|
||||||
|
- "a\xE7\u0131"
|
||||||
|
- "\xE7al\u0131"
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: al
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "\xE7al\u0131"
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 2, y: 4}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "a\xE7"
|
||||||
|
wordNumber: 4
|
||||||
|
startPosition: {x: 2, y: 3}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "a\xE7\u0131"
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 2, y: 2}
|
||||||
|
maxBounds: {x: 6, y: 4}
|
||||||
|
serializedGrid: " | | al | a \xE7 | \xE7al\u0131
|
||||||
|
| | "
|
||||||
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 4
|
max: 4
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -121,51 +121,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: torpe
|
letters: torpe
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- porte
|
|
||||||
- tope
|
|
||||||
- torpe
|
|
||||||
- reto
|
|
||||||
- peor
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: porte
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 1, y: 0}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: tope
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 4, y: 0}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: torpe
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 6, y: 2}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: reto
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: peor
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 6, y: 5}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 1, y: 0}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 9, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' porte | o | p t | reto | r |
|
serializedGrid: ' | | | | |
|
||||||
peor| e '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -178,6 +143,18 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters:
|
||||||
|
wordsAmount: 5
|
||||||
|
words: []
|
||||||
|
crosswordData:
|
||||||
|
columns: 0
|
||||||
|
rows: 0
|
||||||
|
placements: []
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 0, y: 0}
|
||||||
|
maxBounds: {x: 0, y: 0}
|
||||||
|
serializedGrid:
|
||||||
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 5
|
||||||
|
|||||||
@ -107,50 +107,15 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: coste
|
letters: coste
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- set
|
|
||||||
- tos
|
|
||||||
- seco
|
|
||||||
- eco
|
|
||||||
- seto
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: set
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 1, y: 1}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: tos
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 1}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: seco
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: eco
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 4, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: seto
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 1, y: 5}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 1, y: 1}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 6, y: 5}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | set | o | seco | c | seto
|
serializedGrid: ' | | | | |
|
||||||
| '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
@ -164,9 +129,50 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: arka
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- arka
|
||||||
|
- ara
|
||||||
|
- ark
|
||||||
|
- kar
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: arka
|
||||||
|
wordNumber: 4
|
||||||
|
startPosition: {x: 4, y: 1}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: kar
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 2, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: ark
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 4, y: 3}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: ara
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 4, y: 1}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 2, y: 1}
|
||||||
|
maxBounds: {x: 7, y: 3}
|
||||||
|
serializedGrid: ' | arka | kar | ark | |
|
||||||
|
| '
|
||||||
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -107,50 +107,15 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: abuso
|
letters: abuso
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- bus
|
|
||||||
- boa
|
|
||||||
- uso
|
|
||||||
- osa
|
|
||||||
- abuso
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: bus
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 3, y: 1}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: boa
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 1}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: uso
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 1, y: 2}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: osa
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 6, y: 2}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: abuso
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 1, y: 1}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 4}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | bus | uso o | abuso | a |
|
serializedGrid: ' | | | | |
|
||||||
| '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
@ -164,9 +129,51 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: faiz
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- faiz
|
||||||
|
- faz
|
||||||
|
- iz
|
||||||
|
- az
|
||||||
|
- af
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: af
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 4, y: 1}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: az
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: faiz
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 2, y: 3}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: faz
|
||||||
|
wordNumber: 4
|
||||||
|
startPosition: {x: 5, y: 1}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 2, y: 1}
|
||||||
|
maxBounds: {x: 6, y: 3}
|
||||||
|
serializedGrid: ' | af | az | faiz | |
|
||||||
|
| '
|
||||||
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -110,51 +110,16 @@ MonoBehaviour:
|
|||||||
- language: es
|
- language: es
|
||||||
letters: piano
|
letters: piano
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
words:
|
words: []
|
||||||
- pan
|
|
||||||
- piano
|
|
||||||
- pino
|
|
||||||
- poni
|
|
||||||
- apio
|
|
||||||
crosswordData:
|
crosswordData:
|
||||||
columns: 10
|
columns: 10
|
||||||
rows: 7
|
rows: 7
|
||||||
placements:
|
placements: []
|
||||||
- word: pan
|
|
||||||
wordNumber: 1
|
|
||||||
startPosition: {x: 5, y: 2}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: piano
|
|
||||||
wordNumber: 2
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: pino
|
|
||||||
wordNumber: 3
|
|
||||||
startPosition: {x: 3, y: 3}
|
|
||||||
isHorizontal: 0
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: poni
|
|
||||||
wordNumber: 4
|
|
||||||
startPosition: {x: 0, y: 4}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
- word: apio
|
|
||||||
wordNumber: 5
|
|
||||||
startPosition: {x: 0, y: 6}
|
|
||||||
isHorizontal: 1
|
|
||||||
isSpecialItem: 0
|
|
||||||
specialItemPath:
|
|
||||||
specialItems: []
|
specialItems: []
|
||||||
minBounds: {x: 0, y: 2}
|
minBounds: {x: 5, y: 3}
|
||||||
maxBounds: {x: 7, y: 6}
|
maxBounds: {x: 5, y: 3}
|
||||||
serializedGrid: ' | | p | piano |poni n |
|
serializedGrid: ' | | | | |
|
||||||
n |apio '
|
| '
|
||||||
- language: fr
|
- language: fr
|
||||||
letters:
|
letters:
|
||||||
wordsAmount: 5
|
wordsAmount: 5
|
||||||
@ -167,9 +132,70 @@ MonoBehaviour:
|
|||||||
minBounds: {x: 0, y: 0}
|
minBounds: {x: 0, y: 0}
|
||||||
maxBounds: {x: 0, y: 0}
|
maxBounds: {x: 0, y: 0}
|
||||||
serializedGrid:
|
serializedGrid:
|
||||||
|
- language: tr
|
||||||
|
letters: "ayn\u0131"
|
||||||
|
wordsAmount: 5
|
||||||
|
words:
|
||||||
|
- "ayn\u0131"
|
||||||
|
- an
|
||||||
|
- "an\u0131"
|
||||||
|
- "ay\u0131"
|
||||||
|
- yan
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements:
|
||||||
|
- word: an
|
||||||
|
wordNumber: 3
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: yan
|
||||||
|
wordNumber: 2
|
||||||
|
startPosition: {x: 3, y: 3}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "ay\u0131"
|
||||||
|
wordNumber: 5
|
||||||
|
startPosition: {x: 1, y: 5}
|
||||||
|
isHorizontal: 1
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "ayn\u0131"
|
||||||
|
wordNumber: 4
|
||||||
|
startPosition: {x: 3, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
- word: "an\u0131"
|
||||||
|
wordNumber: 1
|
||||||
|
startPosition: {x: 5, y: 2}
|
||||||
|
isHorizontal: 0
|
||||||
|
isSpecialItem: 0
|
||||||
|
specialItemPath:
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 1, y: 2}
|
||||||
|
maxBounds: {x: 6, y: 5}
|
||||||
|
serializedGrid: " | | a an | yan | n \u0131
|
||||||
|
| ay\u0131 | "
|
||||||
|
- language: new
|
||||||
|
letters:
|
||||||
|
wordsAmount: 5
|
||||||
|
words: []
|
||||||
|
crosswordData:
|
||||||
|
columns: 10
|
||||||
|
rows: 7
|
||||||
|
placements: []
|
||||||
|
specialItems: []
|
||||||
|
minBounds: {x: 5, y: 3}
|
||||||
|
maxBounds: {x: 5, y: 3}
|
||||||
|
serializedGrid: ' | | | | |
|
||||||
|
| '
|
||||||
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
colorsTile: {fileID: 11400000, guid: e8a60425bb67f42618a943883b553d29, type: 2}
|
||||||
words: 5
|
words: 5
|
||||||
letters: 5
|
letters: 4
|
||||||
min: 3
|
min: 3
|
||||||
max: 6
|
max: 6
|
||||||
difficulty: 0
|
difficulty: 0
|
||||||
|
|||||||
@ -7,7 +7,6 @@ DAY : Day
|
|||||||
THANKS : Thanks!
|
THANKS : Thanks!
|
||||||
LOADING : Loading...
|
LOADING : Loading...
|
||||||
LUCKYSPIN : Lucky Spin
|
LUCKYSPIN : Lucky Spin
|
||||||
OK : OK
|
|
||||||
NOADSLABEL1 : Play without ads!
|
NOADSLABEL1 : Play without ads!
|
||||||
NOADSLABEL2 : Reward videos are optional and available for viewing after purchase
|
NOADSLABEL2 : Reward videos are optional and available for viewing after purchase
|
||||||
BUY : BUY
|
BUY : BUY
|
||||||
|
|||||||
@ -7,7 +7,6 @@ DAY : Jour
|
|||||||
THANKS : Merci !
|
THANKS : Merci !
|
||||||
LOADING : Chargement...
|
LOADING : Chargement...
|
||||||
LUCKYSPIN : Roue de la Fortune
|
LUCKYSPIN : Roue de la Fortune
|
||||||
OK : OK
|
|
||||||
NOADSLABEL1 : Jouez sans publicit<69>s !
|
NOADSLABEL1 : Jouez sans publicit<69>s !
|
||||||
NOADSLABEL2 : Les vid<69>os de r<>compense sont optionnelles et disponibles apr<70>s l'achat
|
NOADSLABEL2 : Les vid<69>os de r<>compense sont optionnelles et disponibles apr<70>s l'achat
|
||||||
BUY : ACHETER
|
BUY : ACHETER
|
||||||
|
|||||||
@ -0,0 +1,77 @@
|
|||||||
|
COINSSHOP : Κατάστημα Νομισμάτων
|
||||||
|
FREE : ΔΩΡΕΑΝ
|
||||||
|
BUYTIPS : Αγόρασε Βοήθειες (Tips)
|
||||||
|
GETFREE : Λάβε Δωρεάν
|
||||||
|
DAILYREWARD : Καθημερινές Ανταμοιβές
|
||||||
|
DAY : Ημέρα
|
||||||
|
THANKS : Ευχαριστούμε!
|
||||||
|
LOADING : Φορτώνει...
|
||||||
|
LUCKYSPIN : Τυχερή Περιστροφή
|
||||||
|
NOADSLABEL1 : Παίξε χωρίς διαφημίσεις!
|
||||||
|
NOADSLABEL2 : Τα βίντεο ανταμοιβής είναι προαιρετικά και διαθέσιμα για προβολή μετά την αγορά
|
||||||
|
BUY : ΑΓΟΡΑ
|
||||||
|
OUTOFLIVES : ΕΞΑΝΤΛΗΘΗΚΑΝ ΟΙ ΖΩΕΣ
|
||||||
|
REFILLTHELIVES : Αναπλήρωση των ζωών;
|
||||||
|
OUTOFTIME : ΕΞΑΝΤΛΗΘΗΚΕ Ο ΧΡΟΝΟΣ
|
||||||
|
REFILLTHETIME : Αναπλήρωση του χρόνου;
|
||||||
|
GIFT : Δώρο
|
||||||
|
LEVELCLEARED : ΕΠΙΠΕΔΟ ΟΛΟΚΛΗΡΩΘΗΚΕ!
|
||||||
|
SETTINGS : Ρυθμίσεις
|
||||||
|
SHOP : ΚΑΤΑΣΤΗΜΑ
|
||||||
|
PRIVACY : Απόρρητο
|
||||||
|
QUITTHEGAME : Έξοδος από το παιχνίδι
|
||||||
|
DOYOUWANTTOQUIT : Θέλετε πραγματικά να βγείτε;
|
||||||
|
YES : ΝΑΙ
|
||||||
|
NO : ΟΧΙ
|
||||||
|
COMINGSOON : Νέα επίπεδα έρχονται σύντομα. <br>Μείνετε συντονισμένοι για την επόμενη ενημέρωση.
|
||||||
|
WIN : ΝΙΚΗ
|
||||||
|
NEXTLEVEL : Επόμενο Επίπεδο
|
||||||
|
SCORE : Σκορ
|
||||||
|
POINTS : Πόντοι
|
||||||
|
REVIVEWITHNEWSHAPES : Αναβίωση με νέα σχήματα;
|
||||||
|
WHATCHADS : Παρακολούθηση Διαφημίσεων
|
||||||
|
CONTINUE : Συνέχεια
|
||||||
|
YOULOSE : Χάσατε...
|
||||||
|
RETRY : Ξαναπροσπάθησε
|
||||||
|
ALMOST : Σχεδόν τα καταφέρατε...
|
||||||
|
ARCADEMODE : ΛΕΙΤΟΥΡΓΙΑ ARCADE
|
||||||
|
STAGE : ΣΤΑΔΙΟ {stage}
|
||||||
|
LEVEL : Επίπεδο {level}
|
||||||
|
MOSTPOPULAR : Πιο Δημοφιλές
|
||||||
|
BESTOFFER : ΚΑΛΥΤΕΡΗ ΠΡΟΣΦΟΡΑ
|
||||||
|
NOADS : Κατάργηση Διαφημίσεων
|
||||||
|
FREESPIN : ΔΩΡΕΑΝ Περιστροφή
|
||||||
|
SOUNDS : Ήχοι
|
||||||
|
MUSIC : Μουσική
|
||||||
|
VIBRATION : Δόνηση
|
||||||
|
GAMEOVER : Τέλος Παιχνιδιού
|
||||||
|
YOURSCORE : Το Σκορ σας
|
||||||
|
BESTSCORE : ΚΑΛΥΤΕΡΟ Σκορ
|
||||||
|
NEWRECORD : Νέο Ρεκόρ!
|
||||||
|
EXITGAME : Έξοδος από το Παιχνίδι
|
||||||
|
ADVENTURE : ΠΕΡΙΠΕΤΕΙΑ
|
||||||
|
CLASSIC : ΚΛΑΣΙΚΟ
|
||||||
|
TUTORIAL : Εκμάθηση
|
||||||
|
RESTORE_PURCHASES : Επαναφορά Αγορών
|
||||||
|
EXTRAWORDS : Επιπλέον Λέξεις
|
||||||
|
WORDSNOTINTCLUDEDINTHISLEVEL : Λέξεις που δεν περιλαμβάνονται σε αυτό το επίπεδο
|
||||||
|
CLAIM : Διεκδίκηση
|
||||||
|
COINS : ΝΟΜΙΣΜΑΤΑ
|
||||||
|
GEMS : ΠΕΤΡΑΔΙΑ
|
||||||
|
TAPTOCOLLECT : ΠΑΤΗΣΤΕ ΓΙΑ ΣΥΛΛΟΓΗ
|
||||||
|
DAILYREWARDS : ΚΑΘΗΜΕΡΙΝΕΣ ΑΝΤΑΜΟΙΒΕΣ
|
||||||
|
SPIN : ΠΕΡΙΣΤΡΟΦΗ
|
||||||
|
SELECTLANGUAGE : ΕΠΙΛΟΓΗ ΓΛΩΣΣΑΣ
|
||||||
|
AGAIN : ΞΑΝΑ
|
||||||
|
UNLOCK : Συλλέξτε κάρτες για να ξεκλειδώσετε ενδιαφέροντα στοιχεία (facts)
|
||||||
|
TipBoosterButton : Εάν κολλήσετε, μπορείτε να χρησιμοποιήσετε μια ΥΠΟΔΕΙΞΗ (HINT)
|
||||||
|
HammerBoosterButton : Το ΣΦΥΡΙ αποκαλύπτει οποιοδήποτε γράμμα της επιλογής σας
|
||||||
|
ExtraWordsButton : Βρήκατε μια ΕΠΙΠΛΕΟΝ ΛΕΞΗ!
|
||||||
|
Extra words are displayed here : Οι επιπλέον λέξεις εμφανίζονται εδώ
|
||||||
|
GiftButton : Έχετε ξεκλειδώσει ένα ΔΩΡΟ! <br><br> ΞΟΔΕΨΤΕ ΠΕΤΡΑΔΙΑ για να λάβετε μια πολύτιμη ΑΝΤΑΜΟΙΒΗ
|
||||||
|
ShuffleButton : Το κουμπί ΑΝΑΚΑΤΕΜΑ (SHUFFLE) μπορεί να σας βοηθήσει να βρείτε λέξεις πιο γρήγορα
|
||||||
|
RedGem : Συνδέστε τη λέξη {word} για να λάβετε ένα ΚΟΚΚΙΝΟ ΠΕΤΡΑΔΙ
|
||||||
|
GameTutorial : Σύρετε για να συνδέσετε τη λέξη {word} με μία κίνηση
|
||||||
|
Home : Αρχική
|
||||||
|
HARD : ΔΥΣΚΟΛΟ
|
||||||
|
TIMETUT : Λύστε όλες τις λέξεις έγκαιρα για να ΚΕΡΔΙΣΕΤΕ
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 576d9cb2289d541228a31b12421cdab8
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
COINSSHOP : Loja de Moedas
|
||||||
|
FREE : GRÁTIS
|
||||||
|
BUYTIPS : Comprar Dicas
|
||||||
|
GETFREE : Obter Grátis
|
||||||
|
DAILYREWARD : Recompensas Diárias
|
||||||
|
DAY : Dia
|
||||||
|
THANKS : Obrigado!
|
||||||
|
LOADING : Carregando...
|
||||||
|
LUCKYSPIN : Giro da Sorte
|
||||||
|
NOADSLABEL1 : Jogue sem anúncios!
|
||||||
|
NOADSLABEL2 : Vídeos de recompensa são opcionais e disponíveis para visualização após a compra
|
||||||
|
BUY : COMPRAR
|
||||||
|
OUTOFLIVES : SEM VIDAS
|
||||||
|
REFILLTHELIVES : Recarregar as vidas?
|
||||||
|
OUTOFTIME : SEM TEMPO
|
||||||
|
REFILLTHETIME : Recarregar o tempo?
|
||||||
|
GIFT : Presente
|
||||||
|
LEVELCLEARED : NÍVEL CONCLUÍDO!
|
||||||
|
SETTINGS : Configurações
|
||||||
|
SHOP : LOJA
|
||||||
|
PRIVACY : Privacidade
|
||||||
|
QUITTHEGAME : Sair do jogo
|
||||||
|
DOYOUWANTTOQUIT : Você realmente quer sair?
|
||||||
|
YES : Sim
|
||||||
|
NO : NÃO
|
||||||
|
COMINGSOON : Novos níveis em breve. <br>Fique atento à próxima atualização.
|
||||||
|
WIN : VITÓRIA
|
||||||
|
NEXTLEVEL : Próximo Nível
|
||||||
|
SCORE : Pontuação
|
||||||
|
POINTS : Pontos
|
||||||
|
REVIVEWITHNEWSHAPES : Reviver com novas formas?
|
||||||
|
WHATCHADS : Assistir Anúncios
|
||||||
|
CONTINUE : Continuar
|
||||||
|
YOULOSE : Você Perdeu...
|
||||||
|
RETRY : Tentar Novamente
|
||||||
|
ALMOST : Quase lá...
|
||||||
|
ARCADEMODE : MODO ARCADE
|
||||||
|
STAGE : ESTÁGIO {stage}
|
||||||
|
LEVEL : Nível {level}
|
||||||
|
MOSTPOPULAR : Mais Popular
|
||||||
|
BESTOFFER : MELHOR Oferta
|
||||||
|
NOADS : Remover ADS
|
||||||
|
FREESPIN : Giro GRÁTIS
|
||||||
|
SOUNDS : Sons
|
||||||
|
MUSIC : Música
|
||||||
|
VIBRATION : Vibração
|
||||||
|
GAMEOVER : Fim de Jogo
|
||||||
|
YOURSCORE : Sua Pontuação
|
||||||
|
BESTSCORE : MELHOR Pontuação
|
||||||
|
NEWRECORD : Novo Recorde!
|
||||||
|
EXITGAME : Sair do Jogo
|
||||||
|
ADVENTURE : AVENTURA
|
||||||
|
CLASSIC : CLÁSSICO
|
||||||
|
TUTORIAL : Tutorial
|
||||||
|
RESTORE_PURCHASES : Restaurar Compras
|
||||||
|
EXTRAWORDS : Palavras Extras
|
||||||
|
WORDSNOTINTCLUDEDINTHISLEVEL : Palavras não incluídas neste nível
|
||||||
|
CLAIM : Reivindicar
|
||||||
|
COINS : MOEDAS
|
||||||
|
GEMS : GEMAS
|
||||||
|
TAPTOCOLLECT : TOQUE PARA COLETAR
|
||||||
|
DAILYREWARDS : RECOMPENSAS DIÁRIAS
|
||||||
|
SPIN :GIRO
|
||||||
|
SELECTLANGUAGE : SELECIONAR LÍNGUA
|
||||||
|
AGAIN : NOVAMENTE
|
||||||
|
UNLOCK : Colete cartas para desbloquear fatos interessantes
|
||||||
|
TipBoosterButton : Se você ficar preso, pode usar uma DICA
|
||||||
|
HammerBoosterButton : O MARTELO revela qualquer letra da sua escolha
|
||||||
|
ExtraWordsButton : Você encontrou uma PALAVRA EXTRA! Palavras extras são exibidas aqui
|
||||||
|
GiftButton : Você desbloqueou um PRESENTE!<br><br> GASTE GEMAS para receber uma RECOMPENSA valiosa
|
||||||
|
ShuffleButton : O botão EMBARALHAR pode ajudá-lo a encontrar palavras mais rápido
|
||||||
|
RedGem : Conecte a palavra {word} para obter uma GEMAS VERMELHA
|
||||||
|
GameTutorial : Deslize para conectar a palavra {word} em um único movimento
|
||||||
|
Home : Início
|
||||||
|
HARD : DIFÍCIL
|
||||||
|
TIMETUT : Resolva todas as palavras a tempo para VENCER
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f3a020d5ed0c44909e7df6a54db58fd9
|
||||||
|
timeCreated: 1756110934
|
||||||
@ -7,7 +7,6 @@ DAY : День
|
|||||||
THANKS : Спасибо!
|
THANKS : Спасибо!
|
||||||
LOADING : Загрузка...
|
LOADING : Загрузка...
|
||||||
LUCKYSPIN : Колесо удачи
|
LUCKYSPIN : Колесо удачи
|
||||||
OK : OK
|
|
||||||
NOADSLABEL1 : Сделайте эту покупку, чтобы навсегда убрать рекламу
|
NOADSLABEL1 : Сделайте эту покупку, чтобы навсегда убрать рекламу
|
||||||
NOADSLABEL2 : Рекламные видео остаются доступными для просмотра по желанию после покупки
|
NOADSLABEL2 : Рекламные видео остаются доступными для просмотра по желанию после покупки
|
||||||
BUY : КУПИТЬ
|
BUY : КУПИТЬ
|
||||||
|
|||||||
@ -7,7 +7,6 @@ DAY : Día
|
|||||||
THANKS : ¡Gracias!
|
THANKS : ¡Gracias!
|
||||||
LOADING : Cargando...
|
LOADING : Cargando...
|
||||||
LUCKYSPIN : GIRO DE SUERTE
|
LUCKYSPIN : GIRO DE SUERTE
|
||||||
OK : OK
|
|
||||||
YOURWIN : ¡Has Ganado!
|
YOURWIN : ¡Has Ganado!
|
||||||
NOADSLABEL1 : Haz esta compra para eliminar los anuncios permanentemente
|
NOADSLABEL1 : Haz esta compra para eliminar los anuncios permanentemente
|
||||||
NOADSLABEL2 : Los videos de recompensa son opcionales y están disponibles después de la compra
|
NOADSLABEL2 : Los videos de recompensa son opcionales y están disponibles después de la compra
|
||||||
|
|||||||
@ -0,0 +1,76 @@
|
|||||||
|
COINSSHOP : Jeton Mağazası
|
||||||
|
FREE : ÜCRETSİZ
|
||||||
|
BUYTIPS : İpucu Satın Al
|
||||||
|
GETFREE : Ücretsiz Al
|
||||||
|
DAILYREWARD : Günlük Ödüller
|
||||||
|
DAY : Gün
|
||||||
|
THANKS : Teşekkürler!
|
||||||
|
LOADING : Yükleniyor...
|
||||||
|
LUCKYSPIN : Şanslı Çark
|
||||||
|
NOADSLABEL1 : Reklamsız oyna!
|
||||||
|
NOADSLABEL2 : Ödül videoları isteğe bağlıdır ve satın alma sonrası izlenebilir
|
||||||
|
BUY : SATIN AL
|
||||||
|
OUTOFLIVES : CAN BİTTİ
|
||||||
|
REFILLTHELIVES : Canları yenile?
|
||||||
|
OUTOFTIME : SÜRE BİTTİ
|
||||||
|
REFILLTHETIME : Süreyi yenile?
|
||||||
|
GIFT : Hediye
|
||||||
|
LEVELCLEARED : LEVEL TAMAMLANDI!
|
||||||
|
SETTINGS : Ayarlar
|
||||||
|
SHOP : MAĞAZA
|
||||||
|
PRIVACY : Gizlilik
|
||||||
|
QUITTHEGAME : Oyundan çık
|
||||||
|
DOYOUWANTTOQUIT : Gerçekten çıkmak istiyor musun?
|
||||||
|
YES : Evet
|
||||||
|
NO : HAYIR
|
||||||
|
COMINGSOON : Yeni levellar yakında. <br>Bir sonraki güncelleme için takipte kalın.
|
||||||
|
WIN : KAZAN
|
||||||
|
NEXTLEVEL : Sonraki Level
|
||||||
|
SCORE : Skor
|
||||||
|
POINTS : Puan
|
||||||
|
REVIVEWITHNEWSHAPES : Yeni şekillerle canlan?
|
||||||
|
WHATCHADS : Reklam İzle
|
||||||
|
CONTINUE : Devam Et
|
||||||
|
YOULOSE : Kaybettin...
|
||||||
|
RETRY : Tekrar Dene
|
||||||
|
ALMOST : Neredeyse bitti...
|
||||||
|
ARCADEMODE : ARCADE MODU
|
||||||
|
STAGE : AŞAMA {stage}
|
||||||
|
LEVEL : Seviye {level}
|
||||||
|
MOSTPOPULAR : En Popüler
|
||||||
|
BESTOFFER : EN İYİ Teklif
|
||||||
|
NOADS : Reklamları Kaldır
|
||||||
|
FREESPIN : ÜCRETSİZ Çark
|
||||||
|
SOUNDS : Sesler
|
||||||
|
MUSIC : Müzik
|
||||||
|
VIBRATION : Titreşim
|
||||||
|
GAMEOVER : Oyun Bitti
|
||||||
|
YOURSCORE : Skorun
|
||||||
|
BESTSCORE : EN İYİ Skor
|
||||||
|
NEWRECORD : Yeni Rekor!
|
||||||
|
EXITGAME : Oyundan Çık
|
||||||
|
ADVENTURE : MACERA
|
||||||
|
CLASSIC : KLASİK
|
||||||
|
TUTORIAL : Öğretici
|
||||||
|
RESTORE_PURCHASES : Satın Alımları Geri Yükle
|
||||||
|
EXTRAWORDS : Ekstra Kelimeler
|
||||||
|
WORDSNOTINTCLUDEDINTHISLEVEL : Bu levelde bulunmayan kelimeler
|
||||||
|
CLAIM : Al
|
||||||
|
COINS : JETONLAR
|
||||||
|
GEMS : MÜCEVHERLER
|
||||||
|
TAPTOCOLLECT : ALMAK İÇİN DOKUN
|
||||||
|
DAILYREWARDS : GÜNLÜK ÖDÜLLER
|
||||||
|
SPIN : ÇARK
|
||||||
|
SELECTLANGUAGE : DİL SEÇ
|
||||||
|
AGAIN : TEKRAR
|
||||||
|
UNLOCK : İlginç gerçekleri açmak için kartları topla
|
||||||
|
TipBoosterButton : Takılırsan, İPUCU kullanabilirsin
|
||||||
|
HammerBoosterButton : ÇEKİÇ seçtiğin herhangi bir harfi açar
|
||||||
|
ExtraWordsButton : EKSTRA KELİME buldun! Ekstra kelimeler burada gösterilir
|
||||||
|
GiftButton : Bir HEDİYE açtın!<br><br> Değerli bir ÖDÜL almak için MÜCEVHER HARCA
|
||||||
|
ShuffleButton : KARIŞTIR butonu kelimeleri daha hızlı bulmanı sağlar
|
||||||
|
RedGem : {word} kelimesini birleştirerek KIRMIZI MÜCEVHER kazan
|
||||||
|
GameTutorial : {word} kelimesini tek harekette birleştirmek için kaydır
|
||||||
|
Home : Ana Sayfa
|
||||||
|
HARD : ZOR
|
||||||
|
TIMETUT : Tüm kelimeleri zamanında çözerek KAZAN
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 23172cfae5ce473c93c89484749c57f1
|
||||||
|
timeCreated: 1755096283
|
||||||
@ -13,7 +13,6 @@ GameObject:
|
|||||||
- component: {fileID: 1950329202737063183}
|
- component: {fileID: 1950329202737063183}
|
||||||
- component: {fileID: 3147130223869816525}
|
- component: {fileID: 3147130223869816525}
|
||||||
- component: {fileID: 6033270132168065964}
|
- component: {fileID: 6033270132168065964}
|
||||||
- component: {fileID: 636551701378598401}
|
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: NoAds
|
m_Name: NoAds
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -150,24 +149,6 @@ MonoBehaviour:
|
|||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
noSound: 0
|
noSound: 0
|
||||||
--- !u!114 &636551701378598401
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1411125501940549780}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: ecf8678021564e0c8ccdb00b43162f58, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
BuyItemButton: {fileID: 6033270132168065964}
|
|
||||||
price: {fileID: 994560272042212353}
|
|
||||||
count: {fileID: 0}
|
|
||||||
discountPercent: {fileID: 0}
|
|
||||||
productID: {fileID: 11400000, guid: 5a976435f08ad439db8305e3de645368, type: 2}
|
|
||||||
resource: {fileID: 0}
|
|
||||||
--- !u!1 &3033206250374185977
|
--- !u!1 &3033206250374185977
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -1371,6 +1352,7 @@ MonoBehaviour:
|
|||||||
- {fileID: 2587162064600910403}
|
- {fileID: 2587162064600910403}
|
||||||
- {fileID: 8029056659159804162}
|
- {fileID: 8029056659159804162}
|
||||||
noAdsProduct: {fileID: 11400000, guid: 5a976435f08ad439db8305e3de645368, type: 2}
|
noAdsProduct: {fileID: 11400000, guid: 5a976435f08ad439db8305e3de645368, type: 2}
|
||||||
|
noAdsPriceText: {fileID: 994560272042212353}
|
||||||
coinsSound: {fileID: 0}
|
coinsSound: {fileID: 0}
|
||||||
--- !u!95 &1506187382743174503
|
--- !u!95 &1506187382743174503
|
||||||
Animator:
|
Animator:
|
||||||
|
|||||||
@ -1119,8 +1119,8 @@ RectTransform:
|
|||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
m_AnchoredPosition: {x: -13.999998, y: 205.09991}
|
m_AnchoredPosition: {x: 10.214, y: 221.7}
|
||||||
m_SizeDelta: {x: 805.3, y: 125.2}
|
m_SizeDelta: {x: 960.6, y: 125.2}
|
||||||
m_Pivot: {x: 0.50953984, y: 1.5127809}
|
m_Pivot: {x: 0.50953984, y: 1.5127809}
|
||||||
--- !u!222 &7535087139974686469
|
--- !u!222 &7535087139974686469
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@ -1177,7 +1177,7 @@ MonoBehaviour:
|
|||||||
m_faceColor:
|
m_faceColor:
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
rgba: 4294967295
|
rgba: 4294967295
|
||||||
m_fontSize: 52.8
|
m_fontSize: 59.7
|
||||||
m_fontSizeBase: 32
|
m_fontSizeBase: 32
|
||||||
m_fontWeight: 400
|
m_fontWeight: 400
|
||||||
m_enableAutoSizing: 1
|
m_enableAutoSizing: 1
|
||||||
|
|||||||
@ -269,6 +269,7 @@ MonoBehaviour:
|
|||||||
disappearSound: {fileID: 0}
|
disappearSound: {fileID: 0}
|
||||||
removeAdsButton: {fileID: 1978271021528692323}
|
removeAdsButton: {fileID: 1978271021528692323}
|
||||||
productID: {fileID: 11400000, guid: 5a976435f08ad439db8305e3de645368, type: 2}
|
productID: {fileID: 11400000, guid: 5a976435f08ad439db8305e3de645368, type: 2}
|
||||||
|
priceText: {fileID: 5469067225883325548}
|
||||||
--- !u!223 &107975066550012903
|
--- !u!223 &107975066550012903
|
||||||
Canvas:
|
Canvas:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@ -242,8 +242,7 @@ RectTransform:
|
|||||||
- {fileID: 3904014851963953829}
|
- {fileID: 3904014851963953829}
|
||||||
- {fileID: 8498546336381412538}
|
- {fileID: 8498546336381412538}
|
||||||
- {fileID: 6912875309253603059}
|
- {fileID: 6912875309253603059}
|
||||||
- {fileID: 389028524070462765}
|
- {fileID: 6580947508340125878}
|
||||||
- {fileID: 7342428514651788858}
|
|
||||||
m_Father: {fileID: 4888698260352988140}
|
m_Father: {fileID: 4888698260352988140}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 0}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
@ -509,18 +508,18 @@ RectTransform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 2674760614323516302}
|
m_GameObject: {fileID: 2674760614323516302}
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
m_LocalPosition: {x: 0, y: 0, z: 2664.143}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 4386370085143922448}
|
- {fileID: 4386370085143922448}
|
||||||
- {fileID: 6674073733379322089}
|
- {fileID: 6674073733379322089}
|
||||||
m_Father: {fileID: 2148560976257270264}
|
m_Father: {fileID: 6580947508340125878}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
m_AnchoredPosition: {x: 255, y: -596}
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
m_SizeDelta: {x: 436.0297, y: 253.0126}
|
m_SizeDelta: {x: 0, y: 253.0126}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &6669546556015746141
|
--- !u!222 &6669546556015746141
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@ -631,6 +630,70 @@ MonoBehaviour:
|
|||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
noSound: 0
|
noSound: 0
|
||||||
|
--- !u!1 &5088694231550735736
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 6580947508340125878}
|
||||||
|
- component: {fileID: 3737039387247353948}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: Buttons
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &6580947508340125878
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5088694231550735736}
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: -2664.143}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 389028524070462765}
|
||||||
|
- {fileID: 7342428514651788858}
|
||||||
|
m_Father: {fileID: 2148560976257270264}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: 17.165, y: -590.07}
|
||||||
|
m_SizeDelta: {x: 928.17, y: 253}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &3737039387247353948
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5088694231550735736}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Padding:
|
||||||
|
m_Left: 0
|
||||||
|
m_Right: 0
|
||||||
|
m_Top: 0
|
||||||
|
m_Bottom: 0
|
||||||
|
m_ChildAlignment: 4
|
||||||
|
m_Spacing: 0
|
||||||
|
m_ChildForceExpandWidth: 1
|
||||||
|
m_ChildForceExpandHeight: 0
|
||||||
|
m_ChildControlWidth: 1
|
||||||
|
m_ChildControlHeight: 0
|
||||||
|
m_ChildScaleWidth: 0
|
||||||
|
m_ChildScaleHeight: 0
|
||||||
|
m_ReverseArrangement: 0
|
||||||
--- !u!1 &5987972094866960005
|
--- !u!1 &5987972094866960005
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -696,7 +759,7 @@ MonoBehaviour:
|
|||||||
m_OnCullStateChanged:
|
m_OnCullStateChanged:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
m_text:
|
m_text: AGAIN
|
||||||
m_isRightToLeft: 0
|
m_isRightToLeft: 0
|
||||||
m_fontAsset: {fileID: 11400000, guid: 14928a98ac0086a4483452d618f1764c, type: 2}
|
m_fontAsset: {fileID: 11400000, guid: 14928a98ac0086a4483452d618f1764c, type: 2}
|
||||||
m_sharedMaterial: {fileID: 2100000, guid: 68c9b8949d6894b4fac4f68f9a6fe10e, type: 2}
|
m_sharedMaterial: {fileID: 2100000, guid: 68c9b8949d6894b4fac4f68f9a6fe10e, type: 2}
|
||||||
@ -723,7 +786,7 @@ MonoBehaviour:
|
|||||||
m_faceColor:
|
m_faceColor:
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
rgba: 4294967295
|
rgba: 4294967295
|
||||||
m_fontSize: 32
|
m_fontSize: 60.25
|
||||||
m_fontSizeBase: 32
|
m_fontSizeBase: 32
|
||||||
m_fontWeight: 400
|
m_fontWeight: 400
|
||||||
m_enableAutoSizing: 1
|
m_enableAutoSizing: 1
|
||||||
@ -1123,6 +1186,7 @@ GameObject:
|
|||||||
- component: {fileID: 4686081452797347009}
|
- component: {fileID: 4686081452797347009}
|
||||||
- component: {fileID: 7087705036038996266}
|
- component: {fileID: 7087705036038996266}
|
||||||
- component: {fileID: 1306931333348575190}
|
- component: {fileID: 1306931333348575190}
|
||||||
|
- component: {fileID: 3582926535624043061}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Buy
|
m_Name: Buy
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -1138,18 +1202,18 @@ RectTransform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 7551346846335541968}
|
m_GameObject: {fileID: 7551346846335541968}
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
m_LocalPosition: {x: 0, y: 0, z: 2664.143}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 8035301690477598643}
|
- {fileID: 8035301690477598643}
|
||||||
- {fileID: 1593944131338580978}
|
- {fileID: 1593944131338580978}
|
||||||
m_Father: {fileID: 2148560976257270264}
|
m_Father: {fileID: 6580947508340125878}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
m_AnchoredPosition: {x: -228.9, y: -601}
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
m_SizeDelta: {x: 436.0297, y: 253.0126}
|
m_SizeDelta: {x: 0, y: 253.0126}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &2189947461181701794
|
--- !u!222 &2189947461181701794
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
@ -1260,6 +1324,18 @@ MonoBehaviour:
|
|||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls: []
|
m_Calls: []
|
||||||
noSound: 0
|
noSound: 0
|
||||||
|
--- !u!114 &3582926535624043061
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7551346846335541968}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c9c6b14262f434e07ad593f7b28fbfba, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
--- !u!1 &7627276145714778815
|
--- !u!1 &7627276145714778815
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -1442,9 +1518,9 @@ RectTransform:
|
|||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 7342428514651788858}
|
m_Father: {fileID: 7342428514651788858}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
m_AnchorMin: {x: 0, y: 0.5}
|
||||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
m_AnchorMax: {x: 0, y: 0.5}
|
||||||
m_AnchoredPosition: {x: -101, y: 13}
|
m_AnchoredPosition: {x: 131, y: 13}
|
||||||
m_SizeDelta: {x: 91.1761, y: 103.8394}
|
m_SizeDelta: {x: 91.1761, y: 103.8394}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &3736785195808042210
|
--- !u!222 &3736785195808042210
|
||||||
|
|||||||
@ -741,6 +741,7 @@ RectTransform:
|
|||||||
- {fileID: 7560663172583379825}
|
- {fileID: 7560663172583379825}
|
||||||
- {fileID: 2322537657978783918}
|
- {fileID: 2322537657978783918}
|
||||||
- {fileID: 90789140801721391}
|
- {fileID: 90789140801721391}
|
||||||
|
- {fileID: 2652648118269143667}
|
||||||
- {fileID: 837921014736427326}
|
- {fileID: 837921014736427326}
|
||||||
m_Father: {fileID: 7285109989598965343}
|
m_Father: {fileID: 7285109989598965343}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
@ -1143,6 +1144,7 @@ MonoBehaviour:
|
|||||||
appearSound: {fileID: 0}
|
appearSound: {fileID: 0}
|
||||||
disappearSound: {fileID: 0}
|
disappearSound: {fileID: 0}
|
||||||
privacypolicy: {fileID: 9102471955984009255}
|
privacypolicy: {fileID: 9102471955984009255}
|
||||||
|
googleUMPConsent: {fileID: 6611547390847006331}
|
||||||
restorePurchase: {fileID: 8408240860258485558}
|
restorePurchase: {fileID: 8408240860258485558}
|
||||||
vibrationSlider: {fileID: 505551677814366046}
|
vibrationSlider: {fileID: 505551677814366046}
|
||||||
--- !u!114 &7505269174666667659
|
--- !u!114 &7505269174666667659
|
||||||
@ -2190,11 +2192,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: m_text
|
propertyPath: m_text
|
||||||
value: Privacy
|
value: GDPR
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: instanceID
|
propertyPath: instanceID
|
||||||
value: PRIVACY
|
value:
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: m_fontSize
|
propertyPath: m_fontSize
|
||||||
@ -2294,11 +2296,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: m_AnchoredPosition.x
|
propertyPath: m_AnchoredPosition.x
|
||||||
value: -7
|
value: -2.8722
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: m_AnchoredPosition.y
|
propertyPath: m_AnchoredPosition.y
|
||||||
value: -761
|
value: -773
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
propertyPath: m_LocalEulerAnglesHint.x
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
@ -2421,3 +2423,336 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: c9659348afa04bc6bb30eb6900f94b65, type: 3}
|
m_Script: {fileID: 11500000, guid: c9659348afa04bc6bb30eb6900f94b65, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!1001 &8741391224511066416
|
||||||
|
PrefabInstance:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransformParent: {fileID: 3963225542060995251}
|
||||||
|
m_Modifications:
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 77.4014
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 85.2995
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 101.2
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 968135515561558649, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 95.8
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1734678026940801168, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Sprite
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 21300000, guid: 7f7bb377a7687438bb5a87d2eff4bfd7, type: 3}
|
||||||
|
- target: {fileID: 1734678026940801168, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.b
|
||||||
|
value: 0.7764706
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1734678026940801168, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.g
|
||||||
|
value: 0.57254905
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 1734678026940801168, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.r
|
||||||
|
value: 0.3529412
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2327761819407891759, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.b
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2327761819407891759, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.g
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2327761819407891759, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.r
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2490286444286461771, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_TargetGraphic
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 3705024337948060229}
|
||||||
|
- target: {fileID: 2611169328416249915, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: part1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3155086027690401780, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.b
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3155086027690401780, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.g
|
||||||
|
value: 0.9686275
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 3155086027690401780, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.r
|
||||||
|
value: 0.9058824
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4025083493491244185, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.b
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4025083493491244185, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.g
|
||||||
|
value: 0.95294124
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4025083493491244185, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.r
|
||||||
|
value: 0.9058824
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_text
|
||||||
|
value: Privacy
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: instanceID
|
||||||
|
value: PRIVACY
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontSize
|
||||||
|
value: 60
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontStyle
|
||||||
|
value: 4
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontColor.b
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontColor.g
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontColor.r
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontSizeBase
|
||||||
|
value: 60
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_enableAutoSizing
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_fontColor32.rgba
|
||||||
|
value: 4294967295
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5972637010007008015, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: icon
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Pivot.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Pivot.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 627.1525
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 106.1967
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.w
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.x
|
||||||
|
value: -0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.y
|
||||||
|
value: -0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.z
|
||||||
|
value: -0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: -8
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: -666.8
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Type
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Sprite
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 21300000, guid: 123f05a2a44574111bd629640dbce473, type: 3}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.b
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.g
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Color.r
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Enabled
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_PixelsPerUnitMultiplier
|
||||||
|
value: 1.35
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8001603133226906570, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8201212475682522876, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: UMP
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 8201212475682522876, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 9157385146011294632, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: part 2
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
m_RemovedComponents:
|
||||||
|
- {fileID: 7905749766136477480, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
m_RemovedGameObjects:
|
||||||
|
- {fileID: 808954587397050430, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
- {fileID: 9157385146011294632, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
- {fileID: 2611169328416249915, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
- {fileID: 5972637010007008015, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
m_AddedGameObjects: []
|
||||||
|
m_AddedComponents: []
|
||||||
|
m_SourcePrefab: {fileID: 100100000, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
--- !u!224 &2652648118269143667 stripped
|
||||||
|
RectTransform:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 6746304736006806339, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 8741391224511066416}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!114 &3705024337948060229 stripped
|
||||||
|
MonoBehaviour:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 5342761196953066357, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 8741391224511066416}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 2bc838cbc2e148b3a5e7578d063ccb18, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!114 &6611547390847006331 stripped
|
||||||
|
MonoBehaviour:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 2490286444286461771, guid: 4a90a7a36be6c3249a0612ab1316c8fc, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 8741391224511066416}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c9659348afa04bc6bb30eb6900f94b65, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 44ad2bed4c494715ba8ad21e150b03ee, type: 3}
|
||||||
|
m_Name: AdsInterstitialSettings
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
interstitials:
|
||||||
|
- elementName: Interstitial
|
||||||
|
adReference: {fileID: 11400000, guid: f9303f4b583464bc08f45f673b581f90, type: 2}
|
||||||
|
popup: {fileID: 578949463131755950, guid: a9a2cf415d78749059b02eb227bd4ff0, type: 3}
|
||||||
|
showOnOpen: 1
|
||||||
|
showOnClose: 0
|
||||||
|
minLevel: 1
|
||||||
|
maxLevel: 1000
|
||||||
|
frequency: 1
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d40017039bee543bd909a2ec0c80c188
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -14,11 +14,11 @@ MonoBehaviour:
|
|||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
adProfiles:
|
adProfiles:
|
||||||
- name: Unity ads iOS
|
- name: Unity ads iOS
|
||||||
enable: 1
|
enable: 0
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 1
|
platforms: 1
|
||||||
appId: 5698950
|
appId: 5698950
|
||||||
adsHandler: {fileID: 11400000, guid: 60c77287bd6d042938fbd15e5462e051, type: 2}
|
adsHandler: {fileID: 0}
|
||||||
adElements:
|
adElements:
|
||||||
- placementId: Interstitial_iOS
|
- placementId: Interstitial_iOS
|
||||||
adReference: {fileID: 11400000, guid: f9303f4b583464bc08f45f673b581f90, type: 2}
|
adReference: {fileID: 11400000, guid: f9303f4b583464bc08f45f673b581f90, type: 2}
|
||||||
@ -33,11 +33,11 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: Unity ads banner ios
|
- name: Unity ads banner ios
|
||||||
enable: 1
|
enable: 0
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 1
|
platforms: 1
|
||||||
appId: 5698950
|
appId: 5698950
|
||||||
adsHandler: {fileID: 11400000, guid: 74706189f5004431584663da028f09e5, type: 2}
|
adsHandler: {fileID: 0}
|
||||||
adElements:
|
adElements:
|
||||||
- placementId: Banner_iOS
|
- placementId: Banner_iOS
|
||||||
adReference: {fileID: 11400000, guid: 4396e62ba27584ef79ac362c4948ee63, type: 2}
|
adReference: {fileID: 11400000, guid: 4396e62ba27584ef79ac362c4948ee63, type: 2}
|
||||||
@ -46,11 +46,11 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: Unity ads Android
|
- name: Unity ads Android
|
||||||
enable: 1
|
enable: 0
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 0
|
platforms: 0
|
||||||
appId: 5870065
|
appId: 5870065
|
||||||
adsHandler: {fileID: 11400000, guid: 60c77287bd6d042938fbd15e5462e051, type: 2}
|
adsHandler: {fileID: 0}
|
||||||
adElements:
|
adElements:
|
||||||
- placementId: Interstitial_Android
|
- placementId: Interstitial_Android
|
||||||
adReference: {fileID: 11400000, guid: f9303f4b583464bc08f45f673b581f90, type: 2}
|
adReference: {fileID: 11400000, guid: f9303f4b583464bc08f45f673b581f90, type: 2}
|
||||||
@ -65,11 +65,11 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: Unity ads banner android
|
- name: Unity ads banner android
|
||||||
enable: 1
|
enable: 0
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 0
|
platforms: 0
|
||||||
appId: 5870065
|
appId: 5870065
|
||||||
adsHandler: {fileID: 11400000, guid: 74706189f5004431584663da028f09e5, type: 2}
|
adsHandler: {fileID: 0}
|
||||||
adElements:
|
adElements:
|
||||||
- placementId: Banner_Android
|
- placementId: Banner_Android
|
||||||
adReference: {fileID: 11400000, guid: 4396e62ba27584ef79ac362c4948ee63, type: 2}
|
adReference: {fileID: 11400000, guid: 4396e62ba27584ef79ac362c4948ee63, type: 2}
|
||||||
@ -116,7 +116,7 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: admob iOS
|
- name: admob iOS
|
||||||
enable: 0
|
enable: 1
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 1
|
platforms: 1
|
||||||
appId: ca-app-pub-1921802893067184~3779034969
|
appId: ca-app-pub-1921802893067184~3779034969
|
||||||
@ -135,7 +135,7 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: admob Android
|
- name: admob Android
|
||||||
enable: 0
|
enable: 1
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 0
|
platforms: 0
|
||||||
appId: ca-app-pub-1921802893067184~8049698250
|
appId: ca-app-pub-1921802893067184~8049698250
|
||||||
@ -154,7 +154,7 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: Admob banner IOS
|
- name: Admob banner IOS
|
||||||
enable: 0
|
enable: 1
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 1
|
platforms: 1
|
||||||
appId: ca-app-pub-1921802893067184~3779034969
|
appId: ca-app-pub-1921802893067184~3779034969
|
||||||
@ -167,10 +167,10 @@ MonoBehaviour:
|
|||||||
showOnOpen: 0
|
showOnOpen: 0
|
||||||
showOnClose: 0
|
showOnClose: 0
|
||||||
- name: Admob banner android
|
- name: Admob banner android
|
||||||
enable: 0
|
enable: 1
|
||||||
testInEditor: 1
|
testInEditor: 1
|
||||||
platforms: 0
|
platforms: 0
|
||||||
appId: ca-app-pub-1921802893067184~8049698250
|
appId: ca-app-pub-3940256099942544/6300978111
|
||||||
adsHandler: {fileID: 11400000, guid: 2115921dfa5e14398a54b0ad2a801cec, type: 2}
|
adsHandler: {fileID: 11400000, guid: 2115921dfa5e14398a54b0ad2a801cec, type: 2}
|
||||||
adElements:
|
adElements:
|
||||||
- placementId: ca-app-pub-1921802893067184/7055346637
|
- placementId: ca-app-pub-1921802893067184/7055346637
|
||||||
|
|||||||
@ -17,4 +17,5 @@ MonoBehaviour:
|
|||||||
Lose: 26
|
Lose: 26
|
||||||
Back: 60
|
Back: 60
|
||||||
Restart: 32
|
Restart: 32
|
||||||
TestLanguage: 10
|
SimulateDuplicate: 16
|
||||||
|
TestLanguageCode: en
|
||||||
|
|||||||
@ -2617,7 +2617,6 @@ MonoBehaviour:
|
|||||||
m_DeselectOnBackgroundClick: 1
|
m_DeselectOnBackgroundClick: 1
|
||||||
m_PointerBehavior: 0
|
m_PointerBehavior: 0
|
||||||
m_CursorLockBehavior: 0
|
m_CursorLockBehavior: 0
|
||||||
m_ScrollDeltaPerTick: 6
|
|
||||||
--- !u!1 &1251246399
|
--- !u!1 &1251246399
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -5097,7 +5096,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 862757017896117680, guid: 62f7a9d47df56401f802404b7d45d912, type: 3}
|
- target: {fileID: 862757017896117680, guid: 62f7a9d47df56401f802404b7d45d912, type: 3}
|
||||||
propertyPath: m_AnchoredPosition.y
|
propertyPath: m_AnchoredPosition.y
|
||||||
value: -233.00012
|
value: -233.00006
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 862757017896117680, guid: 62f7a9d47df56401f802404b7d45d912, type: 3}
|
- target: {fileID: 862757017896117680, guid: 62f7a9d47df56401f802404b7d45d912, type: 3}
|
||||||
propertyPath: m_LocalEulerAnglesHint.x
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
"GUID:c98377141161c7746a178fb5cb1af075",
|
"GUID:c98377141161c7746a178fb5cb1af075",
|
||||||
"GUID:75469ad4d38634e559750d17036d5f7c",
|
"GUID:75469ad4d38634e559750d17036d5f7c",
|
||||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
||||||
"jp.hadashikick.vcontainer"
|
"jp.hadashikick.vcontainer",
|
||||||
|
"GUID:63a57c8b658089e49a173b0f0c4870a7"
|
||||||
],
|
],
|
||||||
"includePlatforms": [],
|
"includePlatforms": [],
|
||||||
"excludePlatforms": [],
|
"excludePlatforms": [],
|
||||||
|
|||||||
@ -0,0 +1,126 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace WordsToolkit.Scripts.Editor
|
||||||
|
{
|
||||||
|
public class CustomModelPostProcessor : AssetPostprocessor
|
||||||
|
{
|
||||||
|
private static readonly string SOURCE_PATH = "Assets/WordsToolkit/model/custom";
|
||||||
|
private static readonly string TARGET_PATH = "Assets/StreamingAssets/WordConnectGameToolkit/model/custom";
|
||||||
|
|
||||||
|
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
|
||||||
|
{
|
||||||
|
bool hasCustomModelChanges = false;
|
||||||
|
|
||||||
|
// Check imported assets
|
||||||
|
foreach (string assetPath in importedAssets)
|
||||||
|
{
|
||||||
|
if (IsCustomModelFile(assetPath))
|
||||||
|
{
|
||||||
|
hasCustomModelChanges = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check moved assets
|
||||||
|
if (!hasCustomModelChanges)
|
||||||
|
{
|
||||||
|
foreach (string assetPath in movedAssets)
|
||||||
|
{
|
||||||
|
if (IsCustomModelFile(assetPath))
|
||||||
|
{
|
||||||
|
hasCustomModelChanges = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasCustomModelChanges)
|
||||||
|
{
|
||||||
|
CopyCustomModelsToStreamingAssets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsCustomModelFile(string assetPath)
|
||||||
|
{
|
||||||
|
return assetPath.StartsWith(SOURCE_PATH) &&
|
||||||
|
(assetPath.EndsWith(".bin") || assetPath.EndsWith(".json") || assetPath.EndsWith(".txt"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CopyCustomModelsToStreamingAssets()
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(SOURCE_PATH))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create target directory
|
||||||
|
Directory.CreateDirectory(TARGET_PATH);
|
||||||
|
|
||||||
|
// Get all custom model files
|
||||||
|
string[] files = Directory.GetFiles(SOURCE_PATH, "*", SearchOption.AllDirectories);
|
||||||
|
|
||||||
|
foreach (string sourceFile in files)
|
||||||
|
{
|
||||||
|
// Skip .meta files
|
||||||
|
if (sourceFile.EndsWith(".meta"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Calculate relative path from source directory
|
||||||
|
string relativePath = Path.GetRelativePath(SOURCE_PATH, sourceFile);
|
||||||
|
string targetFile = Path.Combine(TARGET_PATH, relativePath);
|
||||||
|
|
||||||
|
// Create target subdirectory if needed
|
||||||
|
string targetDir = Path.GetDirectoryName(targetFile);
|
||||||
|
if (!Directory.Exists(targetDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(targetDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Copy file if it doesn't exist or is newer
|
||||||
|
if (!File.Exists(targetFile) || File.GetLastWriteTime(sourceFile) > File.GetLastWriteTime(targetFile))
|
||||||
|
{
|
||||||
|
File.Copy(sourceFile, targetFile, true);
|
||||||
|
Debug.Log($"[CustomModelPostProcessor] Copied {relativePath} to StreamingAssets");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError($"[CustomModelPostProcessor] Failed to copy {sourceFile}: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Refresh the asset database so Unity sees the new files
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("WordToolkit/Copy Custom Models to StreamingAssets")]
|
||||||
|
private static void ManualCopyCustomModels()
|
||||||
|
{
|
||||||
|
CopyCustomModelsToStreamingAssets();
|
||||||
|
Debug.Log("[CustomModelPostProcessor] Manual copy completed");
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("WordToolkit/Clean Custom Models from StreamingAssets")]
|
||||||
|
private static void CleanCustomModelsFromStreamingAssets()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(TARGET_PATH))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(TARGET_PATH, true);
|
||||||
|
Debug.Log("[CustomModelPostProcessor] Cleaned custom models from StreamingAssets");
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError($"[CustomModelPostProcessor] Failed to clean StreamingAssets: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1a1b585689cce4771abd8ec25020f1a9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -84,7 +84,7 @@ namespace WordsToolkit.Scripts.Editor
|
|||||||
[MenuItem( nameof(WordConnect) + "/Settings/Gift settings")]
|
[MenuItem( nameof(WordConnect) + "/Settings/Gift settings")]
|
||||||
public static void GiftSettings()
|
public static void GiftSettings()
|
||||||
{
|
{
|
||||||
Selection.activeObject = AssetDatabase.LoadMainAssetAtPath(WordConnectPath + "/Resources/Settings/GiftSettings.asset");
|
Selection.activeObject = AssetDatabase.LoadMainAssetAtPath(WordConnectPath + "/Resources/Settings/GiftsSettings.asset");
|
||||||
}
|
}
|
||||||
|
|
||||||
[MenuItem( nameof(WordConnect) + "/Scenes/Main scene &1", priority = 0)]
|
[MenuItem( nameof(WordConnect) + "/Scenes/Main scene &1", priority = 0)]
|
||||||
@ -162,12 +162,5 @@ namespace WordsToolkit.Scripts.Editor
|
|||||||
PlayerPrefs.DeleteKey("GameState");
|
PlayerPrefs.DeleteKey("GameState");
|
||||||
Debug.Log("PlayerPrefs are reset");
|
Debug.Log("PlayerPrefs are reset");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🔥 新增菜单项,打开 PrefabBatchViewer 窗口
|
|
||||||
[MenuItem(nameof(WordConnect) + "/Settings/Prefab Batch Viewer")]
|
|
||||||
public static void OpenPrefabBatchViewer()
|
|
||||||
{
|
|
||||||
PopupPreview.ShowWindow();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,6 +23,7 @@ namespace WordsToolkit.Scripts.Editor
|
|||||||
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
|
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
|
||||||
{
|
{
|
||||||
CheckDefines("Assets/GoogleMobileAds", "ADMOB");
|
CheckDefines("Assets/GoogleMobileAds", "ADMOB");
|
||||||
|
CheckUMPAvailable();
|
||||||
CheckDefines("Assets/FacebookSDK", "FACEBOOK");
|
CheckDefines("Assets/FacebookSDK", "FACEBOOK");
|
||||||
CheckDefines("Assets/PlayFabSDK", "PLAYFAB");
|
CheckDefines("Assets/PlayFabSDK", "PLAYFAB");
|
||||||
CheckDefines("Assets/GameSparks", "GAMESPARKS");
|
CheckDefines("Assets/GameSparks", "GAMESPARKS");
|
||||||
@ -41,6 +42,18 @@ namespace WordsToolkit.Scripts.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CheckUMPAvailable()
|
||||||
|
{
|
||||||
|
if (( Directory.Exists("Assets/GoogleMobileAds")))
|
||||||
|
{
|
||||||
|
DefineSymbolsUtils.AddSymbol("UMP_AVAILABLE");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DefineSymbolsUtils.DeleteSymbol("UMP_AVAILABLE");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void CheckIronsourceFolder()
|
public static void CheckIronsourceFolder()
|
||||||
{
|
{
|
||||||
var str = "Assets/LevelPlay";
|
var str = "Assets/LevelPlay";
|
||||||
|
|||||||
@ -26,7 +26,6 @@ namespace WordsToolkit.Scripts.Enums
|
|||||||
LanguageChanged,
|
LanguageChanged,
|
||||||
TileSelected,
|
TileSelected,
|
||||||
PurchaseSucceeded,
|
PurchaseSucceeded,
|
||||||
PurchaseFailed,
|
|
||||||
ButtonClicked,
|
ButtonClicked,
|
||||||
WordAnimated,
|
WordAnimated,
|
||||||
ExtraWordClaimed
|
ExtraWordClaimed
|
||||||
|
|||||||
@ -34,6 +34,7 @@ namespace WordsToolkit.Scripts.GUI.Buttons.Boosts
|
|||||||
|
|
||||||
private CanvasGroup canvasGroup;
|
private CanvasGroup canvasGroup;
|
||||||
private bool isActive;
|
private bool isActive;
|
||||||
|
private bool isAnimating;
|
||||||
|
|
||||||
|
|
||||||
protected override void OnEnable()
|
protected override void OnEnable()
|
||||||
@ -79,6 +80,12 @@ namespace WordsToolkit.Scripts.GUI.Buttons.Boosts
|
|||||||
|
|
||||||
protected void OnClick()
|
protected void OnClick()
|
||||||
{
|
{
|
||||||
|
// Prevent clicks during animation
|
||||||
|
if (isAnimating)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (isActive)
|
if (isActive)
|
||||||
{
|
{
|
||||||
Refund();
|
Refund();
|
||||||
@ -105,6 +112,7 @@ namespace WordsToolkit.Scripts.GUI.Buttons.Boosts
|
|||||||
|
|
||||||
protected virtual void ActivateBoost(bool hideButtons = true)
|
protected virtual void ActivateBoost(bool hideButtons = true)
|
||||||
{
|
{
|
||||||
|
isAnimating = true;
|
||||||
UpdatePriceDisplay();
|
UpdatePriceDisplay();
|
||||||
if(hideButtons)
|
if(hideButtons)
|
||||||
buttonViewController.HideOtherButtons(this);
|
buttonViewController.HideOtherButtons(this);
|
||||||
@ -117,6 +125,7 @@ namespace WordsToolkit.Scripts.GUI.Buttons.Boosts
|
|||||||
protected virtual void DeactivateBoost()
|
protected virtual void DeactivateBoost()
|
||||||
{
|
{
|
||||||
isActive = false;
|
isActive = false;
|
||||||
|
isAnimating = false;
|
||||||
buttonViewController.ShowButtons();
|
buttonViewController.ShowButtons();
|
||||||
waves.Clear();
|
waves.Clear();
|
||||||
waves.Stop();
|
waves.Stop();
|
||||||
|
|||||||
@ -0,0 +1,17 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using WordsToolkit.Scripts.Settings;
|
||||||
|
|
||||||
|
namespace WordsToolkit.Scripts.GUI.Labels
|
||||||
|
{
|
||||||
|
public class IAPDisabler : MonoBehaviour
|
||||||
|
{
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
var gameSettings = Resources.Load<GameSettings>("Settings/GameSettings");
|
||||||
|
if (gameSettings != null && !gameSettings.enableInApps)
|
||||||
|
{
|
||||||
|
gameObject.SetActive(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c9c6b14262f434e07ad593f7b28fbfba
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -10,6 +10,7 @@
|
|||||||
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// // THE SOFTWARE.
|
// // THE SOFTWARE.
|
||||||
|
|
||||||
|
using DG.Tweening;
|
||||||
using TMPro;
|
using TMPro;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using VContainer;
|
using VContainer;
|
||||||
@ -65,11 +66,7 @@ namespace WordsToolkit.Scripts.GUI
|
|||||||
|
|
||||||
public void ShowLanguageSelector()
|
public void ShowLanguageSelector()
|
||||||
{
|
{
|
||||||
menuManager.CloseAllPopups();
|
menuManager.ShowPopup<LanguageSelectionGame>(null, result => { UpdateText(); });
|
||||||
menuManager.ShowPopup<LanguageSelectionGame>(null, result =>
|
|
||||||
{
|
|
||||||
UpdateText();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -23,12 +23,6 @@ namespace WordsToolkit.Scripts.GUI.Tutorials
|
|||||||
{
|
{
|
||||||
public class TutorialWordSubstitution : TutorialPopupBase
|
public class TutorialWordSubstitution : TutorialPopupBase
|
||||||
{
|
{
|
||||||
[Inject]
|
|
||||||
protected LevelManager levelManager;
|
|
||||||
|
|
||||||
[Inject]
|
|
||||||
protected GameManager gameManager;
|
|
||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private GameObject hand;
|
private GameObject hand;
|
||||||
|
|
||||||
|
|||||||
@ -28,6 +28,7 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
private WordSelectionManager wordSelectionManager;
|
private WordSelectionManager wordSelectionManager;
|
||||||
private bool isSelected = false;
|
private bool isSelected = false;
|
||||||
private Color color;
|
private Color color;
|
||||||
|
private string originalLetter; // Store the original letter for validation
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
@ -74,12 +75,13 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
|
|
||||||
public string GetLetter()
|
public string GetLetter()
|
||||||
{
|
{
|
||||||
return letterText.text;
|
return originalLetter ?? letterText.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetText(string toString)
|
public void SetText(string toString)
|
||||||
{
|
{
|
||||||
letterText.text = toString.ToUpper();
|
originalLetter = toString; // Store the original letter
|
||||||
|
letterText.text = toString.ToUpper(); // Display in uppercase
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetColor(Color color)
|
public void SetColor(Color color)
|
||||||
|
|||||||
@ -523,7 +523,7 @@ namespace WordsToolkit.Scripts.Gameplay.Managers
|
|||||||
if (string.IsNullOrEmpty(word))
|
if (string.IsNullOrEmpty(word))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!wordValidator.IsWordKnown(word.ToLower(), gameStateManager.CurrentLanguage))
|
if (!wordValidator.IsWordKnown(word, gameStateManager.CurrentLanguage))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool wasOpened = false;
|
bool wasOpened = false;
|
||||||
|
|||||||
@ -37,7 +37,6 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
private Color[] openColors = new Color[3];
|
private Color[] openColors = new Color[3];
|
||||||
|
|
||||||
private bool isSelected = false;
|
private bool isSelected = false;
|
||||||
private int wordNumber = -1;
|
|
||||||
private bool isOpen = false;
|
private bool isOpen = false;
|
||||||
|
|
||||||
[Header("Special Item")]
|
[Header("Special Item")]
|
||||||
@ -321,6 +320,8 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
// Only respond if the tile is selectable and closed
|
// Only respond if the tile is selectable and closed
|
||||||
if (!isOpen && levelManager != null && levelManager.hammerMode)
|
if (!isOpen && levelManager != null && levelManager.hammerMode)
|
||||||
{
|
{
|
||||||
|
// Immediately disable hammer mode to prevent multiple uses
|
||||||
|
levelManager.hammerMode = false;
|
||||||
// Instead of opening immediately, play hammer animation first
|
// Instead of opening immediately, play hammer animation first
|
||||||
PlayHammerAnimationAndOpen();
|
PlayHammerAnimationAndOpen();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,7 +42,6 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
private float idleTimer = 0f;
|
private float idleTimer = 0f;
|
||||||
private Vector2 lastPosition;
|
private Vector2 lastPosition;
|
||||||
public Image cursorImage; // Reference to cursor image
|
public Image cursorImage; // Reference to cursor image
|
||||||
private bool isCursorVisible = true;
|
|
||||||
private float targetAlpha;
|
private float targetAlpha;
|
||||||
private float currentAlpha;
|
private float currentAlpha;
|
||||||
|
|
||||||
|
|||||||
@ -66,7 +66,6 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
private CanvasGroup panelCanvasGroup;
|
private CanvasGroup panelCanvasGroup;
|
||||||
|
|
||||||
[Header("UI References")]
|
[Header("UI References")]
|
||||||
[SerializeField] private float characterSpacing = 30f; // Spacing between characters
|
|
||||||
public Image backgroundSelectedWord; // Reference to the background image
|
public Image backgroundSelectedWord; // Reference to the background image
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private TextMeshProUGUI selectedWordText;
|
private TextMeshProUGUI selectedWordText;
|
||||||
@ -463,7 +462,7 @@ namespace WordsToolkit.Scripts.Gameplay
|
|||||||
if (selectedWordText != null)
|
if (selectedWordText != null)
|
||||||
{
|
{
|
||||||
selectedWordText.color = new Color(selectedWordText.color.r, selectedWordText.color.g, selectedWordText.color.b, 1f);
|
selectedWordText.color = new Color(selectedWordText.color.r, selectedWordText.color.g, selectedWordText.color.b, 1f);
|
||||||
selectedWordText.text = GetSelectedWord();
|
selectedWordText.text = GetSelectedWord().ToUpper();
|
||||||
UpdateHorizontalLayout(layout);
|
UpdateHorizontalLayout(layout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,7 +33,6 @@ namespace WordsToolkit.Scripts.Gameplay.WordValidator
|
|||||||
if (string.IsNullOrEmpty(word))
|
if (string.IsNullOrEmpty(word))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
word = word.ToLower();
|
|
||||||
return (modelController != null && modelController.IsWordKnown(word, currentLanguage)) ||
|
return (modelController != null && modelController.IsWordKnown(word, currentLanguage)) ||
|
||||||
(customWordRepository != null && customWordRepository.ContainsWord(word));
|
(customWordRepository != null && customWordRepository.ContainsWord(word));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -721,9 +721,18 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
// Handle selection from LevelHierarchyTreeView
|
// Handle selection from LevelHierarchyTreeView
|
||||||
if (selectedItem != null && selectedItem.type == LevelHierarchyItem.ItemType.Level && selectedItem.levelAsset != null)
|
if (selectedItem != null && selectedItem.type == LevelHierarchyItem.ItemType.Level && selectedItem.levelAsset != null)
|
||||||
{
|
{
|
||||||
// Try to find any available language data in the level
|
// Use the same language selection logic as the "Open Grid" button
|
||||||
string foundLanguage = FindAvailableLanguage(selectedItem.levelAsset);
|
// This preserves the user's currently selected language tab
|
||||||
|
string languageCode = LevelEditorUtility.GetLanguageCodeForLevel(selectedItem.levelAsset);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(languageCode))
|
||||||
|
{
|
||||||
|
SetCurrentLevel(selectedItem.levelAsset, languageCode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback: try to find any available language data in the level
|
||||||
|
string foundLanguage = FindAvailableLanguage(selectedItem.levelAsset);
|
||||||
if (!string.IsNullOrEmpty(foundLanguage))
|
if (!string.IsNullOrEmpty(foundLanguage))
|
||||||
{
|
{
|
||||||
SetCurrentLevel(selectedItem.levelAsset, foundLanguage);
|
SetCurrentLevel(selectedItem.levelAsset, foundLanguage);
|
||||||
@ -734,6 +743,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
SetCurrentLevel(selectedItem.levelAsset, "en");
|
SetCurrentLevel(selectedItem.levelAsset, "en");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (selectedItem == null || selectedItem.type != LevelHierarchyItem.ItemType.Level)
|
else if (selectedItem == null || selectedItem.type != LevelHierarchyItem.ItemType.Level)
|
||||||
{
|
{
|
||||||
// Clear the current level if a non-level item is selected
|
// Clear the current level if a non-level item is selected
|
||||||
@ -767,16 +777,28 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
Level latestLevel = AssetDatabase.LoadAssetAtPath<Level>(path);
|
Level latestLevel = AssetDatabase.LoadAssetAtPath<Level>(path);
|
||||||
if (latestLevel != null)
|
if (latestLevel != null)
|
||||||
{
|
{
|
||||||
|
// Use the same language selection logic as the rest of the system
|
||||||
|
string languageCode = LevelEditorUtility.GetLanguageCodeForLevel(latestLevel);
|
||||||
|
if (!string.IsNullOrEmpty(languageCode))
|
||||||
|
{
|
||||||
|
SetCurrentLevel(latestLevel, languageCode);
|
||||||
|
Debug.Log($"CrosswordGridWindow: Loaded latest level '{latestLevel.name}' with language '{languageCode}' from EditorPrefs");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback
|
||||||
string foundLanguage = FindAvailableLanguage(latestLevel);
|
string foundLanguage = FindAvailableLanguage(latestLevel);
|
||||||
if (!string.IsNullOrEmpty(foundLanguage))
|
if (!string.IsNullOrEmpty(foundLanguage))
|
||||||
{
|
{
|
||||||
SetCurrentLevel(latestLevel, foundLanguage);
|
SetCurrentLevel(latestLevel, foundLanguage);
|
||||||
Debug.Log($"CrosswordGridWindow: Loaded latest level '{latestLevel.name}' with language '{foundLanguage}' from EditorPrefs");
|
Debug.Log($"CrosswordGridWindow: Loaded latest level '{latestLevel.name}' with fallback language '{foundLanguage}' from EditorPrefs");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If no latest level found, check if a Level asset is selected in the project
|
// If no latest level found, check if a Level asset is selected in the project
|
||||||
if (Selection.activeObject != null)
|
if (Selection.activeObject != null)
|
||||||
@ -784,13 +806,21 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
Level selectedLevel = Selection.activeObject as Level;
|
Level selectedLevel = Selection.activeObject as Level;
|
||||||
if (selectedLevel != null)
|
if (selectedLevel != null)
|
||||||
{
|
{
|
||||||
// Try to find any available language data in the level
|
// Use the same language selection logic as the rest of the system
|
||||||
|
string languageCode = LevelEditorUtility.GetLanguageCodeForLevel(selectedLevel);
|
||||||
|
if (!string.IsNullOrEmpty(languageCode))
|
||||||
|
{
|
||||||
|
SetCurrentLevel(selectedLevel, languageCode);
|
||||||
|
Debug.Log($"CrosswordGridWindow: Loaded level '{selectedLevel.name}' with language '{languageCode}' from project selection");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback
|
||||||
string foundLanguage = FindAvailableLanguage(selectedLevel);
|
string foundLanguage = FindAvailableLanguage(selectedLevel);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(foundLanguage))
|
if (!string.IsNullOrEmpty(foundLanguage))
|
||||||
{
|
{
|
||||||
SetCurrentLevel(selectedLevel, foundLanguage);
|
SetCurrentLevel(selectedLevel, foundLanguage);
|
||||||
Debug.Log($"CrosswordGridWindow: Loaded level '{selectedLevel.name}' with language '{foundLanguage}' from project selection");
|
Debug.Log($"CrosswordGridWindow: Loaded level '{selectedLevel.name}' with fallback language '{foundLanguage}' from project selection");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -798,6 +828,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If still no level found, try to load the first available level
|
// If still no level found, try to load the first available level
|
||||||
if (_currentLevel == null)
|
if (_currentLevel == null)
|
||||||
@ -823,23 +854,30 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
private string FindAvailableLanguage(Level level)
|
private string FindAvailableLanguage(Level level)
|
||||||
{
|
{
|
||||||
if (level == null) return null;
|
if (level == null || level.languages == null || level.languages.Count == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
// Try common language codes in order of preference
|
// First, try to use the currently selected language tab (same as LevelEditorUtility.GetLanguageCodeForLevel)
|
||||||
string[] languageCodes = { "en", "eng", "english", "en-US", "en-GB", "es", "fr", "de", "ru", "zh" };
|
int selectedTabIndex = EditorPrefs.GetInt("WordsToolkit_SelectedLanguageTab", 0);
|
||||||
|
if (selectedTabIndex >= 0 && selectedTabIndex < level.languages.Count)
|
||||||
foreach (string code in languageCodes)
|
|
||||||
{
|
{
|
||||||
var languageData = level.GetLanguageData(code);
|
var selectedLanguage = level.languages[selectedTabIndex];
|
||||||
if (languageData != null)
|
if (selectedLanguage != null && !string.IsNullOrEmpty(selectedLanguage.language))
|
||||||
{
|
{
|
||||||
return code;
|
return selectedLanguage.language;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: return the first available language
|
||||||
|
for (int i = 0; i < level.languages.Count; i++)
|
||||||
|
{
|
||||||
|
var languageData = level.languages[i];
|
||||||
|
if (languageData != null && !string.IsNullOrEmpty(languageData.language))
|
||||||
|
{
|
||||||
|
return languageData.language;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no common languages found, this would require reflection or other means
|
|
||||||
// to get all available languages from the Level object
|
|
||||||
// For now, we'll return null and let the user manually specify
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -851,13 +889,21 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
Level selectedLevel = Selection.activeObject as Level;
|
Level selectedLevel = Selection.activeObject as Level;
|
||||||
if (selectedLevel != null)
|
if (selectedLevel != null)
|
||||||
{
|
{
|
||||||
// Try to find any available language data in the level
|
// Use the same language selection logic as the rest of the system
|
||||||
|
string languageCode = LevelEditorUtility.GetLanguageCodeForLevel(selectedLevel);
|
||||||
|
if (!string.IsNullOrEmpty(languageCode))
|
||||||
|
{
|
||||||
|
SetCurrentLevel(selectedLevel, languageCode);
|
||||||
|
Debug.Log($"Loaded level: {selectedLevel.name} with language: {languageCode}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback: try to find any available language data in the level
|
||||||
string foundLanguage = FindAvailableLanguage(selectedLevel);
|
string foundLanguage = FindAvailableLanguage(selectedLevel);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(foundLanguage))
|
if (!string.IsNullOrEmpty(foundLanguage))
|
||||||
{
|
{
|
||||||
SetCurrentLevel(selectedLevel, foundLanguage);
|
SetCurrentLevel(selectedLevel, foundLanguage);
|
||||||
Debug.Log($"Loaded level: {selectedLevel.name} with language: {foundLanguage}");
|
Debug.Log($"Loaded level: {selectedLevel.name} with fallback language: {foundLanguage}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -866,6 +912,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
Debug.LogWarning($"Level '{selectedLevel.name}' has no language data. Using default language 'en'.");
|
Debug.LogWarning($"Level '{selectedLevel.name}' has no language data. Using default language 'en'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.LogWarning("Selected object is not a Level asset.");
|
Debug.LogWarning("Selected object is not a Level asset.");
|
||||||
@ -1026,8 +1073,6 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
// Bind letters field (TextField with label)
|
// Bind letters field (TextField with label)
|
||||||
var lettersField = paletteRoot.Q<TextField>("letters-field");
|
var lettersField = paletteRoot.Q<TextField>("letters-field");
|
||||||
if (lettersField != null)
|
|
||||||
{
|
|
||||||
var initialValue = languageData.letters ?? "";
|
var initialValue = languageData.letters ?? "";
|
||||||
lettersField.RegisterValueChangedCallback(evt =>
|
lettersField.RegisterValueChangedCallback(evt =>
|
||||||
{
|
{
|
||||||
@ -1069,12 +1114,9 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
lettersField.value = initialValue;
|
lettersField.value = initialValue;
|
||||||
}
|
|
||||||
|
|
||||||
// Bind letters length field
|
// Bind letters length field
|
||||||
var lettersLength = paletteRoot.Q<TextField>("letters-length");
|
var lettersLength = paletteRoot.Q<TextField>("letters-length");
|
||||||
if (lettersLength != null)
|
|
||||||
{
|
|
||||||
lettersLength.value = _currentLevel.letters.ToString();
|
lettersLength.value = _currentLevel.letters.ToString();
|
||||||
lettersLength.RegisterValueChangedCallback(evt =>
|
lettersLength.RegisterValueChangedCallback(evt =>
|
||||||
{
|
{
|
||||||
@ -1085,12 +1127,18 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
EditorPrefs.SetInt("WordsToolkit_LettersAmount", value);
|
EditorPrefs.SetInt("WordsToolkit_LettersAmount", value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
var generateLettersCheck = paletteRoot.Q<Toggle>("generate-letters-check");
|
||||||
|
generateLettersCheck.value = EditorPrefs.GetBool("WordsToolkit_GenerateLetters", true);
|
||||||
|
generateLettersCheck.RegisterValueChangedCallback(evt => {
|
||||||
|
if (_currentLevel != null)
|
||||||
|
{
|
||||||
|
EditorUtility.SetDirty(_currentLevel);
|
||||||
|
EditorPrefs.SetBool("WordsToolkit_GenerateLetters", evt.newValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
// Bind generate button
|
// Bind generate button
|
||||||
var generateButton = paletteRoot.Q<Button>("generate-button");
|
var generateButton = paletteRoot.Q<Button>("generate-button");
|
||||||
if (generateButton != null)
|
|
||||||
{
|
|
||||||
generateButton.clicked += () => {
|
generateButton.clicked += () => {
|
||||||
if (_currentLevel != null && languageData != null)
|
if (_currentLevel != null && languageData != null)
|
||||||
{
|
{
|
||||||
@ -1108,7 +1156,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
|
|
||||||
var modelController = EditorScope.Resolve<IModelController>();
|
var modelController = EditorScope.Resolve<IModelController>();
|
||||||
string letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, _currentLevel.letters);
|
string letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, _currentLevel.letters, generateLettersCheck.value );
|
||||||
languageData.letters = letters;
|
languageData.letters = letters;
|
||||||
|
|
||||||
// Update the letters field in the UI
|
// Update the letters field in the UI
|
||||||
@ -1128,12 +1176,9 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
// Bind grid size controls - columns field
|
// Bind grid size controls - columns field
|
||||||
var columnsField = paletteRoot.Q<TextField>("columns-field");
|
var columnsField = paletteRoot.Q<TextField>("columns-field");
|
||||||
if (columnsField != null)
|
|
||||||
{
|
|
||||||
columnsField.value = (_previewData?.columns ?? 10).ToString();
|
columnsField.value = (_previewData?.columns ?? 10).ToString();
|
||||||
columnsField.RegisterValueChangedCallback(evt => {
|
columnsField.RegisterValueChangedCallback(evt => {
|
||||||
if (_previewData != null && int.TryParse(evt.newValue, out int value) && value >= 5 && value <= 50)
|
if (_previewData != null && int.TryParse(evt.newValue, out int value) && value >= 5 && value <= 50)
|
||||||
@ -1146,12 +1191,9 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
// Bind grid size controls - rows field
|
// Bind grid size controls - rows field
|
||||||
var rowsField = paletteRoot.Q<TextField>("rows-field");
|
var rowsField = paletteRoot.Q<TextField>("rows-field");
|
||||||
if (rowsField != null)
|
|
||||||
{
|
|
||||||
rowsField.value = (_previewData?.rows ?? 7).ToString();
|
rowsField.value = (_previewData?.rows ?? 7).ToString();
|
||||||
rowsField.RegisterValueChangedCallback(evt => {
|
rowsField.RegisterValueChangedCallback(evt => {
|
||||||
if (_previewData != null && int.TryParse(evt.newValue, out int value) && value >= 5 && value <= 50)
|
if (_previewData != null && int.TryParse(evt.newValue, out int value) && value >= 5 && value <= 50)
|
||||||
@ -1164,7 +1206,6 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
// Bind Test Level button
|
// Bind Test Level button
|
||||||
var testLevelButton = paletteRoot.Q<Button>("test-level-button");
|
var testLevelButton = paletteRoot.Q<Button>("test-level-button");
|
||||||
@ -1319,10 +1360,13 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
if (_enableEditing && _currentLevel != null)
|
if (_enableEditing && _currentLevel != null)
|
||||||
{
|
{
|
||||||
var buttonsRow = CreateLetterButtonsRow();
|
var buttonsRow = CreateLetterButtonsRow();
|
||||||
|
if (buttonsRow != null)
|
||||||
|
{
|
||||||
buttonsRow.style.alignSelf = Align.FlexEnd;
|
buttonsRow.style.alignSelf = Align.FlexEnd;
|
||||||
letterButtonsContainer.Add(buttonsRow);
|
letterButtonsContainer.Add(buttonsRow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_currentLevel == null || string.IsNullOrEmpty(_currentLanguageCode))
|
if (_currentLevel == null || string.IsNullOrEmpty(_currentLanguageCode))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -616,12 +616,16 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
if (candidate != null && candidate.isValid)
|
if (candidate != null && candidate.isValid)
|
||||||
{
|
{
|
||||||
|
// Check for problematic overlaps (both position overlaps and missing words)
|
||||||
|
bool hasProblematicOverlaps = LevelEditorServices.CheckForOverlappingWords(candidate.placements, wordsToUse);
|
||||||
|
|
||||||
// Create a string representation of the grid for uniqueness checking
|
// Create a string representation of the grid for uniqueness checking
|
||||||
string gridSignature = GridToString(candidate.grid);
|
string gridSignature = GridToString(candidate.grid);
|
||||||
|
|
||||||
// Check if this grid layout is unique and has a good word count
|
// Check if this grid layout is unique, has a good word count, and no problematic overlaps
|
||||||
if (!generatedGrids.Contains(gridSignature) &&
|
if (!generatedGrids.Contains(gridSignature) &&
|
||||||
candidate.placements.Count > bestWordCount)
|
candidate.placements.Count > bestWordCount &&
|
||||||
|
!hasProblematicOverlaps)
|
||||||
{
|
{
|
||||||
bestVariant = candidate;
|
bestVariant = candidate;
|
||||||
bestWordCount = candidate.placements.Count;
|
bestWordCount = candidate.placements.Count;
|
||||||
|
|||||||
@ -1037,6 +1037,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
// Word text field
|
// Word text field
|
||||||
var wordField = new TextField();
|
var wordField = new TextField();
|
||||||
wordField.name = "word-field";
|
wordField.name = "word-field";
|
||||||
|
wordField.isReadOnly = true;
|
||||||
wordField.style.flexGrow = 1;
|
wordField.style.flexGrow = 1;
|
||||||
wordField.style.flexShrink = 1;
|
wordField.style.flexShrink = 1;
|
||||||
wordField.style.minWidth = 100;
|
wordField.style.minWidth = 100;
|
||||||
@ -1677,7 +1678,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
if (string.IsNullOrEmpty(letters))
|
if (string.IsNullOrEmpty(letters))
|
||||||
{
|
{
|
||||||
// Generate random letters based on language if needed
|
// Generate random letters based on language if needed
|
||||||
letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, lettersAmount);
|
letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, lettersAmount, false);
|
||||||
lettersProp.stringValue = letters;
|
lettersProp.stringValue = letters;
|
||||||
serializedObject.ApplyModifiedProperties();
|
serializedObject.ApplyModifiedProperties();
|
||||||
}
|
}
|
||||||
@ -1778,7 +1779,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
private void GenerateWordsForLanguage(Level level, LanguageData languageData, IModelController Controller)
|
private void GenerateWordsForLanguage(Level level, LanguageData languageData, IModelController Controller)
|
||||||
{
|
{
|
||||||
string letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, level.letters);
|
string letters = LevelEditorServices.GenerateRandomLetters(languageData, languageData.wordsAmount, level.letters, false);
|
||||||
languageData.letters = letters;
|
languageData.letters = letters;
|
||||||
LevelEditorServices.GenerateWordsForLanguage(level, languageData, Controller, false);
|
LevelEditorServices.GenerateWordsForLanguage(level, languageData, Controller, false);
|
||||||
UpdateCrossword(level, languageData);
|
UpdateCrossword(level, languageData);
|
||||||
@ -1970,7 +1971,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
{
|
{
|
||||||
if (!AssetDatabase.IsValidFolder("Assets/WordConnectGameToolkit/Resources"))
|
if (!AssetDatabase.IsValidFolder("Assets/WordConnectGameToolkit/Resources"))
|
||||||
{
|
{
|
||||||
AssetDatabase.CreateFolder("Assets/WordsToolkit", "Resources");
|
AssetDatabase.CreateFolder("Assets/WordConnectGameToolkit", "Resources");
|
||||||
}
|
}
|
||||||
AssetDatabase.CreateFolder("Assets/WordConnectGameToolkit/Resources", "Settings");
|
AssetDatabase.CreateFolder("Assets/WordConnectGameToolkit/Resources", "Settings");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -95,7 +95,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
$"Processing language: {languageData.language}",
|
$"Processing language: {languageData.language}",
|
||||||
(float)processedLanguages / totalLanguages);
|
(float)processedLanguages / totalLanguages);
|
||||||
|
|
||||||
string letters = GenerateRandomLetters(languageData, languageData.wordsAmount, level.letters);
|
string letters = GenerateRandomLetters(languageData, languageData.wordsAmount, level.letters, false);
|
||||||
if (!string.IsNullOrEmpty(letters))
|
if (!string.IsNullOrEmpty(letters))
|
||||||
{
|
{
|
||||||
languageData.letters = letters;
|
languageData.letters = letters;
|
||||||
@ -165,10 +165,10 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
if (selectedWords.Count == 0)
|
if (selectedWords.Count == 0)
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"No valid words with {minLettersInWord} to {maxLettersInWord} letters could be generated from '{languageData.letters}' for language {languageData.language}");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug.Log($"Generated words for language {languageData.language} in level {level.number}");
|
||||||
// Shuffle the final list
|
// Shuffle the final list
|
||||||
var words = selectedWords.OrderBy(x => UnityEngine.Random.value).ToList();
|
var words = selectedWords.OrderBy(x => UnityEngine.Random.value).ToList();
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
return model.GetWordsFromSymbols(languageData.letters, languageData.language);
|
return model.GetWordsFromSymbols(languageData.letters, languageData.language);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GenerateRandomLetters(LanguageData languageData, int count, int lettersAmount)
|
public static string GenerateRandomLetters(LanguageData languageData, int count, int lettersAmount, bool generateLetters)
|
||||||
{
|
{
|
||||||
var controller = EditorScope.Resolve<IModelController>();
|
var controller = EditorScope.Resolve<IModelController>();
|
||||||
var bannedWordsService = EditorScope.Resolve<IBannedWordsService>();
|
var bannedWordsService = EditorScope.Resolve<IBannedWordsService>();
|
||||||
@ -204,6 +204,19 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 30% chance to generate actual random letters instead of finding optimal words
|
||||||
|
if (generateLetters)
|
||||||
|
{
|
||||||
|
string randomLetters = GenerateActualRandomLetters(languageData.language, lettersAmount);
|
||||||
|
|
||||||
|
// Check if these random letters can generate any words
|
||||||
|
var wordsFromRandomLetters = controller.GetWordsFromSymbols(randomLetters, languageData.language);
|
||||||
|
if (wordsFromRandomLetters != null && wordsFromRandomLetters.Count() > 0)
|
||||||
|
{
|
||||||
|
return randomLetters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var usedWords = LevelEditorServices.GetUsedWords(languageData.language);
|
var usedWords = LevelEditorServices.GetUsedWords(languageData.language);
|
||||||
|
|
||||||
// Try getting words with specified length
|
// Try getting words with specified length
|
||||||
@ -212,7 +225,18 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
// If no words found with the specified length, try with other lengths
|
// If no words found with the specified length, try with other lengths
|
||||||
if (words.Count == 0)
|
if (words.Count == 0)
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"No words with length {lettersAmount} found for language {languageData.language}. Trying other lengths...");
|
// Check if model is loaded for this language
|
||||||
|
if (!controller.IsModelLoaded(languageData.language))
|
||||||
|
{
|
||||||
|
controller.LoadModels();
|
||||||
|
|
||||||
|
// Try again after reloading
|
||||||
|
words = controller.GetWordsWithLength(lettersAmount, languageData.language).Where(w => !usedWords.Contains(w)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// If still no words found after reloading, try with other lengths
|
||||||
|
if (words.Count == 0)
|
||||||
|
{
|
||||||
// Try with smaller lengths first, then larger
|
// Try with smaller lengths first, then larger
|
||||||
for (int offset = 1; offset <= 3; offset++)
|
for (int offset = 1; offset <= 3; offset++)
|
||||||
{
|
{
|
||||||
@ -228,12 +252,11 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
if (words.Count > 0) break;
|
if (words.Count > 0) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If still no words found, use some default letters
|
// If still no words found, use some default letters
|
||||||
if (words.Count == 0)
|
if (words.Count == 0)
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"No suitable words found for language {languageData.language}. Using default letters.");
|
|
||||||
|
|
||||||
// Default letter sets by language
|
// Default letter sets by language
|
||||||
Dictionary<string, string> defaultLetters = new Dictionary<string, string>
|
Dictionary<string, string> defaultLetters = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
@ -248,7 +271,7 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return "".Substring(0, Mathf.Min(lettersAmount, 26));
|
return new string('a', lettersAmount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,7 +293,6 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
|
|
||||||
if (wordsCount >= count)
|
if (wordsCount >= count)
|
||||||
{
|
{
|
||||||
Debug.Log($"Found optimal word '{words[i]}' that can generate {wordsCount} words (excluding banned words)");
|
|
||||||
return words[i];
|
return words[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,10 +303,73 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Log($"Using best word '{bestWord}' which can generate {maxWordsGenerated} words (excluding banned words)");
|
|
||||||
return bestWord; // Return the word that generated the most derived words
|
return bestWord; // Return the word that generated the most derived words
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string GenerateActualRandomLetters(string language, int length)
|
||||||
|
{
|
||||||
|
// Define Latin languages that use vowel/consonant distinction
|
||||||
|
HashSet<string> latinLanguages = new HashSet<string> { "en", "es", "fr", "de", "it", "pt", "nl", "da", "sv", "no" };
|
||||||
|
|
||||||
|
if (latinLanguages.Contains(language))
|
||||||
|
{
|
||||||
|
// For Latin languages, use vowel/consonant distribution
|
||||||
|
string vowels = "aeiou";
|
||||||
|
string consonants = "bcdfghjklmnpqrstvwxyz";
|
||||||
|
|
||||||
|
var result = new List<char>();
|
||||||
|
int vowelCount = Mathf.Max(1, length / 2); // About 1/2 vowels
|
||||||
|
int consonantCount = length - vowelCount;
|
||||||
|
|
||||||
|
// Add vowels
|
||||||
|
for (int i = 0; i < vowelCount; i++)
|
||||||
|
{
|
||||||
|
result.Add(vowels[UnityEngine.Random.Range(0, vowels.Length)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add consonants
|
||||||
|
for (int i = 0; i < consonantCount; i++)
|
||||||
|
{
|
||||||
|
result.Add(consonants[UnityEngine.Random.Range(0, consonants.Length)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shuffle the letters
|
||||||
|
var chars = result.ToArray();
|
||||||
|
for (int i = 0; i < chars.Length; i++)
|
||||||
|
{
|
||||||
|
int randomIndex = UnityEngine.Random.Range(i, chars.Length);
|
||||||
|
(chars[i], chars[randomIndex]) = (chars[randomIndex], chars[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new string(chars);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// For non-Latin languages, use default letters without vowel distinction
|
||||||
|
Dictionary<string, string> defaultLetters = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "ru", "оеаинтсрвлкмдпуяыьгзбчйхжшюцщэфъ" },
|
||||||
|
{ "zh", "一二三四五六七八九十百千万亿" },
|
||||||
|
{ "ja", "あいうえおかきくけこさしすせそたちつてとなにぬねの" },
|
||||||
|
{ "ar", "ابتثجحخدذرزسشصضطظعغفقكلمنهوي" }
|
||||||
|
};
|
||||||
|
|
||||||
|
string letters;
|
||||||
|
if (!defaultLetters.TryGetValue(language, out letters))
|
||||||
|
{
|
||||||
|
letters = "abcdefghijklmnopqrstuvwxyz"; // Fallback to Latin alphabet
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = new List<char>();
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
result.Add(letters[UnityEngine.Random.Range(0, letters.Length)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new string(result.ToArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static List<string> GetUsedWords(string languageDataLanguage)
|
private static List<string> GetUsedWords(string languageDataLanguage)
|
||||||
{
|
{
|
||||||
// Get all levels in the project
|
// Get all levels in the project
|
||||||
@ -503,5 +588,77 @@ namespace WordsToolkit.Scripts.Levels.Editor
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for problematic overlapping words
|
||||||
|
public static bool CheckForOverlappingWords(List<WordPlacement> placements, string[] originalWords = null)
|
||||||
|
{
|
||||||
|
// Check for words starting at the same position
|
||||||
|
var sameStartGroups = placements
|
||||||
|
.GroupBy(p => p.startPosition)
|
||||||
|
.Where(g => g.Count() > 1)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
bool hasPositionOverlaps = sameStartGroups.Count > 0;
|
||||||
|
|
||||||
|
// Check for same-orientation overlaps (words that overlap along their length)
|
||||||
|
bool hasSameOrientationOverlaps = false;
|
||||||
|
for (int i = 0; i < placements.Count; i++)
|
||||||
|
{
|
||||||
|
for (int j = i + 1; j < placements.Count; j++)
|
||||||
|
{
|
||||||
|
var word1 = placements[i];
|
||||||
|
var word2 = placements[j];
|
||||||
|
|
||||||
|
// Only check words with the same orientation
|
||||||
|
if (word1.isHorizontal == word2.isHorizontal)
|
||||||
|
{
|
||||||
|
if (word1.isHorizontal)
|
||||||
|
{
|
||||||
|
// Both horizontal - check if they're on the same row and overlap
|
||||||
|
if (word1.startPosition.y == word2.startPosition.y)
|
||||||
|
{
|
||||||
|
int word1End = word1.startPosition.x + word1.word.Length - 1;
|
||||||
|
int word2End = word2.startPosition.x + word2.word.Length - 1;
|
||||||
|
|
||||||
|
// Check for overlap
|
||||||
|
bool overlaps = !(word1End < word2.startPosition.x || word2End < word1.startPosition.x);
|
||||||
|
if (overlaps)
|
||||||
|
{
|
||||||
|
hasSameOrientationOverlaps = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Both vertical - check if they're on the same column and overlap
|
||||||
|
if (word1.startPosition.x == word2.startPosition.x)
|
||||||
|
{
|
||||||
|
int word1End = word1.startPosition.y + word1.word.Length - 1;
|
||||||
|
int word2End = word2.startPosition.y + word2.word.Length - 1;
|
||||||
|
|
||||||
|
// Check for overlap
|
||||||
|
bool overlaps = !(word1End < word2.startPosition.y || word2End < word1.startPosition.y);
|
||||||
|
if (overlaps)
|
||||||
|
{
|
||||||
|
hasSameOrientationOverlaps = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasSameOrientationOverlaps) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if some words are missing from placements (indicating overlaps prevented placement)
|
||||||
|
bool hasMissingWords = false;
|
||||||
|
if (originalWords != null)
|
||||||
|
{
|
||||||
|
hasMissingWords = originalWords.Length > placements.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasPositionOverlaps || hasSameOrientationOverlaps || hasMissingWords;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4,11 +4,7 @@
|
|||||||
"references": [
|
"references": [
|
||||||
"GUID:343deaaf83e0cee4ca978e7df0b80d21",
|
"GUID:343deaaf83e0cee4ca978e7df0b80d21",
|
||||||
"GUID:d3bf71b33c0c04eb9bc1a8d6513d76bb",
|
"GUID:d3bf71b33c0c04eb9bc1a8d6513d76bb",
|
||||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc"
|
||||||
"GUID:00dd4a7ac8c24c898083910c81898ecc",
|
|
||||||
"GUID:ac6e78962cfc743b9a5fc5f5a808aa72",
|
|
||||||
"GUID:b25ad8286798741e3b2cc3883283e669",
|
|
||||||
"GUID:75bdbcf23199f4cfb86c610d1d946666"
|
|
||||||
],
|
],
|
||||||
"includePlatforms": [
|
"includePlatforms": [
|
||||||
"Editor"
|
"Editor"
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Unity.Sentis;
|
using Unity.InferenceEngine;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using ModelAsset = Unity.InferenceEngine.ModelAsset;
|
||||||
|
|
||||||
namespace WordsToolkit.Scripts.Levels
|
namespace WordsToolkit.Scripts.Levels
|
||||||
{
|
{
|
||||||
|
|||||||
@ -158,7 +158,17 @@ namespace WordsToolkit.Scripts.Localization
|
|||||||
|
|
||||||
if (Application.isEditor)
|
if (Application.isEditor)
|
||||||
{
|
{
|
||||||
return _debugSettings.TestLanguage;
|
// Use TestLanguageCode from DebugSettings and convert to SystemLanguage
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var cultureInfo = new CultureInfo(_debugSettings.TestLanguageCode);
|
||||||
|
return (SystemLanguage)Enum.Parse(typeof(SystemLanguage), cultureInfo.EnglishName);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Failed to parse TestLanguageCode '{_debugSettings.TestLanguageCode}'. Using English as fallback.");
|
||||||
|
return SystemLanguage.English;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Application.systemLanguage;
|
return Application.systemLanguage;
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using TMPro;
|
using TMPro;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -64,14 +65,24 @@ namespace WordsToolkit.Scripts.Localization
|
|||||||
SystemLanguage lang;
|
SystemLanguage lang;
|
||||||
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.LinuxEditor)
|
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.LinuxEditor)
|
||||||
{
|
{
|
||||||
lang = _debugSettings.TestLanguage;
|
// Use TestLanguageCode from DebugSettings and convert to SystemLanguage
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var cultureInfo = new CultureInfo(_debugSettings.TestLanguageCode);
|
||||||
|
lang = (SystemLanguage)Enum.Parse(typeof(SystemLanguage), cultureInfo.EnglishName);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Failed to parse TestLanguageCode '{_debugSettings.TestLanguageCode}'. Using English as fallback.");
|
||||||
|
lang = SystemLanguage.English;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lang = Application.systemLanguage;
|
lang = Application.systemLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.Any(i => i.language == lang) ? _debugSettings.TestLanguage : SystemLanguage.English;
|
return this.Any(i => i.language == lang) ? lang : SystemLanguage.English;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<LanguageObject> GetText(DebugSettings _debugSettings)
|
public IEnumerable<LanguageObject> GetText(DebugSettings _debugSettings)
|
||||||
|
|||||||
@ -3,9 +3,10 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Unity.Sentis;
|
using Unity.InferenceEngine;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Globalization;
|
||||||
using WordsToolkit.Scripts.Levels;
|
using WordsToolkit.Scripts.Levels;
|
||||||
using WordsToolkit.Scripts.Services;
|
using WordsToolkit.Scripts.Services;
|
||||||
using WordsToolkit.Scripts.Services.BannedWords;
|
using WordsToolkit.Scripts.Services.BannedWords;
|
||||||
@ -36,6 +37,32 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
// NOTE: This is now mainly for the old SaveModelBinary method - new architecture uses custom words files
|
// NOTE: This is now mainly for the old SaveModelBinary method - new architecture uses custom words files
|
||||||
private bool protectBinaryFile = false;
|
private bool protectBinaryFile = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Normalizes text by removing diacritics, accents, and converting to lowercase.
|
||||||
|
/// This allows word matching to ignore emphasis marks.
|
||||||
|
/// </summary>
|
||||||
|
private string NormalizeText(string text)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(text))
|
||||||
|
return text;
|
||||||
|
|
||||||
|
text = text.ToLower();
|
||||||
|
|
||||||
|
var normalizedString = text.Normalize(NormalizationForm.FormD);
|
||||||
|
var stringBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
foreach (var c in normalizedString)
|
||||||
|
{
|
||||||
|
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
|
||||||
|
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
|
||||||
|
{
|
||||||
|
stringBuilder.Append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsModelLoaded(string language = null)
|
public bool IsModelLoaded(string language = null)
|
||||||
{
|
{
|
||||||
language = language ?? (languageService?.GetCurrentLanguageCode() ?? m_DefaultLanguage);
|
language = language ?? (languageService?.GetCurrentLanguageCode() ?? m_DefaultLanguage);
|
||||||
@ -82,6 +109,7 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
|
|
||||||
public void LoadModels()
|
public void LoadModels()
|
||||||
{
|
{
|
||||||
|
InitializeFromConfiguration();
|
||||||
foreach (var languagePair in languageModels)
|
foreach (var languagePair in languageModels)
|
||||||
{
|
{
|
||||||
LoadModelBin(languagePair.Key, languagePair.Value);
|
LoadModelBin(languagePair.Key, languagePair.Value);
|
||||||
@ -191,29 +219,62 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
LoadCustomWordsFromBinary(language);
|
LoadCustomWordsFromBinary(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads bytes from StreamingAssets using UnityWebRequest for Android compatibility
|
||||||
|
/// </summary>
|
||||||
|
private byte[] LoadStreamingAssetBytes(string path)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||||
|
using var request = UnityEngine.Networking.UnityWebRequest.Get(path);
|
||||||
|
var operation = request.SendWebRequest();
|
||||||
|
while (!operation.isDone) { }
|
||||||
|
|
||||||
|
if (request.result == UnityEngine.Networking.UnityWebRequest.Result.Success)
|
||||||
|
{
|
||||||
|
return request.downloadHandler.data;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
#else
|
||||||
|
if (File.Exists(path))
|
||||||
|
{
|
||||||
|
return File.ReadAllBytes(path);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError($"[ModelController] Exception in LoadStreamingAssetBytes: {e.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads custom words from binary file and adds them to the existing vocabulary.
|
/// Loads custom words from binary file and adds them to the existing vocabulary.
|
||||||
/// Binary file contains ONLY custom words, not the entire model cache.
|
/// Binary file contains ONLY custom words, not the entire model cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void LoadCustomWordsFromBinary(string language)
|
private void LoadCustomWordsFromBinary(string language)
|
||||||
{
|
{
|
||||||
string path = Path.Combine(Application.dataPath, "WordsToolkit", "model",
|
string path = Path.Combine(Application.streamingAssetsPath, "WordConnectGameToolkit", "model",
|
||||||
"custom", $"{language}_custom_words.bin");
|
"custom", $"{language}_custom_words.bin");
|
||||||
|
|
||||||
if (!File.Exists(path))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wordToIndexByLanguage.ContainsKey(language))
|
if (!wordToIndexByLanguage.ContainsKey(language))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte[] fileData = LoadStreamingAssetBytes(path);
|
||||||
|
if (fileData == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
|
using var ms = new MemoryStream(fileData);
|
||||||
using var br = new BinaryReader(fs, Encoding.UTF8);
|
using var br = new BinaryReader(ms, Encoding.UTF8);
|
||||||
|
|
||||||
// Read header
|
// Read header
|
||||||
if (br.ReadInt32() != 0x43555354) // "CUST" magic number
|
if (br.ReadInt32() != 0x43555354) // "CUST" magic number
|
||||||
@ -265,9 +326,11 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string dir = Path.Combine(Application.dataPath, "WordsToolkit", "model", "custom");
|
// Create StreamingAssets folder structure
|
||||||
string path = Path.Combine(dir, $"{language}_custom_words.bin");
|
string streamingAssetsDir = Path.Combine(Application.dataPath, "StreamingAssets");
|
||||||
Directory.CreateDirectory(dir);
|
string modelDir = Path.Combine(streamingAssetsDir, "WordConnectGameToolkit", "model", "custom");
|
||||||
|
string path = Path.Combine(modelDir, $"{language}_custom_words.bin");
|
||||||
|
Directory.CreateDirectory(modelDir);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -353,7 +416,8 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
|
|
||||||
foreach (var pair in wordIndexDict)
|
foreach (var pair in wordIndexDict)
|
||||||
{
|
{
|
||||||
wordToIndex[pair.Key] = pair.Value;
|
string normalizedWord = NormalizeText(pair.Key);
|
||||||
|
wordToIndex[normalizedWord] = pair.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -379,6 +443,7 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
word = NormalizeText(word);
|
||||||
if (!wordToIndexByLanguage[language].ContainsKey(word))
|
if (!wordToIndexByLanguage[language].ContainsKey(word))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@ -413,7 +478,8 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
public bool IsWordKnown(string word, string language = null)
|
public bool IsWordKnown(string word, string language = null)
|
||||||
{
|
{
|
||||||
language = language ?? (languageService?.GetCurrentLanguageCode() ?? m_DefaultLanguage);
|
language = language ?? (languageService?.GetCurrentLanguageCode() ?? m_DefaultLanguage);
|
||||||
if (bannedWordsService.IsWordBanned(word, language))
|
string normalizedWord = NormalizeText(word);
|
||||||
|
if (bannedWordsService.IsWordBanned(normalizedWord, language))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -451,6 +517,8 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
return -1f;
|
return -1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
word1 = NormalizeText(word1);
|
||||||
|
word2 = NormalizeText(word2);
|
||||||
float[] vector1 = GetWordVector(word1, language);
|
float[] vector1 = GetWordVector(word1, language);
|
||||||
float[] vector2 = GetWordVector(word2, language);
|
float[] vector2 = GetWordVector(word2, language);
|
||||||
|
|
||||||
@ -466,10 +534,11 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
|
|
||||||
if (!IsModelLoaded(language))
|
if (!IsModelLoaded(language))
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"[ModelController] AddWord failed – model for '{language}' not loaded.");
|
Debug.LogWarning($"[ModelController] AddWord failed – model for '{language}' not loaded.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newWord = NormalizeText(newWord);
|
||||||
if (wordToIndexByLanguage[language].ContainsKey(newWord))
|
if (wordToIndexByLanguage[language].ContainsKey(newWord))
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"[ModelController] Word '{newWord}' already exists in vocab.");
|
Debug.LogWarning($"[ModelController] Word '{newWord}' already exists in vocab.");
|
||||||
@ -523,8 +592,8 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
Buffer.BlockCopy(oldBuf, 0, newBuf, 0, oldElems * sizeof(float));
|
Buffer.BlockCopy(oldBuf, 0, newBuf, 0, oldElems * sizeof(float));
|
||||||
Buffer.BlockCopy(newVector,0, newBuf, oldElems * sizeof(float), dim * sizeof(float));
|
Buffer.BlockCopy(newVector,0, newBuf, oldElems * sizeof(float), dim * sizeof(float));
|
||||||
|
|
||||||
// Sentis requires a non‑generic NativeTensorArrayFromManagedArray
|
// Inference Engine requires a non‑generic NativeTensorArrayFromManagedArray
|
||||||
// Sentis requires (Array, bytesPerElem, length, channels)
|
// Inference Engine requires (Array, bytesPerElem, length, channels)
|
||||||
// ctor args: (Array data, int srcElementOffset, int srcElementSize, int numDestElement)
|
// ctor args: (Array data, int srcElementOffset, int srcElementSize, int numDestElement)
|
||||||
var newWeights = new NativeTensorArrayFromManagedArray(
|
var newWeights = new NativeTensorArrayFromManagedArray(
|
||||||
newBuf, // managed float[]
|
newBuf, // managed float[]
|
||||||
@ -638,7 +707,7 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
if (string.IsNullOrEmpty(inputSymbols))
|
if (string.IsNullOrEmpty(inputSymbols))
|
||||||
return new List<string>();
|
return new List<string>();
|
||||||
|
|
||||||
inputSymbols = inputSymbols.ToLower();
|
inputSymbols = NormalizeText(inputSymbols);
|
||||||
Dictionary<char, int> charCounts = new Dictionary<char, int>();
|
Dictionary<char, int> charCounts = new Dictionary<char, int>();
|
||||||
foreach (char c in inputSymbols)
|
foreach (char c in inputSymbols)
|
||||||
{
|
{
|
||||||
@ -702,7 +771,8 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
if (string.IsNullOrEmpty(inputSymbols))
|
if (string.IsNullOrEmpty(inputSymbols))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var symbolSet = new HashSet<char>(inputSymbols.ToLower());
|
inputSymbols = NormalizeText(inputSymbols);
|
||||||
|
var symbolSet = new HashSet<char>(inputSymbols);
|
||||||
|
|
||||||
var bestMatches = wordToIndexByLanguage[language].Keys
|
var bestMatches = wordToIndexByLanguage[language].Keys
|
||||||
.Select(word => new {
|
.Select(word => new {
|
||||||
@ -855,7 +925,7 @@ namespace WordsToolkit.Scripts.NLP
|
|||||||
/// <param name="language">Language to clear, or null to clear all</param>
|
/// <param name="language">Language to clear, or null to clear all</param>
|
||||||
public void ClearCustomWordsCache(string language = null)
|
public void ClearCustomWordsCache(string language = null)
|
||||||
{
|
{
|
||||||
string customDir = Path.Combine(Application.dataPath, "WordsToolkit", "model", "custom");
|
string customDir = Path.Combine(Application.dataPath, "StreamingAssets", "WordConnectGameToolkit", "model", "custom");
|
||||||
|
|
||||||
if (!Directory.Exists(customDir))
|
if (!Directory.Exists(customDir))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -11,14 +11,9 @@
|
|||||||
// // THE SOFTWARE.
|
// // THE SOFTWARE.
|
||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using TMPro;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Serialization;
|
|
||||||
using WordsToolkit.Scripts.Audio;
|
|
||||||
using WordsToolkit.Scripts.Data;
|
|
||||||
using WordsToolkit.Scripts.Enums;
|
using WordsToolkit.Scripts.Enums;
|
||||||
using WordsToolkit.Scripts.GUI;
|
|
||||||
using WordsToolkit.Scripts.GUI.Labels;
|
|
||||||
using WordsToolkit.Scripts.Services;
|
|
||||||
using WordsToolkit.Scripts.Services.IAP;
|
using WordsToolkit.Scripts.Services.IAP;
|
||||||
using WordsToolkit.Scripts.Settings;
|
using WordsToolkit.Scripts.Settings;
|
||||||
using WordsToolkit.Scripts.System;
|
using WordsToolkit.Scripts.System;
|
||||||
@ -31,6 +26,8 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
private CoinsShopSettings shopSettings;
|
private CoinsShopSettings shopSettings;
|
||||||
public ProductID noAdsProduct;
|
public ProductID noAdsProduct;
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
|
public TextMeshProUGUI noAdsPriceText;
|
||||||
|
[SerializeField]
|
||||||
private AudioClip coinsSound;
|
private AudioClip coinsSound;
|
||||||
|
|
||||||
private void OnEnable()
|
private void OnEnable()
|
||||||
@ -49,11 +46,14 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
}
|
}
|
||||||
|
|
||||||
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Subscribe(PurchaseSucceded);
|
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Subscribe(PurchaseSucceded);
|
||||||
EventManager.GetEvent<(string, string)>(EGameEvent.PurchaseFailed).Subscribe(PurchaseFailed);
|
|
||||||
|
// Update NoAds price display
|
||||||
|
UpdateNoAdsPriceDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDisable()
|
protected override void OnDisable()
|
||||||
{
|
{
|
||||||
|
base.OnDisable();
|
||||||
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Unsubscribe(PurchaseSucceded);
|
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Unsubscribe(PurchaseSucceded);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,44 +86,6 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PurchaseFailed((string, string) info)
|
|
||||||
{
|
|
||||||
var productId = info.Item1;
|
|
||||||
var errorMessage = info.Item2;
|
|
||||||
|
|
||||||
var errorType = IAPErrorHelper.ParseError(errorMessage);
|
|
||||||
Debug.LogWarning($"Purchase failed for product {productId}: {errorMessage}, Error Type: {errorType}");
|
|
||||||
|
|
||||||
switch (errorType)
|
|
||||||
{
|
|
||||||
case IAPErrorType.InvalidProductID:
|
|
||||||
Debug.LogError($"Invalid product ID: {productId}");
|
|
||||||
ShowErrorMessage("Invalid product ID. Please try again later.");
|
|
||||||
break;
|
|
||||||
case IAPErrorType.UserCancelled:
|
|
||||||
Debug.LogWarning("Purchase cancelled by user.");
|
|
||||||
break;
|
|
||||||
case IAPErrorType.DuplicateTransaction:
|
|
||||||
Debug.LogWarning($"Duplicate transaction for product {productId}. This usually means the purchase was already completed.");
|
|
||||||
break;
|
|
||||||
case IAPErrorType.IAPInitFailed:
|
|
||||||
Debug.LogError("IAP initialization failed. Please check your IAP settings.");
|
|
||||||
ShowErrorMessage("IAP initialization failed. Please try again later.");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ShowErrorMessage($"Payment failed: {errorMessage}");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void ShowErrorMessage(string message)
|
|
||||||
{
|
|
||||||
var popup = menuManager.ShowPopup<MessagePopup>();
|
|
||||||
if (popup != null)
|
|
||||||
{
|
|
||||||
popup.SetMessage(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void BuyCoins(string id)
|
public void BuyCoins(string id)
|
||||||
{
|
{
|
||||||
// StopInteration();
|
// StopInteration();
|
||||||
@ -133,5 +95,17 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
iapManager.BuyProduct(id);
|
iapManager.BuyProduct(id);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateNoAdsPriceDisplay()
|
||||||
|
{
|
||||||
|
if (noAdsPriceText != null && noAdsProduct != null)
|
||||||
|
{
|
||||||
|
var localizedPrice = iapManager.GetProductLocalizedPriceString(noAdsProduct.ID);
|
||||||
|
if (!string.IsNullOrEmpty(localizedPrice))
|
||||||
|
{
|
||||||
|
noAdsPriceText.text = localizedPrice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10,6 +10,8 @@
|
|||||||
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// // THE SOFTWARE.
|
// // THE SOFTWARE.
|
||||||
|
|
||||||
|
using TMPro;
|
||||||
|
using UnityEngine;
|
||||||
using WordsToolkit.Scripts.Enums;
|
using WordsToolkit.Scripts.Enums;
|
||||||
using WordsToolkit.Scripts.GUI;
|
using WordsToolkit.Scripts.GUI;
|
||||||
using WordsToolkit.Scripts.GUI.Buttons;
|
using WordsToolkit.Scripts.GUI.Buttons;
|
||||||
@ -23,11 +25,16 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
{
|
{
|
||||||
public CustomButton removeAdsButton;
|
public CustomButton removeAdsButton;
|
||||||
public ProductID productID;
|
public ProductID productID;
|
||||||
|
[SerializeField]
|
||||||
|
public TextMeshProUGUI priceText; // Add price display UI element
|
||||||
|
|
||||||
private void OnEnable()
|
private void OnEnable()
|
||||||
{
|
{
|
||||||
removeAdsButton.onClick.AddListener(RemoveAds);
|
removeAdsButton.onClick.AddListener(RemoveAds);
|
||||||
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Subscribe(PurchaseSucceeded);
|
EventManager.GetEvent<string>(EGameEvent.PurchaseSucceeded).Subscribe(PurchaseSucceeded);
|
||||||
|
|
||||||
|
// Set localized price when popup opens
|
||||||
|
UpdatePriceDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnDisable()
|
protected override void OnDisable()
|
||||||
@ -49,5 +56,17 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
{
|
{
|
||||||
iapManager.BuyProduct(productID.ID);
|
iapManager.BuyProduct(productID.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdatePriceDisplay()
|
||||||
|
{
|
||||||
|
if (priceText != null && productID != null)
|
||||||
|
{
|
||||||
|
var localizedPrice = iapManager.GetProductLocalizedPriceString(productID.ID);
|
||||||
|
if (!string.IsNullOrEmpty(localizedPrice))
|
||||||
|
{
|
||||||
|
priceText.text = localizedPrice;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18,6 +18,7 @@ using WordsToolkit.Scripts.GUI;
|
|||||||
using WordsToolkit.Scripts.System;
|
using WordsToolkit.Scripts.System;
|
||||||
using VContainer;
|
using VContainer;
|
||||||
using WordsToolkit.Scripts.GUI.Buttons;
|
using WordsToolkit.Scripts.GUI.Buttons;
|
||||||
|
using WordsToolkit.Scripts.Services;
|
||||||
|
|
||||||
namespace WordsToolkit.Scripts.Popups
|
namespace WordsToolkit.Scripts.Popups
|
||||||
{
|
{
|
||||||
@ -26,6 +27,9 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
[SerializeField]
|
[SerializeField]
|
||||||
private CustomButton privacypolicy;
|
private CustomButton privacypolicy;
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
private CustomButton googleUMPConsent;
|
||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private Button restorePurchase;
|
private Button restorePurchase;
|
||||||
|
|
||||||
@ -38,6 +42,7 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
protected virtual void OnEnable()
|
protected virtual void OnEnable()
|
||||||
{
|
{
|
||||||
privacypolicy?.onClick.AddListener(PrivacyPolicy);
|
privacypolicy?.onClick.AddListener(PrivacyPolicy);
|
||||||
|
googleUMPConsent?.onClick.AddListener(ReconsiderGoogleUMPConsent);
|
||||||
LoadVibrationLevel();
|
LoadVibrationLevel();
|
||||||
vibrationSlider.onValueChanged.AddListener(SaveVibrationLevel);
|
vibrationSlider.onValueChanged.AddListener(SaveVibrationLevel);
|
||||||
closeButton.onClick.RemoveAllListeners();
|
closeButton.onClick.RemoveAllListeners();
|
||||||
@ -94,6 +99,14 @@ namespace WordsToolkit.Scripts.Popups
|
|||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ReconsiderGoogleUMPConsent()
|
||||||
|
{
|
||||||
|
StopInteration();
|
||||||
|
DisablePause();
|
||||||
|
adsManager.ReconsiderUMPConsent();
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
private void DisablePause()
|
private void DisablePause()
|
||||||
{
|
{
|
||||||
if (stateManager.CurrentState == EScreenStates.Game)
|
if (stateManager.CurrentState == EScreenStates.Game)
|
||||||
|
|||||||
@ -22,10 +22,11 @@ namespace WordsToolkit.Scripts.Services.Ads.AdUnits
|
|||||||
public Action<string> OnShown { get; set; }
|
public Action<string> OnShown { get; set; }
|
||||||
public Action<string> OnInitialized { get; set; }
|
public Action<string> OnInitialized { get; set; }
|
||||||
|
|
||||||
public AdUnit(string placementId, AdReference adReference)
|
public AdUnit(string placementId, AdReference adReference, AdsHandlerBase adsHandler)
|
||||||
{
|
{
|
||||||
PlacementId = placementId;
|
PlacementId = placementId;
|
||||||
AdReference = adReference;
|
AdReference = adReference;
|
||||||
|
AdsHandler = adsHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdsHandlerBase AdsHandler { get; set; }
|
public AdsHandlerBase AdsHandler { get; set; }
|
||||||
|
|||||||
@ -10,8 +10,14 @@
|
|||||||
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// // THE SOFTWARE.
|
// // THE SOFTWARE.
|
||||||
|
|
||||||
|
#if IRONSOURCE
|
||||||
|
using Unity.Services.LevelPlay;
|
||||||
|
#endif
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
||||||
|
#if UMP_AVAILABLE
|
||||||
|
using GoogleMobileAds.Ump.Api;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace WordsToolkit.Scripts.Services.Ads.Networks
|
namespace WordsToolkit.Scripts.Services.Ads.Networks
|
||||||
{
|
{
|
||||||
@ -19,14 +25,42 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
public class IronsourceAdsHandler : AdsHandlerBase
|
public class IronsourceAdsHandler : AdsHandlerBase
|
||||||
{
|
{
|
||||||
private IAdsListener _listener;
|
private IAdsListener _listener;
|
||||||
|
#if IRONSOURCE
|
||||||
|
private LevelPlayInterstitialAd _interstitialAd;
|
||||||
|
private LevelPlayRewardedAd _rewardedAd;
|
||||||
|
#endif
|
||||||
|
|
||||||
private void Init(string _id)
|
private void Init(string _id)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
IronSource.Agent.setManualLoadRewardedVideo(true);
|
LevelPlay.ValidateIntegration();
|
||||||
IronSource.Agent.validateIntegration();
|
|
||||||
IronSource.Agent.init(_id);
|
|
||||||
|
|
||||||
|
// Set consent for LevelPlay
|
||||||
|
SetConsentStatus();
|
||||||
|
|
||||||
|
// Register initialization events
|
||||||
|
LevelPlay.OnInitSuccess += SdkInitializationCompletedEvent;
|
||||||
|
LevelPlay.OnInitFailed += SdkInitializationFailedEvent;
|
||||||
|
|
||||||
|
LevelPlay.Init(_id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetConsentStatus()
|
||||||
|
{
|
||||||
|
#if IRONSOURCE && UMP_AVAILABLE
|
||||||
|
bool hasConsent = ConsentInformation.CanRequestAds();
|
||||||
|
Debug.Log($"LevelPlay consent status: {hasConsent}");
|
||||||
|
|
||||||
|
// Set consent for GDPR
|
||||||
|
LevelPlay.SetConsent(hasConsent);
|
||||||
|
|
||||||
|
// For CCPA compliance (optional)
|
||||||
|
LevelPlay.SetMetaData("do_not_sell", hasConsent ? "false" : "true");
|
||||||
|
#elif IRONSOURCE
|
||||||
|
// Default to no consent if UMP not available
|
||||||
|
LevelPlay.SetConsent(false);
|
||||||
|
Debug.Log("UMP not available - setting LevelPlay consent to false");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,78 +68,121 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
{
|
{
|
||||||
_listener = listener;
|
_listener = listener;
|
||||||
Debug.Log(_listener);
|
Debug.Log(_listener);
|
||||||
#if IRONSOURCE
|
|
||||||
//Add Rewarded Video Events
|
|
||||||
IronSourceInterstitialEvents.onAdReadyEvent += OnInterstitialAdReady;
|
|
||||||
IronSourceInterstitialEvents.onAdLoadFailedEvent += InterstitialAdLoadFailedEvent;
|
|
||||||
|
|
||||||
IronSourceRewardedVideoEvents.onAdReadyEvent += OnRewardedVideoAdReady;
|
|
||||||
IronSourceRewardedVideoEvents.onAdLoadFailedEvent += RewardedVideoAdShowFailedEvent;
|
|
||||||
IronSourceRewardedVideoEvents.onAdRewardedEvent += Rewardeded;
|
|
||||||
|
|
||||||
IronSourceEvents.onSdkInitializationCompletedEvent += SdkInitializationCompletedEvent;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
private void Rewardeded(IronSourcePlacement obj, IronSourceAdInfo ironSourceAdInfo)
|
private void SdkInitializationCompletedEvent(LevelPlayConfiguration config)
|
||||||
{
|
{
|
||||||
Debug.Log("Ironsource Rewardeded");
|
Debug.Log("LevelPlay SdkInitializationCompletedEvent");
|
||||||
_listener?.OnAdsShowComplete();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SdkInitializationCompletedEvent()
|
|
||||||
{
|
|
||||||
Debug.Log("Ironsource SdkInitializationCompletedEvent");
|
|
||||||
_listener?.OnAdsInitialized();
|
_listener?.OnAdsInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InterstitialAdLoadFailedEvent(IronSourceError obj)
|
private void SdkInitializationFailedEvent(LevelPlayInitError error)
|
||||||
{
|
{
|
||||||
Debug.Log("Ironsource InterstitialAdLoadFailedEvent " + obj.getCode() + " " + obj.getDescription());
|
Debug.Log($"LevelPlay SdkInitializationFailedEvent: {error}");
|
||||||
|
_listener?.OnInitFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interstitial event handlers
|
||||||
|
private void InterstitialAdLoadedEvent(LevelPlayAdInfo adInfo)
|
||||||
|
{
|
||||||
|
Debug.Log("LevelPlay OnInterstitialAdReady");
|
||||||
|
_listener?.OnAdsLoaded(adInfo.AdUnitId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InterstitialAdLoadFailedEvent(LevelPlayAdError error)
|
||||||
|
{
|
||||||
|
Debug.Log($"LevelPlay InterstitialAdLoadFailedEvent: {error}");
|
||||||
_listener?.OnAdsLoadFailed();
|
_listener?.OnAdsLoadFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RewardedVideoAdShowFailedEvent(IronSourceError obj)
|
private void InterstitialAdDisplayFailedEvent(LevelPlayAdInfo levelPlayAdInfo, LevelPlayAdError levelPlayAdError)
|
||||||
{
|
{
|
||||||
Debug.Log("1" + obj.getCode());
|
Debug.Log($"LevelPlay InterstitialAdDisplayFailedEvent: {levelPlayAdError}");
|
||||||
Debug.Log("2" + obj.getDescription());
|
|
||||||
Debug.Log("Ironsource RewardedVideoAdShowFailedEvent " + obj.getCode() + " " + obj.getDescription());
|
|
||||||
Debug.Log(_listener);
|
|
||||||
_listener?.OnAdsShowFailed();
|
_listener?.OnAdsShowFailed();
|
||||||
|
LevelPlay.SetPauseGame(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnRewardedVideoAdReady(IronSourceAdInfo obj)
|
#if LEVELPLAY8
|
||||||
|
private void InterstitialAdDisplayFailedEvent(LevelPlayAdDisplayInfoError obj)
|
||||||
{
|
{
|
||||||
Debug.Log("Ironsource OnRewardedVideoAdReady");
|
Debug.Log($"LevelPlay InterstitialAdDisplayFailedEvent: {obj}");
|
||||||
_listener?.OnAdsLoaded(obj.instanceId);
|
_listener?.OnAdsShowFailed();
|
||||||
}
|
LevelPlay.SetPauseGame(false);
|
||||||
|
|
||||||
private void OnInterstitialAdReady(IronSourceAdInfo obj)
|
|
||||||
{
|
|
||||||
Debug.Log("Ironsource OnInterstitialAdReady");
|
|
||||||
_listener?.OnAdsLoaded(obj.instanceId);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Rewarded video event handlers
|
||||||
|
private void RewardedAdLoadedEvent(LevelPlayAdInfo adInfo)
|
||||||
|
{
|
||||||
|
Debug.Log("LevelPlay OnRewardedVideoAdReady");
|
||||||
|
_listener?.OnAdsLoaded(adInfo.AdUnitId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RewardedAdLoadFailedEvent(LevelPlayAdError error)
|
||||||
|
{
|
||||||
|
Debug.Log($"LevelPlay RewardedVideoAdLoadFailedEvent: {error}");
|
||||||
|
_listener?.OnAdsLoadFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RewardedAdDisplayFailedEvent(LevelPlayAdInfo levelPlayAdInfo, LevelPlayAdError levelPlayAdError)
|
||||||
|
{
|
||||||
|
Debug.Log($"LevelPlay RewardedVideoAdShowFailedEvent: {levelPlayAdError}");
|
||||||
|
_listener?.OnAdsShowFailed();
|
||||||
|
LevelPlay.SetPauseGame(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LEVELPLAY8
|
||||||
|
private void RewardedAdDisplayFailedEvent(LevelPlayAdDisplayInfoError obj)
|
||||||
|
{
|
||||||
|
Debug.Log($"LevelPlay RewardedAdDisplayFailedEvent: {obj}");
|
||||||
|
_listener?.OnAdsShowFailed();
|
||||||
|
LevelPlay.SetPauseGame(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private void RewardedAdRewardedEvent(LevelPlayAdInfo adInfo, LevelPlayReward reward)
|
||||||
|
{
|
||||||
|
Debug.Log("LevelPlay Rewarded");
|
||||||
|
_listener?.OnAdsShowComplete();
|
||||||
|
LevelPlay.SetPauseGame(false);
|
||||||
|
}
|
||||||
|
private void InterstitialDisplayedEvent(LevelPlayAdInfo obj)
|
||||||
|
{
|
||||||
|
Debug.Log("LevelPlay InterstitialDisplayedEvent");
|
||||||
|
_listener?.OnAdsShowStart();
|
||||||
|
LevelPlay.SetPauseGame(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
||||||
{
|
{
|
||||||
Debug.Log("Ironsource Init");
|
Debug.Log("LevelPlay Init");
|
||||||
Init(_id);
|
Init(_id);
|
||||||
Debug.Log("Ironsource SetListener");
|
Debug.Log("LevelPlay SetListener");
|
||||||
SetListener(listener);
|
SetListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Show(AdUnit adUnit)
|
public override void Show(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Interstitial)
|
if (adUnit.AdReference.adType == EAdType.Interstitial && _interstitialAd != null)
|
||||||
{
|
{
|
||||||
IronSource.Agent.showInterstitial();
|
if (_interstitialAd.IsAdReady())
|
||||||
|
{
|
||||||
|
_interstitialAd.ShowAd();
|
||||||
|
LevelPlay.SetPauseGame(true);
|
||||||
}
|
}
|
||||||
else if (adUnit.AdReference.adType == EAdType.Rewarded)
|
}
|
||||||
|
else if (adUnit.AdReference.adType == EAdType.Rewarded && _rewardedAd != null)
|
||||||
{
|
{
|
||||||
IronSource.Agent.showRewardedVideo();
|
if (_rewardedAd.IsAdReady())
|
||||||
|
{
|
||||||
|
_rewardedAd.ShowAd();
|
||||||
|
LevelPlay.SetPauseGame(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_listener?.Show(adUnit);
|
_listener?.Show(adUnit);
|
||||||
@ -117,26 +194,43 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Interstitial)
|
if (adUnit.AdReference.adType == EAdType.Interstitial)
|
||||||
{
|
{
|
||||||
IronSource.Agent.loadInterstitial();
|
_interstitialAd = new LevelPlayInterstitialAd(adUnit.PlacementId);
|
||||||
|
|
||||||
|
_interstitialAd.OnAdLoaded += InterstitialAdLoadedEvent;
|
||||||
|
_interstitialAd.OnAdDisplayed += InterstitialDisplayedEvent;
|
||||||
|
_interstitialAd.OnAdLoadFailed += InterstitialAdLoadFailedEvent;
|
||||||
|
_interstitialAd.OnAdDisplayFailed += InterstitialAdDisplayFailedEvent;
|
||||||
|
|
||||||
|
_interstitialAd.LoadAd();
|
||||||
}
|
}
|
||||||
else if (adUnit.AdReference.adType == EAdType.Rewarded)
|
else if (adUnit.AdReference.adType == EAdType.Rewarded)
|
||||||
{
|
{
|
||||||
IronSource.Agent.loadRewardedVideo();
|
_rewardedAd = new LevelPlayRewardedAd(adUnit.PlacementId);
|
||||||
|
|
||||||
|
_rewardedAd.OnAdLoaded += RewardedAdLoadedEvent;
|
||||||
|
_rewardedAd.OnAdLoadFailed += RewardedAdLoadFailedEvent;
|
||||||
|
_rewardedAd.OnAdDisplayFailed += RewardedAdDisplayFailedEvent;
|
||||||
|
_rewardedAd.OnAdRewarded += RewardedAdRewardedEvent;
|
||||||
|
|
||||||
|
_rewardedAd.LoadAd();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override bool IsAvailable(AdUnit adUnit)
|
public override bool IsAvailable(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Interstitial)
|
if (adUnit.AdReference.adType == EAdType.Interstitial)
|
||||||
{
|
{
|
||||||
return IronSource.Agent.isInterstitialReady();
|
return _interstitialAd != null && _interstitialAd.IsAdReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adUnit.AdReference.adType == EAdType.Rewarded)
|
if (adUnit.AdReference.adType == EAdType.Rewarded)
|
||||||
{
|
{
|
||||||
return IronSource.Agent.isRewardedVideoAvailable();
|
return _rewardedAd != null && _rewardedAd.IsAdReady();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -10,6 +10,9 @@
|
|||||||
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// // THE SOFTWARE.
|
// // THE SOFTWARE.
|
||||||
|
|
||||||
|
#if IRONSOURCE
|
||||||
|
using Unity.Services.LevelPlay;
|
||||||
|
#endif
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
||||||
|
|
||||||
@ -19,65 +22,100 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
public class IronsourceBannerHandler : AdsHandlerBase
|
public class IronsourceBannerHandler : AdsHandlerBase
|
||||||
{
|
{
|
||||||
private IAdsListener _listener;
|
private IAdsListener _listener;
|
||||||
|
#if IRONSOURCE
|
||||||
|
private LevelPlayBannerAd _bannerAd;
|
||||||
|
private LevelPlayBannerAd.Config.Builder configBuilder;
|
||||||
|
#endif
|
||||||
|
|
||||||
private void Init(string _id)
|
private void Init(string _id)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
IronSource.Agent.validateIntegration();
|
LevelPlay.ValidateIntegration();
|
||||||
IronSource.Agent.init(_id);
|
LevelPlay.Init(_id);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetListener(IAdsListener listener)
|
private void SetListener(IAdsListener listener)
|
||||||
{
|
{
|
||||||
_listener = listener;
|
_listener = listener;
|
||||||
#if IRONSOURCE
|
|
||||||
IronSourceBannerEvents.onAdLoadedEvent += BannerAdLoadedEvent;
|
|
||||||
IronSourceBannerEvents.onAdLoadFailedEvent += BannerAdLoadFailedEvent;
|
|
||||||
IronSourceBannerEvents.onAdClickedEvent += BannerAdClickedEvent;
|
|
||||||
IronSourceBannerEvents.onAdScreenPresentedEvent += BannerAdScreenPresentedEvent;
|
|
||||||
IronSourceBannerEvents.onAdScreenDismissedEvent += BannerAdScreenDismissedEvent;
|
|
||||||
IronSourceBannerEvents.onAdLeftApplicationEvent += BannerAdLeftApplicationEvent;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
private void BannerAdLoadedEvent(IronSourceAdInfo adInfo)
|
private void BannerAdLoadedEvent(LevelPlayAdInfo adInfo)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner ad loaded");
|
Debug.Log("LevelPlay Banner ad loaded");
|
||||||
_listener?.OnAdsLoaded(adInfo.instanceId);
|
_listener?.OnAdsLoaded(adInfo.AdUnitId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BannerAdLoadFailedEvent(IronSourceError error)
|
private void BannerAdLoadFailedEvent(LevelPlayAdError error)
|
||||||
{
|
{
|
||||||
Debug.Log($"IronSource Banner ad load failed. Error: {error.getCode()} - {error.getDescription()}");
|
Debug.Log($"LevelPlay Banner ad load failed. Error: {error}");
|
||||||
_listener?.OnAdsLoadFailed();
|
_listener?.OnAdsLoadFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BannerAdClickedEvent(IronSourceAdInfo adInfo)
|
private void BannerAdClickedEvent(LevelPlayAdInfo adInfo)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner ad clicked");
|
Debug.Log("LevelPlay Banner ad clicked");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BannerAdScreenPresentedEvent(IronSourceAdInfo adInfo)
|
private void BannerAdDisplayedEvent(LevelPlayAdInfo adInfo)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner ad screen presented");
|
Debug.Log("LevelPlay Banner ad displayed");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BannerAdScreenDismissedEvent(IronSourceAdInfo adInfo)
|
private void BannerAdDisplayFailedEvent(LevelPlayAdInfo levelPlayAdInfo, LevelPlayAdError levelPlayAdError)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner ad screen dismissed");
|
Debug.Log($"LevelPlay Banner ad display failed. Error: {levelPlayAdError}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BannerAdLeftApplicationEvent(IronSourceAdInfo adInfo)
|
#if LEVELPLAY8
|
||||||
|
private void BannerAdDisplayFailedEvent(LevelPlayAdDisplayInfoError error)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner ad caused app to leave");
|
Debug.Log($"LevelPlay Banner ad display failed. Error: {error}");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private void BannerAdLeftApplicationEvent(LevelPlayAdInfo adInfo)
|
||||||
|
{
|
||||||
|
Debug.Log("LevelPlay Banner ad caused app to leave");
|
||||||
|
}
|
||||||
|
|
||||||
|
private LevelPlayBannerAd GetBannerAd(AdUnit adUnit)
|
||||||
|
{
|
||||||
|
configBuilder ??= new LevelPlayBannerAd.Config.Builder();
|
||||||
|
#if LEVELPLAY9
|
||||||
|
configBuilder.SetSize(LevelPlayAdSize.BANNER);
|
||||||
|
#elif LEVELPLAY8
|
||||||
|
configBuilder.SetSize(com.unity3d.mediation.LevelPlayAdSize.BANNER);
|
||||||
|
#endif
|
||||||
|
#if LEVELPLAY9
|
||||||
|
configBuilder.SetPosition(LevelPlayBannerPosition.BottomCenter);
|
||||||
|
#elif LEVELPLAY8
|
||||||
|
configBuilder.SetPosition(com.unity3d.mediation.LevelPlayBannerPosition.BottomCenter);
|
||||||
|
#endif
|
||||||
|
configBuilder.SetDisplayOnLoad(true);
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
configBuilder.SetRespectSafeArea(true); // Only relevant for Android
|
||||||
|
#endif
|
||||||
|
configBuilder.SetPlacementName("bannerPlacement");
|
||||||
|
configBuilder.SetBidFloor(1.0); // Minimum bid price in USD
|
||||||
|
var bannerConfig = configBuilder.Build();
|
||||||
|
var bannerAd = new LevelPlayBannerAd(adUnit.PlacementId, bannerConfig);
|
||||||
|
|
||||||
|
bannerAd.OnAdLoaded += BannerAdLoadedEvent;
|
||||||
|
bannerAd.OnAdLoadFailed += BannerAdLoadFailedEvent;
|
||||||
|
bannerAd.OnAdClicked += BannerAdClickedEvent;
|
||||||
|
bannerAd.OnAdDisplayed += BannerAdDisplayedEvent;
|
||||||
|
bannerAd.OnAdDisplayFailed += BannerAdDisplayFailedEvent;
|
||||||
|
bannerAd.OnAdLeftApplication += BannerAdLeftApplicationEvent;
|
||||||
|
|
||||||
|
return bannerAd;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
||||||
{
|
{
|
||||||
Debug.Log("IronSource Banner Init");
|
Debug.Log("LevelPlay Banner Init");
|
||||||
Init(_id);
|
Init(_id);
|
||||||
SetListener(listener);
|
SetListener(listener);
|
||||||
}
|
}
|
||||||
@ -85,22 +123,23 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
public override void Show(AdUnit adUnit)
|
public override void Show(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Banner)
|
if (_bannerAd == null)
|
||||||
{
|
{
|
||||||
IronSource.Agent.displayBanner();
|
_bannerAd = GetBannerAd(adUnit);
|
||||||
|
}
|
||||||
|
if (adUnit.AdReference.adType == EAdType.Banner && _bannerAd != null)
|
||||||
|
{
|
||||||
|
_bannerAd.ShowAd();
|
||||||
_listener?.Show(adUnit);
|
_listener?.Show(adUnit);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void Load(AdUnit adUnit)
|
public override void Load(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Banner)
|
_bannerAd.LoadAd();
|
||||||
{
|
|
||||||
IronSourceBannerSize bannerSize = IronSourceBannerSize.BANNER;
|
|
||||||
IronSource.Agent.loadBanner(bannerSize, IronSourceBannerPosition.BOTTOM);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,9 +153,9 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
public override void Hide(AdUnit adUnit)
|
public override void Hide(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
#if IRONSOURCE
|
#if IRONSOURCE
|
||||||
if (adUnit.AdReference.adType == EAdType.Banner)
|
if (adUnit.AdReference.adType == EAdType.Banner && _bannerAd != null)
|
||||||
{
|
{
|
||||||
IronSource.Agent.hideBanner();
|
_bannerAd.HideAd();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 655355652c9a644febf26cd1a5869bf4
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "CandySmith.LevelPlay",
|
||||||
|
"rootNamespace": "",
|
||||||
|
"references": [
|
||||||
|
"GUID:00dd4a7ac8c24c898083910c81898ecc",
|
||||||
|
"GUID:760a4c7888534400e882b82c5b3fba06"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [
|
||||||
|
{
|
||||||
|
"name": "com.unity.services.levelplay",
|
||||||
|
"expression": "[0.0,9.0)",
|
||||||
|
"define": "LEVELPLAY8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com.unity.services.levelplay",
|
||||||
|
"expression": "9.0.0",
|
||||||
|
"define": "LEVELPLAY9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com.unity.services.levelplay",
|
||||||
|
"expression": "",
|
||||||
|
"define": "IRONSOURCE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 537e7a60660d24526a2d6a89f5f68492
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -12,7 +12,9 @@
|
|||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
||||||
|
#if UMP_AVAILABLE
|
||||||
|
using GoogleMobileAds.Ump.Api;
|
||||||
|
#endif
|
||||||
namespace WordsToolkit.Scripts.Services.Ads.Networks
|
namespace WordsToolkit.Scripts.Services.Ads.Networks
|
||||||
{
|
{
|
||||||
#if UNITY_ADS
|
#if UNITY_ADS
|
||||||
@ -28,10 +30,33 @@ namespace WordsToolkit.Scripts.Services.Ads.Networks
|
|||||||
|
|
||||||
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
public override void Init(string _id, bool adSettingTestMode, IAdsListener listener)
|
||||||
{
|
{
|
||||||
|
SetConsentStatus();
|
||||||
Advertisement.Initialize(_id, adSettingTestMode, this);
|
Advertisement.Initialize(_id, adSettingTestMode, this);
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetConsentStatus()
|
||||||
|
{
|
||||||
|
#if UNITY_ADS && UMP_AVAILABLE
|
||||||
|
bool hasConsent = ConsentInformation.CanRequestAds();
|
||||||
|
Debug.Log($"Unity Ads consent status: {hasConsent}");
|
||||||
|
|
||||||
|
var consentMetaData = new MetaData("gdpr");
|
||||||
|
consentMetaData.Set("consent", hasConsent);
|
||||||
|
Advertisement.SetMetaData(consentMetaData);
|
||||||
|
|
||||||
|
var privacyMetaData = new MetaData("privacy");
|
||||||
|
privacyMetaData.Set("mode", "mixed");
|
||||||
|
Advertisement.SetMetaData(privacyMetaData);
|
||||||
|
#elif UNITY_ADS
|
||||||
|
// Default to no consent if UMP not available
|
||||||
|
var consentMetaData = new MetaData("gdpr");
|
||||||
|
consentMetaData.Set("consent", false);
|
||||||
|
Advertisement.SetMetaData(consentMetaData);
|
||||||
|
Debug.Log("UMP not available - setting Unity Ads consent to false");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
public override void Show(AdUnit adUnit)
|
public override void Show(AdUnit adUnit)
|
||||||
{
|
{
|
||||||
Advertisement.Show(adUnit.PlacementId, this);
|
Advertisement.Show(adUnit.PlacementId, this);
|
||||||
|
|||||||
@ -12,14 +12,19 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using VContainer;
|
using VContainer;
|
||||||
|
using WordConnectGameToolkit.Scripts.Settings;
|
||||||
using WordsToolkit.Scripts.Popups;
|
using WordsToolkit.Scripts.Popups;
|
||||||
using WordsToolkit.Scripts.Services.Ads;
|
using WordsToolkit.Scripts.Services.Ads;
|
||||||
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
using WordsToolkit.Scripts.Services.Ads.AdUnits;
|
||||||
using WordsToolkit.Scripts.Services.IAP;
|
using WordsToolkit.Scripts.Services.IAP;
|
||||||
using WordsToolkit.Scripts.Settings;
|
using WordsToolkit.Scripts.Settings;
|
||||||
using WordsToolkit.Scripts.System;
|
using WordsToolkit.Scripts.System;
|
||||||
|
#if UMP_AVAILABLE
|
||||||
|
using GoogleMobileAds.Ump.Api;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace WordsToolkit.Scripts.Services
|
namespace WordsToolkit.Scripts.Services
|
||||||
{
|
{
|
||||||
@ -29,6 +34,8 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
private readonly List<AdUnit> adUnits = new();
|
private readonly List<AdUnit> adUnits = new();
|
||||||
private readonly Dictionary<AdUnit, IAdLifecycleManager> lifecycleManagers = new();
|
private readonly Dictionary<AdUnit, IAdLifecycleManager> lifecycleManagers = new();
|
||||||
private EPlatforms platforms;
|
private EPlatforms platforms;
|
||||||
|
private bool consentInfoUpdateInProgress = false;
|
||||||
|
private bool adsInitialized = false;
|
||||||
|
|
||||||
[Inject]
|
[Inject]
|
||||||
private GameSettings gameSettings;
|
private GameSettings gameSettings;
|
||||||
@ -38,6 +45,8 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private ProductID noAdsProduct;
|
private ProductID noAdsProduct;
|
||||||
|
private InterstitialSettings interstitialSettings;
|
||||||
|
private AdSetting[] adElements;
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
@ -45,9 +54,86 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
interstitialSettings = Resources.Load<InterstitialSettings>("Settings/AdsInterstitialSettings");
|
||||||
|
adElements = Resources.Load<AdsSettings>("Settings/AdsSettings").adProfiles;
|
||||||
|
StartConsentFlow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartConsentFlow()
|
||||||
|
{
|
||||||
|
if (consentInfoUpdateInProgress) return;
|
||||||
|
|
||||||
|
consentInfoUpdateInProgress = true;
|
||||||
|
|
||||||
|
#if UMP_AVAILABLE && (UNITY_ANDROID || UNITY_IOS)
|
||||||
|
var request = new ConsentRequestParameters();
|
||||||
|
|
||||||
|
if (Debug.isDebugBuild || Application.isEditor)
|
||||||
|
{
|
||||||
|
var debugSettings = new ConsentDebugSettings
|
||||||
|
{
|
||||||
|
DebugGeography = DebugGeography.EEA
|
||||||
|
};
|
||||||
|
|
||||||
|
var testDeviceIds = new List<string>();
|
||||||
|
// testDeviceIds.Add("YOUR-TEST-DEVICE-ID-HERE"); // Uncomment and add your device ID if needed
|
||||||
|
|
||||||
|
if (testDeviceIds.Count > 0)
|
||||||
|
{
|
||||||
|
debugSettings.TestDeviceHashedIds = testDeviceIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
request.ConsentDebugSettings = debugSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConsentInformation.Update(request, OnConsentInfoUpdated);
|
||||||
|
#else
|
||||||
|
InitializeAds();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UMP_AVAILABLE
|
||||||
|
private void OnConsentInfoUpdated(FormError consentError)
|
||||||
|
{
|
||||||
|
consentInfoUpdateInProgress = false;
|
||||||
|
|
||||||
|
if (consentError != null)
|
||||||
|
{
|
||||||
|
Debug.LogError($"Consent info update failed: {consentError}");
|
||||||
|
InitializeAds();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConsentForm.LoadAndShowConsentFormIfRequired(OnConsentFormDismissed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnConsentFormDismissed(FormError formError)
|
||||||
|
{
|
||||||
|
if (formError != null)
|
||||||
|
{
|
||||||
|
Debug.LogError($"Consent form error: {formError}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ConsentInformation.CanRequestAds())
|
||||||
|
{
|
||||||
|
InitializeAds();
|
||||||
|
RefreshBannerAds();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("User denied consent or consent not available");
|
||||||
|
InitializeAds();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private void InitializeAds()
|
||||||
|
{
|
||||||
|
if (adsInitialized) return;
|
||||||
|
adsInitialized = true;
|
||||||
|
|
||||||
|
|
||||||
platforms = GetPlatform();
|
platforms = GetPlatform();
|
||||||
var adElements = Resources.Load<AdsSettings>("Settings/AdsSettings").adProfiles;
|
|
||||||
foreach (var t in adElements)
|
foreach (var t in adElements)
|
||||||
{
|
{
|
||||||
if (t.platforms == platforms && t.enable)
|
if (t.platforms == platforms && t.enable)
|
||||||
@ -60,7 +146,7 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
adList.Add(t);
|
adList.Add(t);
|
||||||
foreach (var adElement in t.adElements)
|
foreach (var adElement in t.adElements)
|
||||||
{
|
{
|
||||||
var adUnit = new AdUnit(adElement.placementId, adElement.adReference);
|
var adUnit = new AdUnit(adElement.placementId, adElement.adReference, t.adsHandler);
|
||||||
var lifecycleManager = new AdLifecycleManager(t.adsHandler);
|
var lifecycleManager = new AdLifecycleManager(t.adsHandler);
|
||||||
lifecycleManagers[adUnit] = lifecycleManager;
|
lifecycleManagers[adUnit] = lifecycleManager;
|
||||||
adUnits.Add(adUnit);
|
adUnits.Add(adUnit);
|
||||||
@ -119,26 +205,72 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
|
|
||||||
private void OnPopupTrigger(Popup popup, bool open)
|
private void OnPopupTrigger(Popup popup, bool open)
|
||||||
{
|
{
|
||||||
if (IsNoAdsPurchased())
|
if (IsNoAdsPurchased() || !CanShowAds())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get current level number
|
||||||
|
int currentLevel = GameDataManager.GetLevelNum();
|
||||||
|
|
||||||
|
// Check interstitial ads using InterstitialSettings
|
||||||
|
if (interstitialSettings != null && interstitialSettings.interstitials != null)
|
||||||
|
{
|
||||||
|
foreach (var interstitialElement in interstitialSettings.interstitials)
|
||||||
|
{
|
||||||
|
// Check if this interstitial should trigger based on popup
|
||||||
|
if (((open && interstitialElement.showOnOpen) || (!open && interstitialElement.showOnClose))
|
||||||
|
&& popup.GetType() == interstitialElement.popup.GetType())
|
||||||
|
{
|
||||||
|
var adUnit = adUnits.Find(i => i.AdReference == interstitialElement.adReference);
|
||||||
|
if (adUnit == null || !adUnit.IsAvailable())
|
||||||
|
{
|
||||||
|
adUnit?.Load();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check level conditions
|
||||||
|
if (!IsLevelConditionMet(currentLevel, interstitialElement))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find placement ID for frequency tracking
|
||||||
|
string placementId = GetPlacementIdForAdReference(interstitialElement.adReference);
|
||||||
|
if (placementId == null) continue;
|
||||||
|
|
||||||
|
if (!IsFrequencyConditionMet(placementId, interstitialElement.frequency))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
adUnit.Show();
|
||||||
|
adUnit.Load();
|
||||||
|
IncrementAdFrequency(placementId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle non-interstitial ads (banners, rewarded) using the original logic
|
||||||
foreach (var ad in adList)
|
foreach (var ad in adList)
|
||||||
{
|
{
|
||||||
foreach (var adElement in ad.adElements)
|
foreach (var adElement in ad.adElements)
|
||||||
{
|
{
|
||||||
|
if (adElement.adReference.adType == EAdType.Interstitial)
|
||||||
|
continue; // Skip interstitials as they're handled above
|
||||||
|
|
||||||
var adUnit = adUnits.Find(i => i.AdReference == adElement.adReference);
|
var adUnit = adUnits.Find(i => i.AdReference == adElement.adReference);
|
||||||
if (!lifecycleManagers[adUnit].IsAvailable(adUnit))
|
if (!adUnit.IsAvailable())
|
||||||
{
|
{
|
||||||
lifecycleManagers[adUnit].Load(adUnit);
|
adUnit.Load();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((open && adElement.popup.showOnOpen) || (!open && adElement.popup.showOnClose)) && popup.GetType() == adElement.popup.popup.GetType())
|
if (((open && adElement.popup.showOnOpen) || (!open && adElement.popup.showOnClose)) && popup.GetType() == adElement.popup.popup.GetType())
|
||||||
{
|
{
|
||||||
lifecycleManagers[adUnit].Show(adUnit);
|
adUnit.Show();
|
||||||
lifecycleManagers[adUnit].Load(adUnit);
|
adUnit.Load();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -152,19 +284,48 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
|
|
||||||
public void ShowAdByType(AdReference adRef, Action<string> shown)
|
public void ShowAdByType(AdReference adRef, Action<string> shown)
|
||||||
{
|
{
|
||||||
if (!gameSettings.enableAds)
|
if (!gameSettings.enableAds || !CanShowAds())
|
||||||
{
|
{
|
||||||
shown?.Invoke(null);
|
shown?.Invoke(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int currentLevel = GameDataManager.GetLevelNum();
|
||||||
|
|
||||||
foreach (var adUnit in adUnits)
|
foreach (var adUnit in adUnits)
|
||||||
{
|
{
|
||||||
if (adUnit.AdReference == adRef && lifecycleManagers[adUnit].IsAvailable(adUnit))
|
if (adUnit.AdReference == adRef && adUnit.IsAvailable())
|
||||||
{
|
{
|
||||||
|
// Check level conditions for interstitial ads using InterstitialSettings
|
||||||
|
if (adRef.adType == EAdType.Interstitial && interstitialSettings != null)
|
||||||
|
{
|
||||||
|
var interstitialElement = interstitialSettings.interstitials?.FirstOrDefault(i => i.adReference == adRef);
|
||||||
|
if (interstitialElement != null)
|
||||||
|
{
|
||||||
|
if (!IsLevelConditionMet(currentLevel, interstitialElement))
|
||||||
|
{
|
||||||
|
shown?.Invoke(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string placementId = GetPlacementIdForAdReference(adRef);
|
||||||
|
if (placementId != null)
|
||||||
|
{
|
||||||
|
if (!IsFrequencyConditionMet(placementId, interstitialElement.frequency))
|
||||||
|
{
|
||||||
|
shown?.Invoke(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment frequency counter
|
||||||
|
IncrementAdFrequency(placementId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
adUnit.OnShown = shown;
|
adUnit.OnShown = shown;
|
||||||
lifecycleManagers[adUnit].Show(adUnit);
|
adUnit.Show();
|
||||||
lifecycleManagers[adUnit].Load(adUnit);
|
adUnit.Load();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,5 +354,70 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool IsLevelConditionMet(int currentLevel, InterstitialAdElement popupSetting)
|
||||||
|
{
|
||||||
|
return currentLevel >= popupSetting.minLevel && currentLevel <= popupSetting.maxLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsFrequencyConditionMet(string placementId, int frequency)
|
||||||
|
{
|
||||||
|
if (frequency <= 1) return true; // Always show if frequency is 1 or less
|
||||||
|
|
||||||
|
int adShowCount = PlayerPrefs.GetInt($"AdCount_{placementId}", 0);
|
||||||
|
return adShowCount % frequency == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void IncrementAdFrequency(string placementId)
|
||||||
|
{
|
||||||
|
int currentCount = PlayerPrefs.GetInt($"AdCount_{placementId}", 0);
|
||||||
|
PlayerPrefs.SetInt($"AdCount_{placementId}", currentCount + 1);
|
||||||
|
PlayerPrefs.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetPlacementIdForAdReference(AdReference adRef)
|
||||||
|
{
|
||||||
|
foreach (var ad in adList)
|
||||||
|
{
|
||||||
|
foreach (var adElement in ad.adElements)
|
||||||
|
{
|
||||||
|
if (adElement.adReference == adRef)
|
||||||
|
{
|
||||||
|
return adElement.placementId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CanShowAds()
|
||||||
|
{
|
||||||
|
#if UMP_AVAILABLE
|
||||||
|
return ConsentInformation.CanRequestAds();
|
||||||
|
#else
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RefreshBannerAds()
|
||||||
|
{
|
||||||
|
if (!CanShowAds() || IsNoAdsPurchased()) return;
|
||||||
|
|
||||||
|
foreach (var adUnit in adUnits)
|
||||||
|
{
|
||||||
|
if (adUnit.AdReference.adType == EAdType.Banner)
|
||||||
|
{
|
||||||
|
lifecycleManagers[adUnit].Show(adUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReconsiderUMPConsent()
|
||||||
|
{
|
||||||
|
#if UMP_AVAILABLE && (UNITY_ANDROID || UNITY_IOS)
|
||||||
|
ConsentInformation.Reset();
|
||||||
|
#endif
|
||||||
|
StartConsentFlow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,7 +25,6 @@ namespace WordsToolkit.Scripts.Services.IAP
|
|||||||
private IExtensionProvider extensionProvider;
|
private IExtensionProvider extensionProvider;
|
||||||
|
|
||||||
public static event Action<string> OnSuccessfulPurchase;
|
public static event Action<string> OnSuccessfulPurchase;
|
||||||
public static event Action<(string,string)> OnFailedPurchase;
|
|
||||||
public static event Action<bool, List<string>> OnRestorePurchasesFinished;
|
public static event Action<bool, List<string>> OnRestorePurchasesFinished;
|
||||||
|
|
||||||
public void InitializePurchasing(IEnumerable<(string productId, ProductTypeWrapper.ProductType productType)> products)
|
public void InitializePurchasing(IEnumerable<(string productId, ProductTypeWrapper.ProductType productType)> products)
|
||||||
@ -112,24 +111,20 @@ namespace WordsToolkit.Scripts.Services.IAP
|
|||||||
{
|
{
|
||||||
Debug.Log(string.Format("Purchasing product asychronously: '{0}'", product.definition.id));
|
Debug.Log(string.Format("Purchasing product asychronously: '{0}'", product.definition.id));
|
||||||
storeController.InitiatePurchase(product);
|
storeController.InitiatePurchase(product);
|
||||||
OnFailedPurchase?.Invoke((productId, "Product not found or not available for purchase.")); // debug only
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Log($"BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase {productId}");
|
Debug.Log($"BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase {productId}");
|
||||||
OnFailedPurchase?.Invoke((productId, "InvalidProductID: product not found or not available for purchase."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Log("IAPInitFailed: BuyProductID FAIL. Not initialized.");
|
Debug.Log("BuyProductID FAIL. Not initialized.");
|
||||||
OnFailedPurchase?.Invoke((productId, "IAPInitFailed: Not initialized."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Log("BuyProductID: FAIL. Exception during purchase. " + e);
|
Debug.Log("BuyProductID: FAIL. Exception during purchase. " + e);
|
||||||
OnFailedPurchase?.Invoke((productId, "Exception during purchase: " + e.Message));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,13 +159,11 @@ namespace WordsToolkit.Scripts.Services.IAP
|
|||||||
public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
|
public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
|
||||||
{
|
{
|
||||||
Debug.Log("OnPurchaseFailed: FAIL. Product: " + product.definition.id + " PurchaseFailureDescription: " + failureDescription);
|
Debug.Log("OnPurchaseFailed: FAIL. Product: " + product.definition.id + " PurchaseFailureDescription: " + failureDescription);
|
||||||
OnFailedPurchase?.Invoke((product.definition.id, failureDescription.message));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnPurchaseFailed(Product i, PurchaseFailureReason p)
|
public void OnPurchaseFailed(Product i, PurchaseFailureReason p)
|
||||||
{
|
{
|
||||||
Debug.Log($"OnPurchaseFailed: FAIL. Product: '{i.definition.id}', PurchaseFailureReason: {p}");
|
Debug.Log($"OnPurchaseFailed: FAIL. Product: '{i.definition.id}', PurchaseFailureReason: {p}");
|
||||||
OnFailedPurchase?.Invoke((i.definition.id, p.ToString()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnInitializeFailed(InitializationFailureReason reason)
|
public void OnInitializeFailed(InitializationFailureReason reason)
|
||||||
|
|||||||
@ -50,12 +50,6 @@ namespace WordsToolkit.Scripts.Services.IAP
|
|||||||
IAPController.OnSuccessfulPurchase += purchaseHandler;
|
IAPController.OnSuccessfulPurchase += purchaseHandler;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
public void SubscribeToPurchaseFailedEvent(Action<(string, string)> purchaseHandler)
|
|
||||||
{
|
|
||||||
#if UNITY_PURCHASING
|
|
||||||
IAPController.OnFailedPurchase += purchaseHandler;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UnsubscribeFromPurchaseEvent(Action<string> purchaseHandler)
|
public void UnsubscribeFromPurchaseEvent(Action<string> purchaseHandler)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -13,8 +13,6 @@ namespace WordsToolkit.Scripts.Services.IAP
|
|||||||
bool IsProductPurchased(string productId);
|
bool IsProductPurchased(string productId);
|
||||||
void RestorePurchases(Action<bool, List<string>> action);
|
void RestorePurchases(Action<bool, List<string>> action);
|
||||||
void SubscribeToPurchaseEvent(Action<string> purchaseHandler);
|
void SubscribeToPurchaseEvent(Action<string> purchaseHandler);
|
||||||
|
|
||||||
void SubscribeToPurchaseFailedEvent(Action<(string, string)> purchaseHandler);
|
|
||||||
void UnsubscribeFromPurchaseEvent(Action<string> purchaseHandler);
|
void UnsubscribeFromPurchaseEvent(Action<string> purchaseHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -21,5 +21,6 @@ namespace WordsToolkit.Scripts.Services
|
|||||||
bool IsRewardedAvailable(AdReference adRef);
|
bool IsRewardedAvailable(AdReference adRef);
|
||||||
void RemoveAds();
|
void RemoveAds();
|
||||||
bool IsNoAdsPurchased();
|
bool IsNoAdsPurchased();
|
||||||
|
void ReconsiderUMPConsent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem;
|
||||||
|
using WordsToolkit.Scripts.Levels;
|
||||||
|
|
||||||
namespace WordsToolkit.Scripts.Settings
|
namespace WordsToolkit.Scripts.Settings
|
||||||
{
|
{
|
||||||
@ -36,7 +37,30 @@ namespace WordsToolkit.Scripts.Settings
|
|||||||
public Key SimulateDuplicate = Key.D;
|
public Key SimulateDuplicate = Key.D;
|
||||||
|
|
||||||
[Header("")]
|
[Header("")]
|
||||||
[Tooltip("Test language, only for editor")]
|
[Tooltip("Test language code, only for editor (e.g., 'en', 'fr', 'es')")]
|
||||||
public SystemLanguage TestLanguage = SystemLanguage.English;
|
[HideInInspector] // Hidden because we use custom editor dropdown
|
||||||
|
public string TestLanguageCode = "en";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Validates if the TestLanguageCode exists in the provided LanguageConfiguration
|
||||||
|
/// </summary>
|
||||||
|
public bool IsValidTestLanguage(LanguageConfiguration config)
|
||||||
|
{
|
||||||
|
if (config == null || string.IsNullOrEmpty(TestLanguageCode))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return config.GetLanguageInfo(TestLanguageCode) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a valid test language code, falling back to default if current one is invalid
|
||||||
|
/// </summary>
|
||||||
|
public string GetValidTestLanguageCode(LanguageConfiguration config)
|
||||||
|
{
|
||||||
|
if (IsValidTestLanguage(config))
|
||||||
|
return TestLanguageCode;
|
||||||
|
|
||||||
|
return config?.defaultLanguage ?? "en";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user