Merge branch 'feature/本地化正式' into 'develop'

feat: 火山玩法本地化

See merge request aibis-dream/aibis-dream!821
This commit is contained in:
2026-07-29 15:37:19 +00:00
157 changed files with 4994 additions and 1424 deletions
@@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: 09546aca93a801441859af2a811fe53b
m_currentHash:
serializedVersion: 2
Hash: e92b9b9776d0601449874b8c1b0ed1ae
Hash: ae2a22805ec7ff55174c38995aa3e54d
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0
m_BundleLocalCatalog: 0
@@ -68,6 +68,9 @@ MonoBehaviour:
- {fileID: 11400000, guid: af94af36950b08d4f9a5037546bbe040, type: 2}
- {fileID: 11400000, guid: 60fd2fd8c7094b242b01c63de65de9ea, type: 2}
- {fileID: 11400000, guid: 7e4ab0de168458b43a21dc2f9e811ff5, type: 2}
- {fileID: 11400000, guid: 089fc86f714d6a94bafea3b117fbd639, type: 2}
- {fileID: 11400000, guid: 1c592abe924a856439461f3785ec53da, type: 2}
- {fileID: 11400000, guid: 26fd03652560e7f4abec092229fc38f2, type: 2}
m_BuildSettings:
m_CompileScriptsInVirtualMode: 0
m_CleanupStreamingAssetsAfterBuilds: 1
@@ -115,6 +118,9 @@ MonoBehaviour:
- Locale-zh-Hans
- SceneSO
- Locale-ja-JP
- Locale-pt-BR
- Locale-ru
- Locale-es
m_SchemaTemplates: []
m_GroupTemplateObjects:
- {fileID: 11400000, guid: 0c158052680a3e94184c450d00291514, type: 2}
@@ -35,6 +35,24 @@ MonoBehaviour:
m_SerializedLabels:
- Locale
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 9b1581a48f0ca11448dbddaf79c11252
m_Address: Russian (ru)
m_ReadOnly: 1
m_SerializedLabels:
- Locale
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 3cadb0d5f8bf5e64599f52e139f7e3cc
m_Address: Spanish (es)
m_ReadOnly: 1
m_SerializedLabels:
- Locale
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: d0c46f4777ac92249a43143a15892fd2
m_Address: Portuguese (Brazil) (pt-BR)
m_ReadOnly: 1
m_SerializedLabels:
- Locale
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 1
m_Settings: {fileID: 11400000, guid: 77169ce22e430f64fb36c771815a4a7b, type: 2}
m_SchemaSet:
@@ -0,0 +1,43 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: Localization-String-Tables-Portuguese (Brazil) (pt-BR)
m_EditorClassIdentifier:
m_GroupName: Localization-String-Tables-Portuguese (Brazil) (pt-BR)
m_Data:
m_SerializedData: []
m_GUID: 67ced675275774640b77e0ded8750379
m_SerializeEntries:
- m_GUID: 63300a11309a7b34bbf7a345b123cab8
m_Address: ChapterInfo_pt-BR
m_ReadOnly: 1
m_SerializedLabels:
- Locale-pt-BR
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 6ad3c9298dbc3b642b1251ffc306eaa6
m_Address: Params_pt-BR
m_ReadOnly: 1
m_SerializedLabels:
- Locale-pt-BR
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7d496f91e240bb143b62a6239c817d09
m_Address: UIText_pt-BR
m_ReadOnly: 1
m_SerializedLabels:
- Locale-pt-BR
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 1
m_Settings: {fileID: 11400000, guid: 77169ce22e430f64fb36c771815a4a7b, type: 2}
m_SchemaSet:
m_Schemas:
- {fileID: 11400000, guid: b430e9b782d3119489b903dce4915542, type: 2}
- {fileID: 11400000, guid: 70748601b27158b47810538f6ed1c013, type: 2}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 089fc86f714d6a94bafea3b117fbd639
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,43 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: Localization-String-Tables-Russian (ru)
m_EditorClassIdentifier:
m_GroupName: Localization-String-Tables-Russian (ru)
m_Data:
m_SerializedData: []
m_GUID: c1e47d7d0d831ac4b881f19aa2bf17e0
m_SerializeEntries:
- m_GUID: c69caec2066296840887d7e0c2eff52e
m_Address: ChapterInfo_ru
m_ReadOnly: 1
m_SerializedLabels:
- Locale-ru
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: b91f4281442d2b54f92fbecb5bd56426
m_Address: Params_ru
m_ReadOnly: 1
m_SerializedLabels:
- Locale-ru
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: f679069e455200841a92c27186383940
m_Address: UIText_ru
m_ReadOnly: 1
m_SerializedLabels:
- Locale-ru
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 1
m_Settings: {fileID: 11400000, guid: 77169ce22e430f64fb36c771815a4a7b, type: 2}
m_SchemaSet:
m_Schemas:
- {fileID: 11400000, guid: b251ae14d0b273843b5674d239daa31c, type: 2}
- {fileID: 11400000, guid: 808fc72235ececa47aa55960a94a9a9a, type: 2}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1c592abe924a856439461f3785ec53da
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,43 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: Localization-String-Tables-Spanish (es)
m_EditorClassIdentifier:
m_GroupName: Localization-String-Tables-Spanish (es)
m_Data:
m_SerializedData: []
m_GUID: c8471b00dabdd224ab9c17d71d951cbc
m_SerializeEntries:
- m_GUID: 728457f9c2ef69c489530047d495eca5
m_Address: ChapterInfo_es
m_ReadOnly: 1
m_SerializedLabels:
- Locale-es
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 1edf9254b97981643bdecd6d22ed1150
m_Address: Params_es
m_ReadOnly: 1
m_SerializedLabels:
- Locale-es
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 380c27123212d66468aa1f3ed3bf72ea
m_Address: UIText_es
m_ReadOnly: 1
m_SerializedLabels:
- Locale-es
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 1
m_Settings: {fileID: 11400000, guid: 77169ce22e430f64fb36c771815a4a7b, type: 2}
m_SchemaSet:
m_Schemas:
- {fileID: 11400000, guid: 3ddf5f47a1b265049825b193e7e93fbd, type: 2}
- {fileID: 11400000, guid: 3e5e5c2400a39814994a9fcb8eaf49a6, type: 2}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 26fd03652560e7f4abec092229fc38f2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,45 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: Localization-String-Tables-Portuguese (Brazil) (pt-BR)_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 089fc86f714d6a94bafea3b117fbd639, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2ae6a7549097a9b4caefe44b61b1fcc5
m_LoadPath:
m_Id: 631ec5c677ab8084fb9be9b9ee39c6ef
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 1
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b430e9b782d3119489b903dce4915542
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: Localization-String-Tables-Portuguese (Brazil) (pt-BR)_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 089fc86f714d6a94bafea3b117fbd639, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 70748601b27158b47810538f6ed1c013
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,45 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: Localization-String-Tables-Russian (ru)_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 1c592abe924a856439461f3785ec53da, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2ae6a7549097a9b4caefe44b61b1fcc5
m_LoadPath:
m_Id: 631ec5c677ab8084fb9be9b9ee39c6ef
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 1
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b251ae14d0b273843b5674d239daa31c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: Localization-String-Tables-Russian (ru)_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 1c592abe924a856439461f3785ec53da, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 808fc72235ececa47aa55960a94a9a9a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,45 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: Localization-String-Tables-Spanish (es)_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 26fd03652560e7f4abec092229fc38f2, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2ae6a7549097a9b4caefe44b61b1fcc5
m_LoadPath:
m_Id: 631ec5c677ab8084fb9be9b9ee39c6ef
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 1
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3ddf5f47a1b265049825b193e7e93fbd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: Localization-String-Tables-Spanish (es)_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 26fd03652560e7f4abec092229fc38f2, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3e5e5c2400a39814994a9fcb8eaf49a6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,577 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AibisDream.Framework;
using AibisDream.MiniGame.Language;
using AibisDream.Utility;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Localization;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.Tables;
using UnityEngine.TestTools;
namespace AibisDream.EditorTests.Huoshan
{
public sealed class ExpressionLocalizationTests
{
private const string CatalogPath =
"Assets/GameContent/Feature_Huoshan/Expression/ExpressionContentCatalog.asset";
private const string ParticleProfilePath =
"Assets/GameContent/Feature_Huoshan/Expression/ExpressionParticleLanguageProfile.asset";
[TestCase(null, false)]
[TestCase("", false)]
[TestCase("plain", false)]
[TestCase("L10N.key", false)]
[TestCase("l10n.key", true)]
public void LocalizedParamPrefix_IsStrict(string value, bool expected)
{
Assert.That(LocalizationKit.IsLocalizedParam(value), Is.EqualTo(expected));
}
[Test]
public void LocalizedParamKey_StripsOnlyKnownPrefix()
{
Assert.That(LocalizationKit.GetL10NParamKey("l10n.hs.exp.log1.target"),
Is.EqualTo("hs.exp.log1.target"));
Assert.That(LocalizationKit.GetL10NParamKey("raw"), Is.EqualTo("raw"));
}
[Test]
public void MissingParamResult_RequiresMatchingLocalizedReference()
{
Assert.That(
LocalizationKit.IsMissingParamResult(
"l10n.hs.exp.pool",
"⟦hs.exp.pool⟧"),
Is.True);
Assert.That(
LocalizationKit.IsMissingParamResult(
"l10n.hs.exp.pool",
"⟦another.key⟧"),
Is.False);
Assert.That(
LocalizationKit.IsMissingParamResult(
"raw",
"⟦raw⟧"),
Is.False);
}
[UnityTest]
public IEnumerator LocalizeParamAsync_UsesExplicitLocaleAndDoesNotFallback()
{
Locale chinese = LocalizationEditorSettings.GetLocale(
new LocaleIdentifier("zh-Hans"));
Locale english = LocalizationEditorSettings.GetLocale(
new LocaleIdentifier("en"));
Assert.That(chinese, Is.Not.Null);
Assert.That(english, Is.Not.Null);
Locale previous = LocalizationSettings.SelectedLocale;
LocalizationSettings.SelectedLocale = english;
Task<string> chineseTask = LocalizationKit.LocalizeParamAsync(
"l10n.hs.exp.log1.target",
chinese);
Task<string> englishTask = LocalizationKit.LocalizeParamAsync(
"l10n.hs.exp.log1.target",
english);
while (!chineseTask.IsCompleted || !englishTask.IsCompleted)
yield return null;
LocalizationSettings.SelectedLocale = previous;
Assert.That(chineseTask.Result, Is.EqualTo("我就是个笑话"));
Assert.That(englishTask.Result, Is.EqualTo("I am nothing but a joke"));
}
[UnityTest]
public IEnumerator LocalizeParamAsync_ReturnsRawTextAndMissingKeyMarker()
{
Task<string> rawTask = LocalizationKit.LocalizeParamAsync("raw text");
while (!rawTask.IsCompleted)
yield return null;
Assert.That(rawTask.Result, Is.EqualTo("raw text"));
Locale chinese = LocalizationEditorSettings.GetLocale(
new LocaleIdentifier("zh-Hans"));
LogAssert.Expect(
LogType.Error,
new Regex(@"Params 缺少条目.*Key=hs\.exp\.missing.*Locale=zh-Hans"));
Task<string> missingTask = LocalizationKit.LocalizeParamAsync(
"l10n.hs.exp.missing",
chinese);
while (!missingTask.IsCompleted)
yield return null;
Assert.That(missingTask.Result, Is.EqualTo("⟦hs.exp.missing⟧"));
}
[Test]
public void LegacyCommonParams_ArePresentInUnityParams()
{
StringTableCollection collection =
LocalizationEditorSettings.GetStringTableCollection(ConstRef.ParamsTable);
Assert.That(collection, Is.Not.Null);
string[] legacyKeys = { "天空", "海报", "植物", "朋友", "情绪", "记忆", "逻辑" };
foreach (string key in legacyKeys)
Assert.That(collection.SharedData.GetEntry(key), Is.Not.Null, key);
Assert.That(AssetDatabase.LoadAssetAtPath<TextAsset>(
"Assets/StreamingAssets/Config/params.csv"), Is.Null);
}
[Test]
public void ExpressionCatalog_IsValidAndCaseSensitive()
{
ExpressionContentCatalog catalog =
AssetDatabase.LoadAssetAtPath<ExpressionContentCatalog>(CatalogPath);
Assert.That(catalog, Is.Not.Null);
Assert.That(catalog.GetValidationErrors(), Is.Empty);
Assert.That(catalog.Rounds.Select(round => round.Id),
Is.EqualTo(new[] { "log1", "log2", "log3" }));
Assert.That(catalog.TryGetRound("log1", out ExpressionRoundDefinition log1), Is.True);
Assert.That(log1.NonTargetParticleCount, Is.EqualTo(16));
Assert.That(catalog.TryGetRound("LOG1", out _), Is.False);
Assert.That(catalog.TryGetRound("missing", out _), Is.False);
}
[Test]
public void ExpressionCatalog_RejectsDuplicateIdsAndNonLocalizedReferences()
{
ExpressionContentCatalog catalog =
ScriptableObject.CreateInstance<ExpressionContentCatalog>();
try
{
var first = new ExpressionRoundDefinition();
var second = new ExpressionRoundDefinition();
ConfigureRound(first, "log1", "l10n.target", "l10n.tokens", 1);
ConfigureRound(second, "log1", "raw", "l10n.tokens", 1);
SetPrivateField(
catalog,
"rounds",
new List<ExpressionRoundDefinition> { first, second });
string errors = string.Join("\n", catalog.GetValidationErrors());
Assert.That(errors, Does.Contain("重复"));
Assert.That(errors, Does.Contain("l10n.*"));
}
finally
{
Object.DestroyImmediate(catalog);
}
}
[Test]
public void TokenParser_TrimsDropsEmptyAndRejectsFullwidthSeparator()
{
Assert.That(
LanguageYarnCommand.TryParseExpressionTokens(
" 哈哈 | | 嘿嘿|呵呵 ",
out var tokens),
Is.True);
Assert.That(tokens, Is.EqualTo(new[] { "哈哈", "嘿嘿", "呵呵" }));
LogAssert.Expect(LogType.Error, new Regex("全角分隔符"));
Assert.That(
LanguageYarnCommand.TryParseExpressionTokens("哈哈|嘿嘿", out _),
Is.False);
Assert.That(
LanguageYarnCommand.TryParseExpressionTokens(" | | ", out _),
Is.False);
}
[Test]
public void CharacterPoolParser_PreservesUnicodeDuplicatesAndRejectsSeparators()
{
string combining = "e\u0301";
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(
$" 中 中 あ {combining} 😀。 ",
out List<string> pool),
Is.True);
Assert.That(
pool,
Is.EqualTo(new[] { "中", "中", "あ", combining, "😀", "。" }));
Assert.That(
LanguageYarnCommand.TryParseExpressionPool("中|あ", out _),
Is.False);
Assert.That(
LanguageYarnCommand.TryParseExpressionPool("中|あ", out _),
Is.False);
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(" \t ", out _),
Is.False);
}
[Test]
public void ParticleLanguageProfile_ResolvesExactPrefixAndFallbackModes()
{
ExpressionParticleLanguageProfile profile =
AssetDatabase.LoadAssetAtPath<ExpressionParticleLanguageProfile>(
ParticleProfilePath);
Assert.That(profile, Is.Not.Null);
Assert.That(profile.GetValidationErrors(), Is.Empty);
Assert.That(
profile.Resolve(new LocaleIdentifier("zh-Hans")).UnitMode,
Is.EqualTo(ExpressionParticleUnitMode.Grapheme));
Assert.That(
profile.Resolve(new LocaleIdentifier("ja-JP")).UnitMode,
Is.EqualTo(ExpressionParticleUnitMode.Grapheme));
foreach (string localeCode in new[] { "en", "es", "ru", "pt-BR" })
{
Assert.That(
profile.Resolve(new LocaleIdentifier(localeCode)).UnitMode,
Is.EqualTo(ExpressionParticleUnitMode.Word),
localeCode);
}
Assert.That(
profile.Resolve(new LocaleIdentifier("en-US")).LocaleCode,
Is.EqualTo("en"));
LogAssert.Expect(
LogType.Warning,
new Regex(@"Locale 'zz-ZZ'.*Grapheme"));
Assert.That(
profile.Resolve(new LocaleIdentifier("zz-ZZ")).UnitMode,
Is.EqualTo(ExpressionParticleUnitMode.Grapheme));
}
[Test]
public void WordTokenizer_UsesWhitespaceBoundariesAndKeepsPunctuation()
{
Assert.That(
ExpressionTextTokenizer.TokenizeText(
"I am not a joke",
ExpressionParticleUnitMode.Word),
Is.EqualTo(new[] { "I", "am", "not", "a", "joke" }));
Assert.That(
ExpressionTextTokenizer.TokenizeText(
"don't self-doubt ¿Por qué? веришь?",
ExpressionParticleUnitMode.Word),
Is.EqualTo(new[]
{
"don't",
"self-doubt",
"¿Por",
"qué?",
"веришь?"
}));
Assert.That(
ExpressionTextTokenizer.TokenizeText(
"one \t\r\n two",
ExpressionParticleUnitMode.Word),
Is.EqualTo(new[] { "one", "two" }));
}
[Test]
public void GraphemeTokenizer_PreservesCjkKanaAndCombiningCharacters()
{
const string combining = "e\u0301";
Assert.That(
ExpressionTextTokenizer.TokenizeText(
$"汉 あ {combining}",
ExpressionParticleUnitMode.Grapheme),
Is.EqualTo(new[] { "汉", "あ", combining }));
}
[Test]
public void WordPool_PreservesDuplicateWeightsAndRejectsPipeSeparators()
{
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(
"noise doubt noise",
ExpressionParticleUnitMode.Word,
out List<string> pool),
Is.True);
Assert.That(pool, Is.EqualTo(new[] { "noise", "doubt", "noise" }));
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(
"noise|doubt",
ExpressionParticleUnitMode.Word,
out _),
Is.False);
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(
"noisedoubt",
ExpressionParticleUnitMode.Word,
out _),
Is.False);
}
[Test]
public void RoundSnapshot_IsParsedOnceAndKeepsItsLocaleAndWordUnits()
{
ExpressionParticleLanguageProfile languageProfile =
AssetDatabase.LoadAssetAtPath<ExpressionParticleLanguageProfile>(
ParticleProfilePath);
ExpressionParticleLocaleSettings english =
languageProfile.Resolve(new LocaleIdentifier("en"));
Assert.That(
ExpressionRoundTextSnapshot.TryCreate(
new LocaleIdentifier("en"),
english,
"I am not a joke",
new[] { "false alarm", "false alarm" },
"noise doubt noise",
out ExpressionRoundTextSnapshot snapshot,
out string error),
Is.True,
error);
Locale previous = LocalizationSettings.SelectedLocale;
try
{
LocalizationSettings.SelectedLocale =
LocalizationEditorSettings.GetLocale(
new LocaleIdentifier("zh-Hans"));
Assert.That(snapshot.Locale.Code, Is.EqualTo("en"));
Assert.That(
snapshot.TargetUnits,
Is.EqualTo(new[] { "I", "am", "not", "a", "joke" }));
Assert.That(
snapshot.InterferencePoolUnits,
Is.EqualTo(new[] { "false", "alarm", "false", "alarm" }));
Assert.That(
snapshot.DefaultPoolUnits,
Is.EqualTo(new[] { "noise", "doubt", "noise" }));
}
finally
{
LocalizationSettings.SelectedLocale = previous;
}
}
[Test]
public void WordProfile_ScalesConfiguredNonTargetCounts()
{
ExpressionParticleLanguageProfile profile =
AssetDatabase.LoadAssetAtPath<ExpressionParticleLanguageProfile>(
ParticleProfilePath);
ExpressionParticleLocaleSettings english =
profile.Resolve(new LocaleIdentifier("en"));
Assert.That(english.ScaleNonTargetCount(16), Is.EqualTo(10));
Assert.That(english.ScaleNonTargetCount(28), Is.EqualTo(18));
Assert.That(english.ScaleNonTargetCount(38), Is.EqualTo(25));
}
[Test]
public void ParticleGeometry_UsesVisualEdgeDistanceAndShortestSeparationAxis()
{
var left = new Bounds(Vector3.zero, new Vector3(4f, 1f, 0.01f));
var right = new Bounds(
new Vector3(4.15f, 0f, 0f),
new Vector3(4f, 1f, 0.01f));
Assert.That(
ExpressionParticleGeometry.BoundsDistance(left, right),
Is.EqualTo(0.15f).Within(0.0001f));
right.center = new Vector3(3.8f, 0f, 0f);
Assert.That(
ExpressionParticleGeometry.TryGetSeparation(
left,
right,
0.1f,
out Vector2 direction,
out float overlap),
Is.True);
Assert.That(direction, Is.EqualTo(Vector2.left));
Assert.That(overlap, Is.EqualTo(0.3f).Within(0.0001f));
}
[Test]
public void TextParticle_VisualBoundsIncludesTheWholeWordForPointerDistance()
{
var gameObject = new GameObject("TextParticleBoundsTest");
try
{
CandidateParticle particle =
gameObject.AddComponent<CandidateParticle>();
particle.ForceSetUnitText("self-doubt");
Bounds bounds = particle.GetVisualWorldBounds();
Assert.That(bounds.size.x, Is.GreaterThan(0f));
Assert.That(
particle.DistanceToVisualBounds(
new Vector2(bounds.max.x, bounds.center.y)),
Is.EqualTo(0f).Within(0.0001f));
}
finally
{
Object.DestroyImmediate(gameObject);
}
}
[Test]
public void Params_ContainsEnglishWordPoolAndPendingPoolsForOtherLocales()
{
StringTableCollection collection =
LocalizationEditorSettings.GetStringTableCollection(ConstRef.ParamsTable);
Assert.That(collection, Is.Not.Null);
string key =
LocalizationKit.GetL10NParamKey(ConstRef.ExpressParticlePoolParam);
Assert.That(collection.SharedData.GetEntry(key), Is.Not.Null);
string[] localeCodes = { "zh-Hans", "en", "ja-JP", "es", "ru", "pt-BR" };
foreach (string localeCode in localeCodes)
{
StringTable table =
collection.GetTable(new LocaleIdentifier(localeCode)) as StringTable;
Assert.That(table, Is.Not.Null, localeCode);
Assert.That(table.GetEntry(key), Is.Not.Null, localeCode);
}
StringTable chinese =
collection.GetTable(new LocaleIdentifier("zh-Hans")) as StringTable;
Assert.That(
ExpressionTextTokenizer.GetVisibleElements(
chinese.GetEntry(key).LocalizedValue),
Is.Not.Empty);
StringTable english =
collection.GetTable(new LocaleIdentifier("en")) as StringTable;
Assert.That(
LanguageYarnCommand.TryParseExpressionPool(
english.GetEntry(key).LocalizedValue,
ExpressionParticleUnitMode.Word,
out List<string> englishPool),
Is.True);
Assert.That(englishPool, Does.Contain("truth"));
Assert.That(englishPool, Does.Contain("believe"));
foreach (string localeCode in localeCodes.Skip(2))
{
StringTable table =
collection.GetTable(new LocaleIdentifier(localeCode)) as StringTable;
Assert.That(table.GetEntry(key).LocalizedValue, Is.Empty, localeCode);
}
}
[Test]
public void TextParticle_UsesConfiguredRoleAndOverridePoolsWithoutFirstFrameFallback()
{
var gameObject = new GameObject("TextParticlePoolTest");
try
{
CandidateParticle particle = gameObject.AddComponent<CandidateParticle>();
Assert.That(particle.CurrentUnitText, Is.Null.Or.Empty);
string combining = "e\u0301";
particle.SetUnitPools(
new[] { "😀" },
new[] { combining });
particle.originalIsRed = true;
particle.InitializeRandomUnit();
Assert.That(particle.CurrentUnitText, Is.EqualTo("😀"));
particle.originalIsRed = false;
particle.InitializeRandomUnit();
Assert.That(particle.CurrentUnitText, Is.EqualTo(combining));
particle.SetOverrideUnitPool(new[] { "。" });
particle.InitializeRandomUnit();
Assert.That(particle.CurrentUnitText, Is.EqualTo("。"));
particle.SetOverrideUnitPool((IReadOnlyList<string>)null);
particle.InitializeRandomUnit();
Assert.That(particle.CurrentUnitText, Is.EqualTo(combining));
}
finally
{
Object.DestroyImmediate(gameObject);
}
}
[Test]
public void UnicodeTokenizer_PreservesTextElementsAndDropsWhitespace()
{
string combining = "e\u0301";
var elements =
ExpressionTextTokenizer.GetVisibleElements($"中 A あ {combining} 😀。");
Assert.That(
elements,
Is.EqualTo(new[] { "中", "A", "あ", combining, "😀", "。" }));
}
[Test]
public void UnicodeLayout_PreservesWordGapWithoutWhitespaceParticle()
{
ExpressionTextTokenizer.Layout layout =
ExpressionTextTokenizer.BuildLayout("A B", 1f, 0.6f);
Assert.That(layout.VisibleElements, Is.EqualTo(new[] { "A", "B" }));
Assert.That(layout.Offsets[0], Is.EqualTo(-0.8f).Within(0.0001f));
Assert.That(layout.Offsets[1], Is.EqualTo(0.8f).Within(0.0001f));
}
[Test]
public void UnicodeSequenceMatch_UsesWholeTextElements()
{
var source = ExpressionTextTokenizer.GetVisibleElements("A😀e\u0301。");
var fragment = ExpressionTextTokenizer.GetVisibleElements("😀e\u0301");
Assert.That(ExpressionTextTokenizer.FindVisibleSequence(source, fragment),
Is.EqualTo(1));
Assert.That(
ExpressionTextTokenizer.FindVisibleSequence(
source,
ExpressionTextTokenizer.GetVisibleElements("😀x")),
Is.EqualTo(-1));
}
[Test]
public void ExpressContentValidation_HasNoBlockingErrors()
{
var issues = ExpressionLocalizationValidator.Validate();
string errors = string.Join(
"\n",
issues
.Where(issue =>
issue.Severity == ExpressionLocalizationIssueSeverity.Error)
.Select(issue => issue.Message));
Assert.That(errors, Is.Empty);
Assert.That(
issues.Any(issue =>
issue.Severity == ExpressionLocalizationIssueSeverity.Warning),
Is.True,
"未翻译 Locale 的空条目应作为待翻译警告保留。");
}
private static void ConfigureRound(
ExpressionRoundDefinition round,
string id,
string target,
string tokens,
int nonTargetCount)
{
SetPrivateField(round, "id", id);
SetPrivateField(round, "targetReference", target);
SetPrivateField(round, "tokenReference", tokens);
SetPrivateField(round, "nonTargetParticleCount", nonTargetCount);
}
private static void SetPrivateField(object target, string fieldName, object value)
{
FieldInfo field = target.GetType().GetField(
fieldName,
BindingFlags.Instance | BindingFlags.NonPublic);
Assert.That(field, Is.Not.Null, fieldName);
field.SetValue(target, value);
}
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c12e0d2c486f4ea6a5d4f70878b6e7c1
guid: d6b8797332ac4876b66e381ea3c98723
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -0,0 +1,462 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using AibisDream.Framework;
using AibisDream.MiniGame.Language;
using AibisDream.Utility;
using UnityEditor;
using UnityEditor.Localization;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
namespace AibisDream.EditorTests.Huoshan
{
public enum ExpressionLocalizationIssueSeverity
{
Warning,
Error
}
public readonly struct ExpressionLocalizationIssue
{
public ExpressionLocalizationIssue(
ExpressionLocalizationIssueSeverity severity,
string message)
{
Severity = severity;
Message = message;
}
public ExpressionLocalizationIssueSeverity Severity { get; }
public string Message { get; }
}
/// <summary>
/// 校验 Stage6 Express 命令、轮次 Catalog 与 Params String Table 的引用关系。
/// 未翻译 Locale 的空值是待翻译警告,不阻断内容校验。
/// </summary>
public static class ExpressionLocalizationValidator
{
private const string Stage6Path = "Assets/Yarn/FP/FP_Huoshan1/Stage6.yarn";
private const string CatalogPath =
"Assets/GameContent/Feature_Huoshan/Expression/ExpressionContentCatalog.asset";
private const string ParticleProfilePath =
"Assets/GameContent/Feature_Huoshan/Expression/ExpressionParticleLanguageProfile.asset";
private static readonly string[] SupportedLocaleCodes =
{
"zh-Hans",
"en",
"ja-JP",
"es",
"ru",
"pt-BR"
};
private static readonly Regex YarnCommandRegex =
new(@"^\s*<<(?<command>[A-Za-z0-9_]+)(?<arguments>.*?)>>", RegexOptions.Compiled);
private static readonly Regex QuotedArgumentRegex =
new("\"(?<value>(?:\\\\.|[^\"])*)\"", RegexOptions.Compiled);
private static readonly Regex L10NRegex =
new(@"l10n\.(?<key>[A-Za-z0-9._-]+)", RegexOptions.Compiled);
private static readonly Regex ChineseRegex =
new(@"[\u3400-\u9FFF]", RegexOptions.Compiled);
private static readonly Dictionary<string, int[]> VisibleArgumentIndices =
new(StringComparer.Ordinal)
{
["start_expression"] = new[] { 0, 1 },
["expression_truth_lie_flicker"] = new[] { 0, 1 },
["expression_lie_morph_truth"] = new[] { 0, 1 },
["expression_truth_leak"] = new[] { 0 },
["expression_lie_shuffle"] = new[] { 0 },
["expression_actor_flash"] = new[] { 0 },
["expression_actor_flash_in"] = new[] { 0 },
["expression_flash_in"] = new[] { 0 },
["expression_actor_truth_flash"] = new[] { 0 },
["expression_truth_flash"] = new[] { 0 },
["expression_actor_word_hit"] = new[] { 0 },
["expression_word_hit"] = new[] { 0 },
["expression_actor_slot"] = new[] { 0, 1 },
["expression_actor_scroll"] = new[] { 0 },
["expression_truth_attack"] = new[] { 0 },
["expression_truth_destabilize"] = new[] { 0 },
["expression_truth_settle"] = new[] { 0 }
};
[MenuItem("Tools/AIBIS/Huoshan/Validate Express Localization")]
public static void ValidateFromMenu()
{
IReadOnlyList<ExpressionLocalizationIssue> issues = Validate();
int errorCount = issues.Count(issue =>
issue.Severity == ExpressionLocalizationIssueSeverity.Error);
int warningCount = issues.Count - errorCount;
foreach (ExpressionLocalizationIssue issue in issues)
{
if (issue.Severity == ExpressionLocalizationIssueSeverity.Error)
Debug.LogError($"[ExpressL10N] {issue.Message}");
else
Debug.LogWarning($"[ExpressL10N] {issue.Message}");
}
if (errorCount == 0)
{
Debug.Log(
$"[ExpressL10N] 校验通过。errors=0, pending translations={warningCount}");
}
}
public static IReadOnlyList<ExpressionLocalizationIssue> Validate()
{
var issues = new List<ExpressionLocalizationIssue>();
var referencedKeys = new HashSet<string>(StringComparer.Ordinal);
ValidateStage6(issues, referencedKeys);
ValidateCatalog(issues, referencedKeys);
referencedKeys.Add(
LocalizationKit.GetL10NParamKey(ConstRef.ExpressParticlePoolParam));
ExpressionParticleLanguageProfile particleProfile =
ValidateParticleProfile(issues);
ValidateParams(issues, referencedKeys, particleProfile);
return issues;
}
private static ExpressionParticleLanguageProfile ValidateParticleProfile(
List<ExpressionLocalizationIssue> issues)
{
ExpressionParticleLanguageProfile profile =
AssetDatabase.LoadAssetAtPath<ExpressionParticleLanguageProfile>(
ParticleProfilePath);
if (profile == null)
{
AddError(issues, $"找不到粒子语言 Profile{ParticleProfilePath}");
return null;
}
foreach (string validationError in profile.GetValidationErrors())
AddError(issues, validationError);
foreach (string localeCode in SupportedLocaleCodes)
{
bool canResolve = profile.Locales.Any(settings =>
{
if (settings == null ||
string.IsNullOrWhiteSpace(settings.LocaleCode))
{
return false;
}
if (string.Equals(
settings.LocaleCode,
localeCode,
StringComparison.OrdinalIgnoreCase))
{
return true;
}
string requestedLanguage =
localeCode.Split('-')[0];
string configuredLanguage =
settings.LocaleCode.Split('-')[0];
return string.Equals(
requestedLanguage,
configuredLanguage,
StringComparison.OrdinalIgnoreCase);
});
if (!canResolve)
{
AddError(
issues,
$"粒子语言 Profile 无法解析支持的 Locale{localeCode}");
}
}
return profile;
}
private static void ValidateStage6(
List<ExpressionLocalizationIssue> issues,
HashSet<string> referencedKeys)
{
if (!File.Exists(Stage6Path))
{
AddError(issues, $"找不到 Stage6 Yarn{Stage6Path}");
return;
}
string[] lines = File.ReadAllLines(Stage6Path);
for (int lineIndex = 0; lineIndex < lines.Length; lineIndex++)
{
string line = lines[lineIndex];
if (line.TrimStart().StartsWith("//", StringComparison.Ordinal))
continue;
foreach (Match keyMatch in L10NRegex.Matches(line))
referencedKeys.Add(keyMatch.Groups["key"].Value);
Match commandMatch = YarnCommandRegex.Match(line);
if (!commandMatch.Success)
continue;
string command = commandMatch.Groups["command"].Value;
if (!VisibleArgumentIndices.TryGetValue(command, out int[] visibleIndices))
continue;
string[] arguments = QuotedArgumentRegex
.Matches(commandMatch.Groups["arguments"].Value)
.Cast<Match>()
.Select(match => match.Groups["value"].Value)
.ToArray();
foreach (int argumentIndex in visibleIndices)
{
if (argumentIndex >= arguments.Length)
continue;
string value = arguments[argumentIndex];
if (!LocalizationKit.IsLocalizedParam(value) && ChineseRegex.IsMatch(value))
{
AddError(
issues,
$"{Stage6Path}:{lineIndex + 1} 的 {command} 玩家文字参数仍为中文硬编码:{value}");
}
}
}
}
private static void ValidateCatalog(
List<ExpressionLocalizationIssue> issues,
HashSet<string> referencedKeys)
{
ExpressionContentCatalog catalog =
AssetDatabase.LoadAssetAtPath<ExpressionContentCatalog>(CatalogPath);
if (catalog == null)
{
AddError(issues, $"找不到轮次 Catalog{CatalogPath}");
return;
}
foreach (string validationError in catalog.GetValidationErrors())
AddError(issues, validationError);
foreach (ExpressionRoundDefinition round in catalog.Rounds)
{
if (round == null)
continue;
AddCatalogReference(round.TargetReference, referencedKeys);
AddCatalogReference(round.TokenReference, referencedKeys);
}
}
private static void ValidateParams(
List<ExpressionLocalizationIssue> issues,
HashSet<string> referencedKeys,
ExpressionParticleLanguageProfile particleProfile)
{
StringTableCollection collection =
LocalizationEditorSettings.GetStringTableCollection(ConstRef.ParamsTable);
if (collection == null)
{
AddError(issues, $"找不到 String Table Collection{ConstRef.ParamsTable}");
return;
}
var tables = SupportedLocaleCodes.ToDictionary(
code => code,
code => collection.GetTable(new LocaleIdentifier(code)) as StringTable,
StringComparer.OrdinalIgnoreCase);
string poolKey =
LocalizationKit.GetL10NParamKey(ConstRef.ExpressParticlePoolParam);
foreach (string key in referencedKeys.OrderBy(value => value, StringComparer.Ordinal))
{
if (collection.SharedData.GetEntry(key) == null)
{
AddError(issues, $"Params Shared Data 缺少 Key{key}");
continue;
}
StringTableEntry chineseEntry = tables["zh-Hans"]?.GetEntry(key);
if (string.IsNullOrWhiteSpace(chineseEntry?.LocalizedValue))
{
AddError(issues, $"Params 中文值为空:{key}");
}
foreach (string localeCode in SupportedLocaleCodes)
{
StringTable table = tables[localeCode];
StringTableEntry entry = table?.GetEntry(key);
if (entry == null)
{
if (string.Equals(
localeCode,
"zh-Hans",
StringComparison.Ordinal))
{
AddError(
issues,
$"Params/{key} 缺少 {localeCode} 条目。");
}
else
{
issues.Add(new ExpressionLocalizationIssue(
ExpressionLocalizationIssueSeverity.Warning,
$"待翻译:Params/{key}, Locale={localeCode}(缺少条目)"));
}
continue;
}
if (string.IsNullOrWhiteSpace(entry.LocalizedValue))
{
if (string.Equals(localeCode, "zh-Hans", StringComparison.Ordinal))
continue;
issues.Add(new ExpressionLocalizationIssue(
ExpressionLocalizationIssueSeverity.Warning,
$"待翻译:Params/{key}, Locale={localeCode}"));
continue;
}
ExpressionParticleLocaleSettings settings =
particleProfile != null
? particleProfile.Resolve(new LocaleIdentifier(localeCode))
: ExpressionParticleLocaleSettings.CreateFallback();
if (string.Equals(key, poolKey, StringComparison.Ordinal))
{
ValidateParticlePool(
issues,
key,
localeCode,
entry.LocalizedValue,
settings.UnitMode);
}
else if (key.EndsWith(".tokens", StringComparison.Ordinal))
{
ValidatePipeList(
issues,
key,
localeCode,
entry.LocalizedValue,
settings.UnitMode);
}
else
{
ValidateVisibleText(
issues,
key,
localeCode,
entry.LocalizedValue,
settings.UnitMode);
}
}
}
}
private static void ValidateVisibleText(
List<ExpressionLocalizationIssue> issues,
string key,
string localeCode,
string value,
ExpressionParticleUnitMode mode)
{
if (ExpressionTextTokenizer.TokenizeText(value, mode).Count == 0)
{
AddError(
issues,
$"Params/{key}, Locale={localeCode} 没有有效的粒子单位。");
}
}
private static void ValidateParticlePool(
List<ExpressionLocalizationIssue> issues,
string key,
string localeCode,
string value,
ExpressionParticleUnitMode mode)
{
if (value.Contains('|') || value.Contains(''))
{
AddError(
issues,
$"Params/{key}, Locale={localeCode} 的粒子池不能包含“|”或“|”。");
return;
}
if (!LanguageYarnCommand.TryParseExpressionPool(value, mode, out _))
{
string expected =
mode == ExpressionParticleUnitMode.Word
? "空白分隔单词"
: "Unicode 文本元素";
AddError(
issues,
$"Params/{key}, Locale={localeCode} 没有有效的{expected}。");
}
}
private static void ValidatePipeList(
List<ExpressionLocalizationIssue> issues,
string key,
string localeCode,
string value,
ExpressionParticleUnitMode mode)
{
if (value.Contains(''))
{
AddError(
issues,
$"Params/{key}, Locale={localeCode} 使用了全角分隔符“|”,必须使用半角“|”。");
return;
}
string[] phrases = value
.Split('|')
.Where(token => !string.IsNullOrWhiteSpace(token))
.ToArray();
if (phrases.Length == 0)
{
AddError(
issues,
$"Params/{key}, Locale={localeCode} 没有有效项。");
return;
}
foreach (string phrase in phrases)
{
if (ExpressionTextTokenizer.TokenizeText(phrase, mode).Count == 0)
{
AddError(
issues,
$"Params/{key}, Locale={localeCode} 包含没有有效粒子单位的短句。");
return;
}
}
}
private static void AddCatalogReference(
string reference,
HashSet<string> referencedKeys)
{
if (LocalizationKit.IsLocalizedParam(reference))
referencedKeys.Add(LocalizationKit.GetL10NParamKey(reference));
}
private static void AddError(
List<ExpressionLocalizationIssue> issues,
string message)
{
issues.Add(new ExpressionLocalizationIssue(
ExpressionLocalizationIssueSeverity.Error,
message));
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5c602299e38f4bf4899abfbcbed84d77
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -105,17 +105,12 @@ namespace AibisDream.EditorTests.Huoshan
Assert.That(lastCompletion, Is.EqualTo(totalDuration).Within(0.0001f));
}
[TestCase("LightPreset", 0.10f, 0.35f, 0.25f, 0.25f, 0.70f, 0.15f)]
[TestCase("MediumPreset", 0.20f, 0.55f, 0.50f, 0.35f, 0.90f, 0.30f)]
[TestCase("HeavyPreset", 0.35f, 0.80f, 0.85f, 0.50f, 1.10f, 0.50f)]
[TestCase("LightPreset", 0.10f)]
[TestCase("MediumPreset", 0.20f)]
[TestCase("HeavyPreset", 0.35f)]
public void PresentationPreset_UsesApprovedValues(
string presetFieldName,
float baseDistortion,
float liePause,
float breakPeak,
float breakDuration,
float truthDuration,
float truthPeripheral)
float baseDistortion)
{
const BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
FieldInfo presetField = typeof(LogReleasePresentationController).GetField(presetFieldName, flags);
@@ -124,11 +119,6 @@ namespace AibisDream.EditorTests.Huoshan
Type presetType = preset.GetType();
AssertPresetField(presetType, preset, "BaseDistortion", baseDistortion);
AssertPresetField(presetType, preset, "LiePause", liePause);
AssertPresetField(presetType, preset, "BreakPeak", breakPeak);
AssertPresetField(presetType, preset, "BreakDuration", breakDuration);
AssertPresetField(presetType, preset, "TruthDuration", truthDuration);
AssertPresetField(presetType, preset, "TruthPeripheral", truthPeripheral);
}
[Test]
Binary file not shown.
@@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: e721272cd05718a4d8872d0f3e3f5b8c
guid: 5f2a0ba886c6cac40a1857418c5e16a4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
@@ -0,0 +1,27 @@
%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: a86a72005fba4c99a59962fb9e92df83, type: 3}
m_Name: ExpressionContentCatalog
m_EditorClassIdentifier:
rounds:
- id: log1
targetReference: l10n.hs.exp.log1.target
tokenReference: l10n.hs.exp.log1.tokens
nonTargetParticleCount: 16
- id: log2
targetReference: l10n.hs.exp.log2.target
tokenReference: l10n.hs.exp.log2.tokens
nonTargetParticleCount: 28
- id: log3
targetReference: l10n.hs.exp.log3.target
tokenReference: l10n.hs.exp.log3.tokens
nonTargetParticleCount: 38
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b2d94952a18d4d178421691ab103f0fd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,69 @@
%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: 3a7f6c18f2184d09b551e103c67268a1, type: 3}
m_Name: ExpressionParticleLanguageProfile
m_EditorClassIdentifier:
locales:
- localeCode: zh-Hans
unitMode: 0
targetFontScale: 1
nonTargetFontScale: 1
floatingFontScale: 1
nonTargetCountScale: 1
wordSpacing: 0.18
visualEdgeConnectionDistance: 0
minimumReadablePhraseScale: 0.65
- localeCode: ja-JP
unitMode: 0
targetFontScale: 1
nonTargetFontScale: 1
floatingFontScale: 1
nonTargetCountScale: 1
wordSpacing: 0.18
visualEdgeConnectionDistance: 0
minimumReadablePhraseScale: 0.65
- localeCode: en
unitMode: 1
targetFontScale: 0.75
nonTargetFontScale: 0.7
floatingFontScale: 0.7
nonTargetCountScale: 0.75
wordSpacing: 0.18
visualEdgeConnectionDistance: 0.18
minimumReadablePhraseScale: 0.65
- localeCode: es
unitMode: 1
targetFontScale: 0.75
nonTargetFontScale: 0.7
floatingFontScale: 0.7
nonTargetCountScale: 0.75
wordSpacing: 0.18
visualEdgeConnectionDistance: 0.18
minimumReadablePhraseScale: 0.65
- localeCode: ru
unitMode: 1
targetFontScale: 0.75
nonTargetFontScale: 0.7
floatingFontScale: 0.7
nonTargetCountScale: 0.75
wordSpacing: 0.18
visualEdgeConnectionDistance: 0.18
minimumReadablePhraseScale: 0.65
- localeCode: pt-BR
unitMode: 1
targetFontScale: 0.75
nonTargetFontScale: 0.7
floatingFontScale: 0.7
nonTargetCountScale: 0.75
wordSpacing: 0.18
visualEdgeConnectionDistance: 0.18
minimumReadablePhraseScale: 0.65
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 57d812538c3e4bddafe59f8813562f46
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -197,7 +197,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 107.3, y: -4}
m_AnchoredPosition: {x: 107.3, y: -8}
m_SizeDelta: {x: 106, y: 20}
m_Pivot: {x: 0, y: 1}
--- !u!222 &6236610923486505318
@@ -756,7 +756,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 107.29999, y: -25}
m_AnchoredPosition: {x: 107.29999, y: -22.6}
m_SizeDelta: {x: 96, y: 20}
m_Pivot: {x: 0, y: 1}
--- !u!222 &6685312199246720920
@@ -280,7 +280,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 132.9, y: -5}
m_AnchoredPosition: {x: 132.9, y: -9}
m_SizeDelta: {x: 132.5, y: 25}
m_Pivot: {x: 0, y: 1}
--- !u!222 &3142962418811844898
@@ -743,7 +743,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 132.90002, y: -31.25}
m_AnchoredPosition: {x: 132.90002, y: -29.9}
m_SizeDelta: {x: 120, y: 25}
m_Pivot: {x: 0, y: 1}
--- !u!222 &2054489642493287172
@@ -17,6 +17,9 @@ MonoBehaviour:
- {fileID: 11400000, guid: 8906df9235e52fb41b11fe8776a77032, type: 2}
- {fileID: 11400000, guid: bdf8ad79a9f707b45805e23c25ccdadb, type: 2}
- {fileID: 11400000, guid: 9d8accfdeabc8034c986233920a17184, type: 2}
- {fileID: 11400000, guid: 63300a11309a7b34bbf7a345b123cab8, type: 2}
- {fileID: 11400000, guid: c69caec2066296840887d7e0c2eff52e, type: 2}
- {fileID: 11400000, guid: 728457f9c2ef69c489530047d495eca5, type: 2}
m_Extensions: []
m_Group: String Table
references:
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: ChapterInfo_es
m_EditorClassIdentifier:
m_LocaleId:
m_Code: es
m_SharedData: {fileID: 11400000, guid: 7ea8c68fdc624de4c86434963c06ec55, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 728457f9c2ef69c489530047d495eca5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: ChapterInfo_pt-BR
m_EditorClassIdentifier:
m_LocaleId:
m_Code: pt-BR
m_SharedData: {fileID: 11400000, guid: 7ea8c68fdc624de4c86434963c06ec55, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 63300a11309a7b34bbf7a345b123cab8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: ChapterInfo_ru
m_EditorClassIdentifier:
m_LocaleId:
m_Code: ru
m_SharedData: {fileID: 11400000, guid: 7ea8c68fdc624de4c86434963c06ec55, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c69caec2066296840887d7e0c2eff52e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb1838fe8befb0429646b938e757ff3, type: 3}
m_Name: Portuguese (Brazil) (pt-BR)
m_EditorClassIdentifier:
m_Identifier:
m_Code: pt-BR
m_Metadata:
m_Items: []
m_LocaleName: Portuguese (Brazil) (pt-BR)
m_CustomFormatCultureCode:
m_UseCustomFormatter: 0
m_SortOrder: 10000
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d0c46f4777ac92249a43143a15892fd2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb1838fe8befb0429646b938e757ff3, type: 3}
m_Name: Russian (ru)
m_EditorClassIdentifier:
m_Identifier:
m_Code: ru
m_Metadata:
m_Items: []
m_LocaleName: Russian (ru)
m_CustomFormatCultureCode:
m_UseCustomFormatter: 0
m_SortOrder: 10000
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9b1581a48f0ca11448dbddaf79c11252
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb1838fe8befb0429646b938e757ff3, type: 3}
m_Name: Spanish (es)
m_EditorClassIdentifier:
m_Identifier:
m_Code: es
m_Metadata:
m_Items: []
m_LocaleName: Spanish (es)
m_CustomFormatCultureCode:
m_UseCustomFormatter: 0
m_SortOrder: 10000
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3cadb0d5f8bf5e64599f52e139f7e3cc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -43,6 +43,150 @@ MonoBehaviour:
m_Key: "\u903B\u8F91"
m_Metadata:
m_Items: []
- m_Id: 200000000000001001
m_Key: hs.exp.log1.target
m_Metadata:
m_Items: []
- m_Id: 200000000000001002
m_Key: hs.exp.log1.tokens
m_Metadata:
m_Items: []
- m_Id: 200000000000001003
m_Key: hs.exp.log2.target
m_Metadata:
m_Items: []
- m_Id: 200000000000001004
m_Key: hs.exp.log2.tokens
m_Metadata:
m_Items: []
- m_Id: 200000000000001005
m_Key: hs.exp.log3.target
m_Metadata:
m_Items: []
- m_Id: 200000000000001006
m_Key: hs.exp.log3.tokens
m_Metadata:
m_Items: []
- m_Id: 200000000000001008
m_Key: hs.exp.atk.why
m_Metadata:
m_Items: []
- m_Id: 200000000000001009
m_Key: hs.exp.atk.doubt
m_Metadata:
m_Items: []
- m_Id: 200000000000001010
m_Key: hs.exp.atk.last
m_Metadata:
m_Items: []
- m_Id: 200000000000001011
m_Key: hs.exp.atk.weather
m_Metadata:
m_Items: []
- m_Id: 200000000000001012
m_Key: hs.exp.atk.unsold
m_Metadata:
m_Items: []
- m_Id: 200000000000001013
m_Key: hs.exp.atk.explain
m_Metadata:
m_Items: []
- m_Id: 200000000000001014
m_Key: hs.exp.atk.refuse
m_Metadata:
m_Items: []
- m_Id: 200000000000001015
m_Key: hs.exp.atk.trust
m_Metadata:
m_Items: []
- m_Id: 200000000000001016
m_Key: hs.exp.atk.enough
m_Metadata:
m_Items: []
- m_Id: 200000000000001017
m_Key: hs.exp.atk.damn
m_Metadata:
m_Items: []
- m_Id: 200000000000001018
m_Key: hs.exp.atk.useless
m_Metadata:
m_Items: []
- m_Id: 200000000000001019
m_Key: hs.exp.atk.prove
m_Metadata:
m_Items: []
- m_Id: 200000000000001020
m_Key: hs.exp.atk.nothing
m_Metadata:
m_Items: []
- m_Id: 200000000000001021
m_Key: hs.exp.atk.catchup
m_Metadata:
m_Items: []
- m_Id: 200000000000001022
m_Key: hs.exp.atk.yingli
m_Metadata:
m_Items: []
- m_Id: 200000000000001023
m_Key: hs.exp.atk.courage
m_Metadata:
m_Items: []
- m_Id: 200000000000001024
m_Key: hs.exp.atk.say
m_Metadata:
m_Items: []
- m_Id: 200000000000001025
m_Key: hs.exp.atk.trash
m_Metadata:
m_Items: []
- m_Id: 200000000000001026
m_Key: hs.exp.atk.hopeless
m_Metadata:
m_Items: []
- m_Id: 200000000000001027
m_Key: hs.exp.atk.why_loop
m_Metadata:
m_Items: []
- m_Id: 200000000000001028
m_Key: hs.exp.final.win
m_Metadata:
m_Items: []
- m_Id: 200000000000001029
m_Key: hs.exp.pool
m_Metadata:
m_Items: []
- m_Id: 200000000000001030
m_Key: dream.terminal.boot.01
m_Metadata:
m_Items: []
- m_Id: 200000000000001031
m_Key: dream.terminal.boot.02
m_Metadata:
m_Items: []
- m_Id: 200000000000001032
m_Key: dream.terminal.boot.03
m_Metadata:
m_Items: []
- m_Id: 200000000000001033
m_Key: dream.terminal.boot.04
m_Metadata:
m_Items: []
- m_Id: 200000000000001034
m_Key: dream.terminal.boot.05
m_Metadata:
m_Items: []
- m_Id: 200000000000001035
m_Key: dream.terminal.boot.06
m_Metadata:
m_Items: []
- m_Id: 200000000000001036
m_Key: dream.terminal.boot.07
m_Metadata:
m_Items: []
- m_Id: 200000000000001037
m_Key: dream.terminal.boot.08
m_Metadata:
m_Items: []
m_Metadata:
m_Items: []
m_KeyGenerator:
+3
View File
@@ -17,6 +17,9 @@ MonoBehaviour:
- {fileID: 11400000, guid: 9248cb179e7aafa4c903f1fc54b41ef7, type: 2}
- {fileID: 11400000, guid: aeb318c895d57014b89d5540c6baff95, type: 2}
- {fileID: 11400000, guid: 9ed23d1d910a1a147ba5c316a87cbad4, type: 2}
- {fileID: 11400000, guid: 6ad3c9298dbc3b642b1251ffc306eaa6, type: 2}
- {fileID: 11400000, guid: b91f4281442d2b54f92fbecb5bd56426, type: 2}
- {fileID: 11400000, guid: 1edf9254b97981643bdecd6d22ed1150, type: 2}
m_Extensions: []
m_Group: String Table
references:
+144
View File
@@ -46,6 +46,150 @@ MonoBehaviour:
m_Localized: Logic
m_Metadata:
m_Items: []
- m_Id: 200000000000001001
m_Localized: I am nothing but a joke
m_Metadata:
m_Items: []
- m_Id: 200000000000001002
m_Localized: Ha ha|Heh heh|So funny
m_Metadata:
m_Items: []
- m_Id: 200000000000001003
m_Localized: Please don't leave me
m_Metadata:
m_Items: []
- m_Id: 200000000000001004
m_Localized: Ha ha ha|Heh heh heh|That's hilarious|So funny|What a joke
m_Metadata:
m_Items: []
- m_Id: 200000000000001005
m_Localized: Why won't you believe in me
m_Metadata:
m_Items: []
- m_Id: 200000000000001006
m_Localized: Ha ha ha ha|I'm dying laughing|This is too funny|I can't hold it|I can't stop laughing|This is hilarious
m_Metadata:
m_Items: []
- m_Id: 200000000000001008
m_Localized: Why
m_Metadata:
m_Items: []
- m_Id: 200000000000001009
m_Localized: You don't believe me
m_Metadata:
m_Items: []
- m_Id: 200000000000001010
m_Localized: I know I come last
m_Metadata:
m_Items: []
- m_Id: 200000000000001011
m_Localized: The weather is terrible
m_Metadata:
m_Items: []
- m_Id: 200000000000001012
m_Localized: Nobody is buying
m_Metadata:
m_Items: []
- m_Id: 200000000000001013
m_Localized: Try to explain
m_Metadata:
m_Items: []
- m_Id: 200000000000001014
m_Localized: You refuse to believe me
m_Metadata:
m_Items: []
- m_Id: 200000000000001015
m_Localized: Just a little trust
m_Metadata:
m_Items: []
- m_Id: 200000000000001016
m_Localized: I've had enough
m_Metadata:
m_Items: []
- m_Id: 200000000000001017
m_Localized: Damn it
m_Metadata:
m_Items: []
- m_Id: 200000000000001018
m_Localized: I'm useless
m_Metadata:
m_Items: []
- m_Id: 200000000000001019
m_Localized: Prove myself
m_Metadata:
m_Items: []
- m_Id: 200000000000001020
m_Localized: I can't do anything
m_Metadata:
m_Items: []
- m_Id: 200000000000001021
m_Localized: Catch up with you
m_Metadata:
m_Items: []
- m_Id: 200000000000001022
m_Localized: Help Yingli
m_Metadata:
m_Items: []
- m_Id: 200000000000001023
m_Localized: I have no courage
m_Metadata:
m_Items: []
- m_Id: 200000000000001024
m_Localized: Say it out loud
m_Metadata:
m_Items: []
- m_Id: 200000000000001025
m_Localized: Trash
m_Metadata:
m_Items: []
- m_Id: 200000000000001026
m_Localized: Completely hopeless
m_Metadata:
m_Items: []
- m_Id: 200000000000001027
m_Localized: Why why why
m_Metadata:
m_Items: []
- m_Id: 200000000000001028
m_Localized: I want to win for once
m_Metadata:
m_Items: []
- m_Id: 200000000000001029
m_Localized: the a an and or but if then because I me my mine you your yours we our us they their them he his him she her it its this that these those who what where when why how is am are was were be been being do does did done can could will would shall should may might must have has had not no yes never always sometimes again still already just only even very really too so more most less least all any some none one two first last next now here there inside outside above below before after back away near far good bad right wrong true false real fake funny joke laugh smile cry fear trust doubt hope courage voice word words say tell ask answer explain believe leave stay come go follow catch help hold let make try fail win lose break fix remember forget think know feel want need like hate love angry tired lonely useless enough nothing everything someone nobody friend weather today tomorrow yesterday time world dream truth lie problem reason choice change begin end open close light dark red blue green warm cold quiet loud slow fast strong weak safe danger together apart broken whole
m_Metadata:
m_Items: []
- m_Id: 200000000000001030
m_Localized: root@sys:~$ dream.render --stop --session 0742
m_Metadata:
m_Items: []
- m_Id: 200000000000001031
m_Localized: '[ OK ] Dream renderer stopped.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001032
m_Localized: '[ RAW ] Untitled_Greybox_0 exposed.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001033
m_Localized: root@sys:~$ trace --tail /log/dream_0742.rec
m_Metadata:
m_Items: []
- m_Id: 200000000000001034
m_Localized: '[0005] audio.play("sea_ambient", source=door.rear)'
m_Metadata:
m_Items: []
- m_Id: 200000000000001035
m_Localized: '[0006] memory.project("glass_sea")'
m_Metadata:
m_Items: []
- m_Id: 200000000000001036
m_Localized: '[ WARN ] memory source unresolved; overflow detected.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001037
m_Localized: 'root@sys:~$ print_string("Does the sea exist?")'
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
+27
View File
@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: Params_es
m_EditorClassIdentifier:
m_LocaleId:
m_Code: es
m_SharedData: {fileID: 11400000, guid: 4a2d391471bd9cd439150c52659e9846, type: 2}
m_Metadata:
m_Items: []
m_TableData:
- m_Id: 200000000000001029
m_Localized:
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1edf9254b97981643bdecd6d22ed1150
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+144
View File
@@ -46,6 +46,150 @@ MonoBehaviour:
m_Localized: "\u8AD6\u7406"
m_Metadata:
m_Items: []
- m_Id: 200000000000001001
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001002
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001003
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001004
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001005
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001006
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001008
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001009
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001010
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001011
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001012
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001013
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001014
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001015
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001016
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001017
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001018
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001019
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001020
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001021
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001022
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001023
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001024
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001025
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001026
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001027
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001028
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001029
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000001030
m_Localized: root@sys:~$ dream.render --stop --session 0742
m_Metadata:
m_Items: []
- m_Id: 200000000000001031
m_Localized: '[ OK ] Dream renderer stopped.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001032
m_Localized: '[ RAW ] Untitled_Greybox_0 exposed.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001033
m_Localized: root@sys:~$ trace --tail /log/dream_0742.rec
m_Metadata:
m_Items: []
- m_Id: 200000000000001034
m_Localized: '[0005] audio.play("sea_ambient", source=door.rear)'
m_Metadata:
m_Items: []
- m_Id: 200000000000001035
m_Localized: '[0006] memory.project("glass_sea")'
m_Metadata:
m_Items: []
- m_Id: 200000000000001036
m_Localized: '[ WARN ] \u30E1\u30E2\u30EA\u30BD\u30FC\u30B9\u672A\u89E3\u6C7A\uFF1B\u30AA\u30FC\u30D0\u30FC\u30D5\u30ED\u30FC\u691C\u51FA\u3002'
m_Metadata:
m_Items: []
- m_Id: 200000000000001037
m_Localized: "root@sys:~$ print_string(\"\u6D77\u306F\u5B58\u5728\u3059\u308B\u306E\u304B?\")"
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
+27
View File
@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: Params_pt-BR
m_EditorClassIdentifier:
m_LocaleId:
m_Code: pt-BR
m_SharedData: {fileID: 11400000, guid: 4a2d391471bd9cd439150c52659e9846, type: 2}
m_Metadata:
m_Items: []
m_TableData:
- m_Id: 200000000000001029
m_Localized:
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6ad3c9298dbc3b642b1251ffc306eaa6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+27
View File
@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: Params_ru
m_EditorClassIdentifier:
m_LocaleId:
m_Code: ru
m_SharedData: {fileID: 11400000, guid: 4a2d391471bd9cd439150c52659e9846, type: 2}
m_Metadata:
m_Items: []
m_TableData:
- m_Id: 200000000000001029
m_Localized:
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b91f4281442d2b54f92fbecb5bd56426
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+144
View File
@@ -46,6 +46,150 @@ MonoBehaviour:
m_Localized: "\u903B\u8F91"
m_Metadata:
m_Items: []
- m_Id: 200000000000001001
m_Localized: "\u6211\u5C31\u662F\u4E2A\u7B11\u8BDD"
m_Metadata:
m_Items: []
- m_Id: 200000000000001002
m_Localized: "\u54C8\u54C8|\u563F\u563F|\u5475\u5475"
m_Metadata:
m_Items: []
- m_Id: 200000000000001003
m_Localized: "\u4E0D\u8981\u79BB\u5F00\u6211"
m_Metadata:
m_Items: []
- m_Id: 200000000000001004
m_Localized: "\u54C8\u54C8\u54C8|\u563F\u563F\u563F|\u5475\u5475\u5475|\u7B11\u6B7B\u4E86|\u597D\u597D\u7B11"
m_Metadata:
m_Items: []
- m_Id: 200000000000001005
m_Localized: "\u4E3A\u4EC0\u4E48\u4E0D\u76F8\u4FE1\u6211"
m_Metadata:
m_Items: []
- m_Id: 200000000000001006
m_Localized: "\u54C8\u54C8\u54C8\u54C8|\u7B11\u6B7B\u6211\u4E86|\u592A\u597D\u7B11\u4E86|\u7EF7\u4E0D\u4F4F\u4E86|\u7B11\u4E0D\u6D3B\u4E86|\u771F\u7684\u592A\u641E\u7B11"
m_Metadata:
m_Items: []
- m_Id: 200000000000001008
m_Localized: "\u4E3A\u4EC0\u4E48"
m_Metadata:
m_Items: []
- m_Id: 200000000000001009
m_Localized: "\u4E0D\u76F8\u4FE1\u6211"
m_Metadata:
m_Items: []
- m_Id: 200000000000001010
m_Localized: "\u6211\u660E\u767D\u6211\u57AB\u5E95"
m_Metadata:
m_Items: []
- m_Id: 200000000000001011
m_Localized: "\u5929\u6C14\u771F\u7684\u4E0D\u884C"
m_Metadata:
m_Items: []
- m_Id: 200000000000001012
m_Localized: "\u5356\u4E0D\u51FA\u53BB"
m_Metadata:
m_Items: []
- m_Id: 200000000000001013
m_Localized: "\u52AA\u529B\u89E3\u91CA"
m_Metadata:
m_Items: []
- m_Id: 200000000000001014
m_Localized: "\u4E0D\u613F\u610F\u76F8\u4FE1\u6211"
m_Metadata:
m_Items: []
- m_Id: 200000000000001015
m_Localized: "\u4E00\u70B9\u4FE1\u4EFB"
m_Metadata:
m_Items: []
- m_Id: 200000000000001016
m_Localized: "\u53D7\u591F\u4E86"
m_Metadata:
m_Items: []
- m_Id: 200000000000001017
m_Localized: "\u771F\u8BE5\u6B7B"
m_Metadata:
m_Items: []
- m_Id: 200000000000001018
m_Localized: "\u771F\u6CA1\u7528"
m_Metadata:
m_Items: []
- m_Id: 200000000000001019
m_Localized: "\u8BC1\u660E\u81EA\u5DF1"
m_Metadata:
m_Items: []
- m_Id: 200000000000001020
m_Localized: "\u4EC0\u4E48\u90FD\u505A\u4E0D\u5230"
m_Metadata:
m_Items: []
- m_Id: 200000000000001021
m_Localized: "\u8FFD\u4E0A\u4F60"
m_Metadata:
m_Items: []
- m_Id: 200000000000001022
m_Localized: "\u5E2E\u5230\u82F1\u7406"
m_Metadata:
m_Items: []
- m_Id: 200000000000001023
m_Localized: "\u6CA1\u6709\u52C7\u6C14"
m_Metadata:
m_Items: []
- m_Id: 200000000000001024
m_Localized: "\u8BF4\u51FA\u6765"
m_Metadata:
m_Items: []
- m_Id: 200000000000001025
m_Localized: "\u5E9F\u7269"
m_Metadata:
m_Items: []
- m_Id: 200000000000001026
m_Localized: "\u70C2\u6CE5\u6276\u4E0D\u4E0A\u5899"
m_Metadata:
m_Items: []
- m_Id: 200000000000001027
m_Localized: "\u4E3A\u4EC0\u4E48\u4E3A\u4EC0\u4E48"
m_Metadata:
m_Items: []
- m_Id: 200000000000001028
m_Localized: "\u6211\u60F3\u8D62\u4E00\u6B21"
m_Metadata:
m_Items: []
- m_Id: 200000000000001029
m_Localized: 的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞
m_Metadata:
m_Items: []
- m_Id: 200000000000001030
m_Localized: root@sys:~$ dream.render --stop --session 0742
m_Metadata:
m_Items: []
- m_Id: 200000000000001031
m_Localized: '[ OK ] Dream renderer stopped.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001032
m_Localized: '[ RAW ] Untitled_Greybox_0 exposed.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001033
m_Localized: root@sys:~$ trace --tail /log/dream_0742.rec
m_Metadata:
m_Items: []
- m_Id: 200000000000001034
m_Localized: '[0005] audio.play("sea_ambient", source=door.rear)'
m_Metadata:
m_Items: []
- m_Id: 200000000000001035
m_Localized: '[0006] memory.project("glass_sea")'
m_Metadata:
m_Items: []
- m_Id: 200000000000001036
m_Localized: '[ WARN ] memory source unresolved; overflow detected.'
m_Metadata:
m_Items: []
- m_Id: 200000000000001037
m_Localized: "root@sys:~$ print_string(\"\u6D77\u662F\u5B58\u5728\u7684\u5417?\")"
m_Metadata:
m_Items: []
references:
version: 2
RefIds: []
@@ -19,10 +19,6 @@ MonoBehaviour:
m_Key: start_newGame
m_Metadata:
m_Items: []
- m_Id: 22296654778368
m_Key: start_title
m_Metadata:
m_Items: []
- m_Id: 22296671555584
m_Key: start_selcetLevel
m_Metadata:
@@ -31,38 +27,10 @@ MonoBehaviour:
m_Key: start_quit
m_Metadata:
m_Items: []
- m_Id: 22296675749889
m_Key: start_survey
m_Metadata:
m_Items: []
- m_Id: 22296675749890
m_Key: community
m_Metadata:
m_Items: []
- m_Id: 22296675749891
m_Key: record_title
m_Metadata:
m_Items: []
- m_Id: 26730768109568
m_Key: record_continue
m_Metadata:
m_Items: []
- m_Id: 22296675749892
m_Key: main_setting
m_Metadata:
m_Items: []
- m_Id: 22296675749893
m_Key: main_record
m_Metadata:
m_Items: []
- m_Id: 22296675749894
m_Key: main_auto
m_Metadata:
m_Items: []
- m_Id: 22296675749895
m_Key: main_fast
m_Metadata:
m_Items: []
- m_Id: 22296675749896
m_Key: setting_title
m_Metadata:
@@ -119,10 +87,6 @@ MonoBehaviour:
m_Key: setting_textSpeed_fast
m_Metadata:
m_Items: []
- m_Id: 752706112196608
m_Key: save_warning
m_Metadata:
m_Items: []
- m_Id: 753317281009664
m_Key: save_return
m_Metadata:
+3
View File
@@ -17,6 +17,9 @@ MonoBehaviour:
- {fileID: 11400000, guid: f3e7269fc46911b4dbe7ea36aa77aa90, type: 2}
- {fileID: 11400000, guid: e6ecffb64cf71b44bbc44ebf958029cc, type: 2}
- {fileID: 11400000, guid: 7c757424270c91e43bf45198f69c983a, type: 2}
- {fileID: 11400000, guid: 7d496f91e240bb143b62a6239c817d09, type: 2}
- {fileID: 11400000, guid: f679069e455200841a92c27186383940, type: 2}
- {fileID: 11400000, guid: 380c27123212d66468aa1f3ed3bf72ea, type: 2}
m_Extensions: []
m_Group: String Table
references:
+6 -57
View File
@@ -16,18 +16,12 @@ MonoBehaviour:
m_Code: en
m_SharedData: {fileID: 11400000, guid: 994c69bf4b2403043bc9562f2d24ee56, type: 2}
m_Metadata:
m_Items:
- rid: 7917695930343620616
m_Items: []
m_TableData:
- m_Id: 3350325104640
m_Localized: New Game
m_Metadata:
m_Items: []
- m_Id: 22296654778368
m_Localized: All Our\nBroken Parts
m_Metadata:
m_Items:
- rid: 7917695930343620616
- m_Id: 22296671555584
m_Localized: Chapter Select
m_Metadata:
@@ -40,34 +34,6 @@ MonoBehaviour:
m_Localized: Exit
m_Metadata:
m_Items: []
- m_Id: 22296675749889
m_Localized: Questionnaire
m_Metadata:
m_Items: []
- m_Id: 22296675749890
m_Localized: Discord
m_Metadata:
m_Items: []
- m_Id: 22296675749891
m_Localized: Medical Records
m_Metadata:
m_Items: []
- m_Id: 22296675749892
m_Localized: Settings
m_Metadata:
m_Items: []
- m_Id: 22296675749893
m_Localized: Log
m_Metadata:
m_Items: []
- m_Id: 22296675749894
m_Localized: Auto
m_Metadata:
m_Items: []
- m_Id: 22296675749895
m_Localized: Fast Forward
m_Metadata:
m_Items: []
- m_Id: 22296675749896
m_Localized: <SETTINGS>
m_Metadata:
@@ -128,19 +94,6 @@ MonoBehaviour:
m_Localized: Fast
m_Metadata:
m_Items: []
- m_Id: 752706112196608
m_Localized: 'This is a temporary feature prepared for testing purposes.
If
this is your first playthrough, we recommend going back and clicking Start
Game to begin.
If you wish to select a chapter, please restart the
game before using this feature, as bugs may otherwise occur.'
m_Metadata:
m_Items: []
- m_Id: 753317281009664
m_Localized: Back
m_Metadata:
@@ -258,25 +211,21 @@ MonoBehaviour:
m_Metadata:
m_Items: []
- m_Id: 200000000000000001
m_Localized: "\u76EE\u6807\uFF1A\u5265\u79BB\u7EA2\u8272\u7684\u5E72\u6270\u8BED\u8A00\uFF0C\u805A\u96C6\u84DD\u8272\u7684\u771F\u5B9E\u8868\u8FBE"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000002
m_Localized: "\u8F93\u51FA"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000003
m_Localized: "{0}% \u8BED\u8A00\u6574\u5408\u5B8C\u6210\u5EA6"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000004
m_Localized: "{0} \u5904\u5F02\u5E38\u601D\u7EEA\u4ECD\u5728\u5E72\u6270\u8868\u8FBE"
m_Localized:
m_Metadata:
m_Items: []
references:
version: 2
RefIds:
- rid: 7917695930343620616
type: {class: SmartFormatTag, ns: UnityEngine.Localization.Metadata, asm: Unity.Localization}
data:
m_Entries: 0010305847140000
RefIds: []
+23
View File
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: UIText_es
m_EditorClassIdentifier:
m_LocaleId:
m_Code: es
m_SharedData: {fileID: 11400000, guid: 994c69bf4b2403043bc9562f2d24ee56, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 380c27123212d66468aa1f3ed3bf72ea
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+4 -40
View File
@@ -22,10 +22,6 @@ MonoBehaviour:
m_Localized: "\u30CB\u30E5\u30FC\u30B2\u30FC\u30E0"
m_Metadata:
m_Items: []
- m_Id: 22296654778368
m_Localized: "\u611B\u3068\u30ED\u30DC\u30C3\u30C8\n\u4FEE\u7406\u6280\u8853"
m_Metadata:
m_Items: []
- m_Id: 22296671555584
m_Localized: "\u30C1\u30E3\u30D7\u30BF\u30FC\u9078\u629E"
m_Metadata:
@@ -38,38 +34,10 @@ MonoBehaviour:
m_Localized: "\u7D42\u4E86"
m_Metadata:
m_Items: []
- m_Id: 22296675749889
m_Localized: "\u30A2\u30F3\u30B1\u30FC\u30C8"
m_Metadata:
m_Items: []
- m_Id: 22296675749890
m_Localized: Discord
m_Metadata:
m_Items: []
- m_Id: 22296675749891
m_Localized: "\u30AB\u30EB\u30C6"
m_Metadata:
m_Items: []
- m_Id: 26730768109568
m_Localized: "\u623B\u308B"
m_Metadata:
m_Items: []
- m_Id: 22296675749892
m_Localized: "\u8A2D\u5B9A"
m_Metadata:
m_Items: []
- m_Id: 22296675749893
m_Localized: "\u30D0\u30C3\u30AF\u30ED\u30B0"
m_Metadata:
m_Items: []
- m_Id: 22296675749894
m_Localized: "\u81EA\u52D5"
m_Metadata:
m_Items: []
- m_Id: 22296675749895
m_Localized: "\u65E9\u9001\u308A"
m_Metadata:
m_Items: []
- m_Id: 22296675749896
m_Localized: "<\u8A2D\u5B9A>"
m_Metadata:
@@ -126,10 +94,6 @@ MonoBehaviour:
m_Localized: "\u9AD8\u901F"
m_Metadata:
m_Items: []
- m_Id: 752706112196608
m_Localized: "\u3053\u308C\u306F\u30C6\u30B9\u30C8\u7528\u306E\u4E00\u6642\u7684\u306A\u6A5F\u80FD\u3067\u3059\n\n\u521D\u3081\u3066\u30D7\u30EC\u30A4\u3059\u308B\u5834\u5408\u306F\u3001\u623B\u3063\u3066\u300C\u30B2\u30FC\u30E0\u30B9\u30BF\u30FC\u30C8\u300D\u304B\u3089\u59CB\u3081\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\n\n\u30C1\u30E3\u30D7\u30BF\u30FC\u9078\u629E\u3092\u4F7F\u7528\u3057\u305F\u3044\u65B9\u306F\u3001\u30B2\u30FC\u30E0\u3092\u518D\u8D77\u52D5\u3057\u3066\u304B\u3089\u3054\u5229\u7528\u304F\u3060\u3055\u3044\u3002\u30D0\u30B0\u304C\u767A\u751F\u3059\u308B\u6050\u308C\u304C\u3042\u308A\u307E\u3059"
m_Metadata:
m_Items: []
- m_Id: 753317281009664
m_Localized: "\u623B\u308B"
m_Metadata:
@@ -247,19 +211,19 @@ MonoBehaviour:
m_Metadata:
m_Items: []
- m_Id: 200000000000000001
m_Localized: "\u76EE\u6807\uFF1A\u5265\u79BB\u7EA2\u8272\u7684\u5E72\u6270\u8BED\u8A00\uFF0C\u805A\u96C6\u84DD\u8272\u7684\u771F\u5B9E\u8868\u8FBE"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000002
m_Localized: "\u8F93\u51FA"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000003
m_Localized: "{0}% \u8BED\u8A00\u6574\u5408\u5B8C\u6210\u5EA6"
m_Localized:
m_Metadata:
m_Items: []
- m_Id: 200000000000000004
m_Localized: "{0} \u5904\u5F02\u5E38\u601D\u7EEA\u4ECD\u5728\u5E72\u6270\u8868\u8FBE"
m_Localized:
m_Metadata:
m_Items: []
references:
+23
View File
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: UIText_pt-BR
m_EditorClassIdentifier:
m_LocaleId:
m_Code: pt-BR
m_SharedData: {fileID: 11400000, guid: 994c69bf4b2403043bc9562f2d24ee56, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7d496f91e240bb143b62a6239c817d09
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+23
View File
@@ -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: e9620f8c34305754d8cc9a7e49e852d9, type: 3}
m_Name: UIText_ru
m_EditorClassIdentifier:
m_LocaleId:
m_Code: ru
m_SharedData: {fileID: 11400000, guid: 994c69bf4b2403043bc9562f2d24ee56, type: 2}
m_Metadata:
m_Items: []
m_TableData: []
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f679069e455200841a92c27186383940
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+2 -46
View File
@@ -16,18 +16,12 @@ MonoBehaviour:
m_Code: zh-Hans
m_SharedData: {fileID: 11400000, guid: 994c69bf4b2403043bc9562f2d24ee56, type: 2}
m_Metadata:
m_Items:
- rid: 7917695939544875419
m_Items: []
m_TableData:
- m_Id: 3350325104640
m_Localized: "\u65B0\u6E38\u620F"
m_Metadata:
m_Items: []
- m_Id: 22296654778368
m_Localized: "\u7231\u4E0E\u673A\u5668\u4EBA\\n\u7EF4\u4FEE\u6280\u672F"
m_Metadata:
m_Items:
- rid: 7917695939544875419
- m_Id: 22296671555584
m_Localized: "\u9009\u62E9\u7AE0\u8282"
m_Metadata:
@@ -40,38 +34,10 @@ MonoBehaviour:
m_Localized: "\u9000\u51FA"
m_Metadata:
m_Items: []
- m_Id: 22296675749889
m_Localized: "\u95EE\u5377"
m_Metadata:
m_Items: []
- m_Id: 22296675749890
m_Localized: 325268983
m_Metadata:
m_Items: []
- m_Id: 22296675749891
m_Localized: "\u8BCA\u7597\u8BB0\u5F55"
m_Metadata:
m_Items: []
- m_Id: 26730768109568
m_Localized: "\u8FD4\u56DE"
m_Metadata:
m_Items: []
- m_Id: 22296675749892
m_Localized: "\u8BBE\u7F6E"
m_Metadata:
m_Items: []
- m_Id: 22296675749893
m_Localized: "\u8BB0\u5F55"
m_Metadata:
m_Items: []
- m_Id: 22296675749894
m_Localized: "\u81EA\u52A8"
m_Metadata:
m_Items: []
- m_Id: 22296675749895
m_Localized: "\u5FEB\u8FDB"
m_Metadata:
m_Items: []
- m_Id: 22296675749896
m_Localized: "<\u8BBE\u7F6E>"
m_Metadata:
@@ -128,12 +94,6 @@ MonoBehaviour:
m_Localized: "\u5FEB\u901F"
m_Metadata:
m_Items: []
- m_Id: 752706112196608
m_Localized: "\u8FD9\u662F\u4E00\u4E2A\u4E3A\u4FBF\u4E8E\u6D4B\u8BD5\u51C6\u5907\u7684\u4E34\u65F6\u529F\u80FD\n
\n \u5982\u679C\u9996\u6B21\u6E38\u73A9\uFF0C\u63A8\u8350\u60A8\u8FD4\u56DE\u5E76\u70B9\u51FB\u5F00\u59CB\u6E38\u620F\u76F4\u63A5\u5F00\u59CB\n
\n \u63A8\u8350\u60F3\u8981\u9009\u5173\u7684\u73A9\u5BB6\u91CD\u542F\u6E38\u620F\u540E\u518D\u4F7F\u7528\u672C\u529F\u80FD,\u5426\u5219\u53EF\u80FD\u51FA\u73B0bug"
m_Metadata:
m_Items: []
- m_Id: 753317281009664
m_Localized: "\u8FD4\u56DE"
m_Metadata:
@@ -268,8 +228,4 @@ MonoBehaviour:
m_Items: []
references:
version: 2
RefIds:
- rid: 7917695939544875419
type: {class: SmartFormatTag, ns: UnityEngine.Localization.Metadata, asm: Unity.Localization}
data:
m_Entries: 0010305847140000
RefIds: []
@@ -173,8 +173,6 @@ MonoBehaviour:
redParticleCount: 8
connectionDistance: 2
textMargin: 1
anxietyPhrases: []
targetSentence: "\u522B\u8FC7\u6765\u6211\u611F\u89C9\u5BB3\u6015"
completionDialogNode:
waveformAmplitude: 0.3
interactionRadius: 0.5
+3 -11
View File
@@ -16127,13 +16127,8 @@ MonoBehaviour:
expressionView: {fileID: 5162511683866016917}
logReleasePresentation: {fileID: 2138889543}
screenPresentation: {fileID: 2138889544}
defaultAnxietyPhrases:
- "\u6211\u597D\u6015"
- "\u600E\u4E48\u529E"
- "\u4E0D\u884C"
- "\u597D\u96BE"
- "\u505A\u4E0D\u5230"
defaultTargetSentence: "\u8FD9\u662F\u4E00\u4E2A\u6D4B\u8BD5\u793A\u4F8B"
contentCatalog: {fileID: 11400000, guid: b2d94952a18d4d178421691ab103f0fd, type: 2}
particleLanguageProfile: {fileID: 11400000, guid: 57d812538c3e4bddafe59f8813562f46, type: 2}
screenOverlayRenderer: {fileID: 2063129674}
volcanoOverlayRenderer: {fileID: 1944146357}
spriteOverlayFadeInAlpha: 1
@@ -16217,7 +16212,6 @@ MonoBehaviour:
memoryExitDuration: 0.45
faceDipRatio: 0.015
lieColor: {r: 0.66, g: 0.94, b: 1, a: 1}
errorColor: {r: 1, g: 0.34, b: 0.18, a: 1}
truthWarmColor: {r: 1, g: 1, b: 1, a: 1}
truthAccentColor: {r: 1, g: 0.84, b: 0.6, a: 1}
truthBackdropColor: {r: 0.3, g: 0.2, b: 0.1, a: 0.78}
@@ -18470,8 +18464,6 @@ MonoBehaviour:
redParticleCount: 8
connectionDistance: 1.8
textMargin: 0.45
anxietyPhrases: []
targetSentence: "\u522B\u8FC7\u6765\u6211\u611F\u89C9\u5BB3\u6015"
completionDialogNode:
waveformAmplitude: 0.3
interactionRadius: 0.5
@@ -18575,7 +18567,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u8F93\u51FA"
m_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: f242fb3dde1933640859f1c54591c9c8, type: 2}
m_sharedMaterial: {fileID: -6659093157667844055, guid: f242fb3dde1933640859f1c54591c9c8, type: 2}

Some files were not shown because too many files have changed in this diff Show More