Browse Source

Refactored localisation system to use ILocalizable interface

You can now add custom commands that work with the localisation system
by implementing the ILocalizable interface.
master
chrisgregan 10 years ago
parent
commit
d6f057c98c
  1. 22
      Assets/Fungus/Flowchart/Scripts/Command.cs
  2. 27
      Assets/Fungus/Narrative/Scripts/Character.cs
  3. 27
      Assets/Fungus/Narrative/Scripts/Commands/Menu.cs
  4. 33
      Assets/Fungus/Narrative/Scripts/Commands/Say.cs
  5. 362
      Assets/Fungus/Narrative/Scripts/Localization.cs
  6. 27
      Assets/Fungus/UI/Scripts/Commands/SetText.cs
  7. 27
      Assets/Fungus/UI/Scripts/Commands/Write.cs
  8. 4
      Assets/Tests/Localisation/CSV/localization_Commands.csv
  9. 4
      Assets/Tests/Localisation/CSV/localization_Narrative.csv
  10. 8
      Assets/Tests/Localisation/CSV/localization_Narrative.csv.meta
  11. 484
      Assets/Tests/Localisation/LocalisationTests.unity

22
Assets/Fungus/Flowchart/Scripts/Command.cs

@ -184,6 +184,28 @@ namespace Fungus
{
return false;
}
/**
* Returns the localization id for the Flowchart that contains this command.
*/
public virtual string GetFlowchartLocalizationId()
{
// If no localization id has been set then use the Flowchart name
Flowchart flowchart = GetFlowchart();
if (flowchart == null)
{
return "";
}
string localizationId = GetFlowchart().localizationId;
if (localizationId.Length == 0)
{
localizationId = flowchart.name;
}
return localizationId;
}
}
}

27
Assets/Fungus/Narrative/Scripts/Character.cs

@ -8,7 +8,7 @@ namespace Fungus
{
[ExecuteInEditMode]
public class Character : MonoBehaviour
public class Character : MonoBehaviour, ILocalizable
{
public string nameText; // We need a separate name as the object name is used for character variations (e.g. "Smurf Happy", "Smurf Sad")
public Color nameColor = Color.white;
@ -36,6 +36,31 @@ namespace Fungus
{
activeCharacters.Remove(this);
}
//
// ILocalizable implementation
//
public virtual string GetStandardText()
{
return nameText;
}
public virtual void SetStandardText(string standardText)
{
nameText = standardText;
}
public virtual string GetDescription()
{
return description;
}
public virtual string GetStringId()
{
// String id for character names is CHARACTER.<Character Name>
return "CHARACTER." + nameText;
}
}
}

27
Assets/Fungus/Narrative/Scripts/Commands/Menu.cs

@ -11,7 +11,7 @@ namespace Fungus
"Menu",
"Displays a button in a multiple choice menu")]
[AddComponentMenu("")]
public class Menu : Command
public class Menu : Command, ILocalizable
{
[Tooltip("Text to display on the menu button")]
public string text = "Option Text";
@ -118,6 +118,31 @@ namespace Fungus
{
return new Color32(184, 210, 235, 255);
}
//
// ILocalizable implementation
//
public virtual string GetStandardText()
{
return text;
}
public virtual void SetStandardText(string standardText)
{
text = standardText;
}
public virtual string GetDescription()
{
return description;
}
public virtual string GetStringId()
{
// String id for Menu commands is MENU.<Localization Id>.<Command id>
return "MENU." + GetFlowchartLocalizationId() + "." + itemId;
}
}
}

33
Assets/Fungus/Narrative/Scripts/Commands/Say.cs

@ -9,7 +9,7 @@ namespace Fungus
"Say",
"Writes text in a dialog box.")]
[AddComponentMenu("")]
public class Say : Command
public class Say : Command, ILocalizable
{
// Removed this tooltip as users's reported it obscures the text box
[TextArea(5,10)]
@ -160,6 +160,37 @@ namespace Fungus
{
executionCount = 0;
}
//
// ILocalizable implementation
//
public virtual string GetStandardText()
{
return storyText;
}
public virtual void SetStandardText(string standardText)
{
storyText = standardText;
}
public virtual string GetDescription()
{
return description;
}
public virtual string GetStringId()
{
// String id for Say commands is SAY.<Localization Id>.<Command id>.[Character Name]
string stringId = "SAY." + GetFlowchartLocalizationId() + "." + itemId + ".";
if (character != null)
{
stringId += character.nameText;
}
return stringId;
}
}
}

362
Assets/Fungus/Narrative/Scripts/Localization.cs

@ -11,6 +11,14 @@ using Ideafixxxer.CsvParser;
namespace Fungus
{
public interface ILocalizable
{
string GetStandardText();
void SetStandardText(string standardText);
string GetDescription();
string GetStringId();
}
/**
* Multi-language localization support.
*/
@ -24,6 +32,8 @@ namespace Fungus
protected static Dictionary<string, string> localizedStrings = new Dictionary<string, string>();
protected Dictionary<string, ILocalizable> localizeableObjects = new Dictionary<string, ILocalizable>();
/**
* Temp storage for a single item of standard text and its localizations
*/
@ -48,6 +58,17 @@ namespace Fungus
public virtual void Start()
{
// Build cache of localizeable objects in the scene
Component[] components = GameObject.FindObjectsOfType<Component>();
foreach (Component component in components)
{
ILocalizable localizable = component as ILocalizable;
if (localizable != null)
{
localizeableObjects[localizable.GetStringId()] = localizable;
}
}
if (localizationFile != null &&
localizationFile.text.Length > 0)
{
@ -144,98 +165,49 @@ namespace Fungus
{
Dictionary<string, TextItem> textItems = new Dictionary<string, TextItem>();
// Export all character names
foreach (Character character in GameObject.FindObjectsOfType<Character>())
{
// String id for character names is CHARACTER.<Character Name>
TextItem textItem = new TextItem();
textItem.standardText = character.nameText;
textItem.description = character.description;
string stringId = "CHARACTER." + character.nameText;
textItems[stringId] = textItem;
}
// Export all Say and Menu commands in the scene
// To make it easier to localize, we preserve the command order in each exported block.
// Add localizable commands in same order as command list to make it
// easier to localise / edit standard text.
Flowchart[] flowcharts = GameObject.FindObjectsOfType<Flowchart>();
foreach (Flowchart flowchart in flowcharts)
{
// If no localization id has been set then use the Flowchart name
string localizationId = flowchart.localizationId;
if (localizationId.Length == 0)
{
localizationId = flowchart.name;
}
Block[] blocks = flowchart.GetComponentsInChildren<Block>();
foreach (Block block in blocks)
{
foreach (Command command in block.commandList)
{
string stringId = "";
string standardText = "";
string description = "";
System.Type type = command.GetType();
if (type == typeof(Say))
ILocalizable localizable = command as ILocalizable;
if (localizable != null)
{
// String id for Say commands is SAY.<Localization Id>.<Command id>.<Character Name>
Say sayCommand = command as Say;
standardText = sayCommand.storyText;
description = sayCommand.description;
stringId = "SAY." + localizationId + "." + sayCommand.itemId + ".";
if (sayCommand.character != null)
{
stringId += sayCommand.character.nameText;
}
}
else if (type == typeof(Menu))
{
// String id for Menu commands is MENU.<Localization Id>.<Command id>
Menu menuCommand = command as Menu;
standardText = menuCommand.text;
description = menuCommand.description;
stringId = "MENU." + localizationId + "." + menuCommand.itemId;
TextItem textItem = new TextItem();
textItem.standardText = localizable.GetStandardText();
textItem.description = localizable.GetDescription();
textItems[localizable.GetStringId()] = textItem;
}
else if (type == typeof(Write))
{
// String id for Write commands is WRITE.<Localization Id>.<Command id>
Write writeCommand = command as Write;
standardText = writeCommand.text;
description = writeCommand.description;
stringId = "WRITE." + localizationId + "." + writeCommand.itemId;
}
else if (type == typeof(SetText))
{
// String id for Set Text commands is SETTEXT.<Localization Id>.<Command id>
SetText setTextCommand = command as SetText;
standardText = setTextCommand.text;
description = setTextCommand.description;
stringId = "SETTEXT." + localizationId + "." + setTextCommand.itemId;
}
else
{
continue;
}
TextItem textItem = null;
if (textItems.ContainsKey(stringId))
{
textItem = textItems[stringId];
}
else
{
textItem = new TextItem();
textItems[stringId] = textItem;
}
// Update basic properties,leaving localised strings intact
textItem.standardText = standardText;
textItem.description = description;
}
}
}
// Add everything else that's localizable
Component[] components = GameObject.FindObjectsOfType<Component>();
foreach (Component component in components)
{
ILocalizable localizable = component as ILocalizable;
if (localizable != null)
{
string stringId = localizable.GetStringId();
if (textItems.ContainsKey(stringId))
{
// Already added
continue;
}
TextItem textItem = new TextItem();
textItem.standardText = localizable.GetStandardText();
textItem.description = localizable.GetDescription();
textItems[stringId] = textItem;
}
}
return textItems;
}
@ -271,7 +243,9 @@ namespace Fungus
{
if (stringId.StartsWith("CHARACTER.") ||
stringId.StartsWith("SAY.") ||
stringId.StartsWith("MENU."))
stringId.StartsWith("MENU.") ||
stringId.StartsWith("WRITE.") ||
stringId.StartsWith("SETTEXT."))
{
// If it's a 'built-in' type this probably means that item has been deleted from its flowchart,
// so there's no need to add a text item for it.
@ -380,28 +354,6 @@ namespace Fungus
// Using a localized language text column
// 1. Add all localized text to the localized strings dict
// 2. Update all scene text properties with localized versions
// Cache a lookup table of characters in the scene
Dictionary<string, Character> characterDict = new Dictionary<string, Character>();
foreach (Character character in GameObject.FindObjectsOfType<Character>())
{
characterDict[character.nameText] = character;
}
// Cache a lookup table of flowcharts in the scene
Dictionary<string, Flowchart> flowchartDict = new Dictionary<string, Flowchart>();
foreach (Flowchart flowchart in GameObject.FindObjectsOfType<Flowchart>())
{
// If no localization id has been set then use the Flowchart name
string localizationId = flowchart.localizationId;
if (localizationId.Length == 0)
{
localizationId = flowchart.name;
}
flowchartDict[localizationId] = flowchart;
}
for (int i = 1; i < csvTable.Length; ++i)
{
string[] fields = csvTable[i];
@ -417,7 +369,7 @@ namespace Fungus
if (languageEntry.Length > 0)
{
localizedStrings[stringId] = languageEntry;
PopulateTextProperty(stringId, languageEntry, flowchartDict, characterDict);
PopulateTextProperty(stringId, languageEntry);
}
}
}
@ -425,181 +377,21 @@ namespace Fungus
/**
* Populates the text property of a single scene object with a new text value.
*/
public virtual bool PopulateTextProperty(string stringId,
string newText,
Dictionary<string, Flowchart> flowchartDict,
Dictionary<string, Character> characterDict)
public virtual bool PopulateTextProperty(string stringId, string newText)
{
string[] idParts = stringId.Split('.');
if (idParts.Length == 0)
{
return false;
}
string stringType = idParts[0];
if (stringType == "SAY")
{
if (idParts.Length != 4)
{
return false;
}
string flowchartId = idParts[1];
if (!flowchartDict.ContainsKey(flowchartId))
{
return false;
}
Flowchart flowchart = flowchartDict[flowchartId];
int itemId = int.Parse(idParts[2]);
if (flowchart != null)
{
foreach (Say say in flowchart.GetComponentsInChildren<Say>())
{
if (say.itemId == itemId &&
say.storyText != newText)
{
#if UNITY_EDITOR
Undo.RecordObject(say, "Set Text");
#endif
say.storyText = newText;
return true;
}
}
}
}
else if (stringType == "MENU")
{
if (idParts.Length != 3)
{
return false;
}
string flowchartId = idParts[1];
if (!flowchartDict.ContainsKey(flowchartId))
{
return false;
}
Flowchart flowchart = flowchartDict[flowchartId];
int itemId = int.Parse(idParts[2]);
if (flowchart != null)
{
foreach (Menu menu in flowchart.GetComponentsInChildren<Menu>())
{
if (menu.itemId == itemId &&
menu.text != newText)
{
#if UNITY_EDITOR
Undo.RecordObject(menu, "Set Text");
#endif
menu.text = newText;
return true;
}
}
}
}
else if (stringType == "CHARACTER")
{
if (idParts.Length != 2)
{
return false;
}
string characterName = idParts[1];
if (!characterDict.ContainsKey(characterName))
{
return false;
}
Character character = characterDict[characterName];
if (character != null &&
character.nameText != newText)
{
#if UNITY_EDITOR
Undo.RecordObject(character, "Set Text");
#endif
character.nameText = newText;
return true;
}
}
else if (stringType == "WRITE")
{
if (idParts.Length != 3)
{
return false;
}
string flowchartId = idParts[1];
if (!flowchartDict.ContainsKey(flowchartId))
{
return false;
}
Flowchart flowchart = flowchartDict[flowchartId];
int itemId = int.Parse(idParts[2]);
if (flowchart != null)
{
foreach (Write write in flowchart.GetComponentsInChildren<Write>())
{
if (write.itemId == itemId &&
write.text != newText)
{
#if UNITY_EDITOR
Undo.RecordObject(write, "Write");
#endif
write.text.Value = newText;
return true;
}
}
}
}
else if (stringType == "SETTEXT")
ILocalizable localizable = null;
localizeableObjects.TryGetValue(stringId, out localizable);
if (localizable != null)
{
if (idParts.Length != 3)
{
return false;
}
string flowchartId = idParts[1];
if (!flowchartDict.ContainsKey(flowchartId))
{
return false;
}
Flowchart flowchart = flowchartDict[flowchartId];
int itemId = int.Parse(idParts[2]);
if (flowchart != null)
{
foreach (SetText setText in flowchart.GetComponentsInChildren<SetText>())
{
if (setText.itemId == itemId &&
setText.text != newText)
{
#if UNITY_EDITOR
Undo.RecordObject(setText, "Set Text");
#endif
setText.text.Value = newText;
return true;
}
}
}
localizable.SetStandardText(newText);
return true;
}
return false;
}
/**
* Returns all standard text for SAY & MENU commands in the scene using an
* Returns all standard text for localizeable text in the scene using an
* easy to edit custom text format.
*/
public virtual string GetStandardText()
@ -611,11 +403,6 @@ namespace Fungus
int rowCount = 0;
foreach (string stringId in textItems.Keys)
{
if (!stringId.StartsWith("SAY.") && !(stringId.StartsWith("MENU.")))
{
continue;
}
TextItem languageItem = textItems[stringId];
textData += "#" + stringId + "\n";
@ -633,27 +420,6 @@ namespace Fungus
*/
public virtual void SetStandardText(string textData)
{
// Cache a lookup table of characters in the scene
Dictionary<string, Character> characterDict = new Dictionary<string, Character>();
foreach (Character character in GameObject.FindObjectsOfType<Character>())
{
characterDict[character.nameText] = character;
}
// Cache a lookup table of flowcharts in the scene
Dictionary<string, Flowchart> flowchartDict = new Dictionary<string, Flowchart>();
foreach (Flowchart flowchart in GameObject.FindObjectsOfType<Flowchart>())
{
// If no localization id has been set then use the Flowchart name
string localizationId = flowchart.localizationId;
if (localizationId.Length == 0)
{
localizationId = flowchart.name;
}
flowchartDict[localizationId] = flowchart;
}
string[] lines = textData.Split('\n');
int updatedCount = 0;
@ -668,7 +434,7 @@ namespace Fungus
if (stringId.Length > 0)
{
// Write buffered text to the appropriate text property
if (PopulateTextProperty(stringId, buffer.Trim(), flowchartDict, characterDict))
if (PopulateTextProperty(stringId, buffer.Trim()))
{
updatedCount++;
}
@ -687,7 +453,7 @@ namespace Fungus
// Handle last buffered entry
if (stringId.Length > 0)
{
if (PopulateTextProperty(stringId, buffer.Trim(), flowchartDict, characterDict))
if (PopulateTextProperty(stringId, buffer.Trim()))
{
updatedCount++;
}

27
Assets/Fungus/UI/Scripts/Commands/SetText.cs

@ -11,7 +11,7 @@ namespace Fungus
"Sets the text property on a UI Text object and/or an Input Field object.")]
[AddComponentMenu("")]
public class SetText : Command
public class SetText : Command, ILocalizable
{
[Tooltip("Text object to set text on. Can be a UI Text, Text Field or Text Mesh object.")]
public GameObject targetTextObject;
@ -86,6 +86,31 @@ namespace Fungus
targetTextObject = _textObjectObsolete.gameObject;
}
}
//
// ILocalizable implementation
//
public virtual string GetStandardText()
{
return text;
}
public virtual void SetStandardText(string standardText)
{
text.Value = standardText;
}
public virtual string GetDescription()
{
return description;
}
public virtual string GetStringId()
{
// String id for Set Text commands is SETTEXT.<Localization Id>.<Command id>
return "SETTEXT." + GetFlowchartLocalizationId() + "." + itemId;
}
}
}

27
Assets/Fungus/UI/Scripts/Commands/Write.cs

@ -11,7 +11,7 @@ namespace Fungus
"Writes content to a UI Text or Text Mesh object.")]
[AddComponentMenu("")]
public class Write : Command
public class Write : Command, ILocalizable
{
[Tooltip("Text object to set text on. Text, Input Field and Text Mesh objects are supported.")]
public GameObject textObject;
@ -107,6 +107,31 @@ namespace Fungus
return writer;
}
//
// ILocalizable implementation
//
public virtual string GetStandardText()
{
return text;
}
public virtual void SetStandardText(string standardText)
{
text.Value = standardText;
}
public virtual string GetDescription()
{
return description;
}
public virtual string GetStringId()
{
// String id for Write commands is WRITE.<Localization Id>.<Command id>
return "WRITE." + GetFlowchartLocalizationId() + "." + itemId;
}
}
}

4
Assets/Tests/Localisation/CSV/localization_Commands.csv

@ -1,5 +1,5 @@
Key,Description,Standard,FR
WRITE.Flowchart.1,,English text,texte français
SETTEXT.Flowchart.6,,English text,texte français
SETTEXT.Flowchart.5,,English text,texte français
WRITE.Flowchart.3,,English text,texte français
SETTEXT.Flowchart.6,,English text,texte français
WRITE.Flowchart.1,,English text,texte français

1 Key Description Standard FR
2 WRITE.Flowchart.1 SETTEXT.Flowchart.6 English text texte français
3 SETTEXT.Flowchart.5 English text texte français
4 WRITE.Flowchart.3 English text texte français
5 SETTEXT.Flowchart.6 WRITE.Flowchart.1 English text texte français

4
Assets/Tests/Localisation/CSV/localization_Narrative.csv

@ -0,0 +1,4 @@
Key,Description,Standard,FR
SAY.Flowchart.1.Character Name,,Say text,Dites texte
MENU.Flowchart.2,,Option text,Texte Option
CHARACTER.Character Name,,Character Name,Le nom du personnage
1 Key Description Standard FR
2 SAY.Flowchart.1.Character Name Say text Dites texte
3 MENU.Flowchart.2 Option text Texte Option
4 CHARACTER.Character Name Character Name Le nom du personnage

8
Assets/Tests/Localisation/CSV/localization_Narrative.csv.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5d25dc3ca14874409ad738ecbe1f7627
timeCreated: 1439990493
licenseType: Free
TextScriptImporter:
userData:
assetBundleName:
assetBundleVariant:

484
Assets/Tests/Localisation/LocalisationTests.unity

@ -261,7 +261,7 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 4
m_RootOrder: 5
--- !u!1 &263238434
GameObject:
m_ObjectHideFlags: 0
@ -302,6 +302,101 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
--- !u!1 &292727465
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 292727466}
- 114: {fileID: 292727467}
m_Layer: 0
m_Name: NarrativeLocalizationTest
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &292727466
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 292727465}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 331926889}
- {fileID: 679750563}
- {fileID: 1141038908}
- {fileID: 622392413}
m_Father: {fileID: 0}
m_RootOrder: 4
--- !u!114 &292727467
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 292727465}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b1dba0b27b0864740a8720e920aa88c0, type: 3}
m_Name:
m_EditorClassIdentifier:
timeout: 5
ignored: 0
succeedAfterAllAssertionsAreExecuted: 1
expectException: 0
expectedExceptionList:
succeedWhenExceptionIsThrown: 0
includedPlatforms: -1
platformsToIgnore: []
dynamic: 0
dynamicTypeName:
--- !u!1 &331926888
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 149266, guid: ffbd0831d997545eab75c364da082c1b, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 331926889}
- 114: {fileID: 331926890}
m_Layer: 0
m_Name: Localization
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &331926889
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 480768, guid: ffbd0831d997545eab75c364da082c1b, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 331926888}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 292727466}
m_RootOrder: 0
--- !u!114 &331926890
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11438504, guid: ffbd0831d997545eab75c364da082c1b,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 331926888}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5724422a635e425bae0af9ffe2615d6, type: 3}
m_Name:
m_EditorClassIdentifier:
activeLanguage:
localizationFile: {fileID: 4900000, guid: 5d25dc3ca14874409ad738ecbe1f7627, type: 3}
--- !u!1 &365459144
GameObject:
m_ObjectHideFlags: 1
@ -329,7 +424,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 61dddfdc5e0e44ca298d8f46f7f5a915, type: 3}
m_Name:
m_EditorClassIdentifier:
selectedFlowchart: {fileID: 587159255}
selectedFlowchart: {fileID: 679750556}
--- !u!4 &365459146
Transform:
m_ObjectHideFlags: 1
@ -357,7 +452,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &453921374
Transform:
m_ObjectHideFlags: 0
@ -486,7 +581,8 @@ MonoBehaviour:
width: 1114
height: 859
selectedBlock: {fileID: 587159257}
selectedCommands: []
selectedCommands:
- {fileID: 587159256}
variables: []
description:
stepPause: 0
@ -565,7 +661,7 @@ MonoBehaviour:
parentBlock: {fileID: 587159257}
--- !u!114 &587159259
MonoBehaviour:
m_ObjectHideFlags: 0
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 587159254}
@ -605,7 +701,7 @@ Transform:
m_RootOrder: 0
--- !u!114 &587159261
MonoBehaviour:
m_ObjectHideFlags: 0
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 587159254}
@ -620,7 +716,7 @@ MonoBehaviour:
languageCode: FR
--- !u!114 &587159262
MonoBehaviour:
m_ObjectHideFlags: 0
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 587159254}
@ -635,7 +731,7 @@ MonoBehaviour:
duration: 1
--- !u!114 &587159263
MonoBehaviour:
m_ObjectHideFlags: 0
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 587159254}
@ -655,7 +751,7 @@ MonoBehaviour:
_textObjectObsolete: {fileID: 0}
--- !u!114 &587159264
MonoBehaviour:
m_ObjectHideFlags: 0
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 587159254}
@ -693,6 +789,309 @@ MonoBehaviour:
compareType: 0
comparisonType: 4
ignoreCase: 0
--- !u!1 &622392412
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 622392413}
- 114: {fileID: 622392414}
m_Layer: 0
m_Name: TestAssertions
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &622392413
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 622392412}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 292727466}
m_RootOrder: 3
--- !u!114 &622392414
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 622392412}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8bafa54482a87ac4cbd7ff1bfd1ac93a, type: 3}
m_Name:
m_EditorClassIdentifier:
checkAfterTime: 0
repeatCheckTime: 0
repeatEveryTime: 1
checkAfterFrames: 1
repeatCheckFrame: 1
repeatEveryFrame: 1
hasFailed: 0
checkMethods: 2
m_ActionBase: {fileID: 2000112801}
checksPerformed: 0
--- !u!1 &679750555
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 142980, guid: 5e7fbc8d4eb714b279eeeef2262c1e1a, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 679750563}
- 114: {fileID: 679750556}
- 114: {fileID: 679750558}
- 114: {fileID: 679750557}
- 114: {fileID: 679750559}
- 114: {fileID: 679750560}
- 114: {fileID: 679750564}
- 114: {fileID: 679750562}
- 114: {fileID: 679750561}
- 114: {fileID: 679750566}
- 114: {fileID: 679750565}
m_Layer: 0
m_Name: Flowchart
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &679750556
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11430050, guid: 5e7fbc8d4eb714b279eeeef2262c1e1a,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7a334fe2ffb574b3583ff3b18b4792d3, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 1.0
scrollPos: {x: 0, y: 0}
variablesScrollPos: {x: 0, y: 0}
variablesExpanded: 1
blockViewHeight: 400
zoom: 1
scrollViewRect:
serializedVersion: 2
x: -380
y: -363
width: 1151
height: 1014
selectedBlock: {fileID: 679750558}
selectedCommands:
- {fileID: 679750557}
variables: []
description: 'This is a manual test to check that localization
works with the Say and Menu commands'
stepPause: 0
colorCommands: 1
hideComponents: 1
saveSelection: 1
localizationId:
--- !u!114 &679750557
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ec422cd568a9c4a31ad7c36d0572b9da, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 1
errorMessage:
indentLevel: 0
storyText: Say text
description:
character: {fileID: 1141038909}
portrait: {fileID: 0}
voiceOverClip: {fileID: 0}
showAlways: 1
showCount: 1
extendPrevious: 0
fadeIn: 0
fadeOut: 0
waitForClick: 1
setSayDialog: {fileID: 0}
--- !u!114 &679750558
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 11433304, guid: 5e7fbc8d4eb714b279eeeef2262c1e1a,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3d3d73aef2cfc4f51abf34ac00241f60, type: 3}
m_Name:
m_EditorClassIdentifier:
nodeRect:
serializedVersion: 2
x: 198
y: 128
width: 120
height: 40
itemId: 0
blockName: Say
description:
eventHandler: {fileID: 0}
commandList:
- {fileID: 679750557}
- {fileID: 679750559}
--- !u!114 &679750559
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 841589fc622bc494aa5405f416fa1301, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 2
errorMessage:
indentLevel: 0
text: Option text
description:
targetBlock: {fileID: 679750560}
hideIfVisited: 0
interactable:
booleanRef: {fileID: 0}
booleanVal: 1
setMenuDialog: {fileID: 0}
--- !u!114 &679750560
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3d3d73aef2cfc4f51abf34ac00241f60, type: 3}
m_Name:
m_EditorClassIdentifier:
nodeRect:
serializedVersion: 2
x: 197
y: 210
width: 120
height: 40
itemId: 3
blockName: Menu Option
description:
eventHandler: {fileID: 0}
commandList:
- {fileID: 679750566}
- {fileID: 679750565}
--- !u!114 &679750561
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d2f6487d21a03404cb21b245f0242e79, type: 3}
m_Name:
m_EditorClassIdentifier:
parentBlock: {fileID: 679750564}
--- !u!114 &679750562
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 050fb9e6e72f442b3b883da8a965bdeb, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 5
errorMessage:
indentLevel: 0
targetFlowchart: {fileID: 0}
targetBlock: {fileID: 679750558}
callMode: 2
--- !u!4 &679750563
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 467082, guid: 5e7fbc8d4eb714b279eeeef2262c1e1a, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 292727466}
m_RootOrder: 1
--- !u!114 &679750564
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3d3d73aef2cfc4f51abf34ac00241f60, type: 3}
m_Name:
m_EditorClassIdentifier:
nodeRect:
serializedVersion: 2
x: 196
y: 42
width: 120
height: 40
itemId: 4
blockName: Start
description:
eventHandler: {fileID: 679750561}
commandList:
- {fileID: 679750562}
--- !u!114 &679750565
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 050fb9e6e72f442b3b883da8a965bdeb, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 9
errorMessage:
indentLevel: 0
targetFlowchart: {fileID: 0}
targetBlock: {fileID: 679750558}
callMode: 0
--- !u!114 &679750566
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 679750555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3fc625e237d6048bf86f34835d8266d9, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 8
errorMessage:
indentLevel: 0
languageCode: FR
--- !u!1 &881473892
GameObject:
m_ObjectHideFlags: 0
@ -844,6 +1243,53 @@ CanvasRenderer:
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1134558494}
--- !u!1 &1141038907
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 100000, guid: b20518d45890e4be59ba82946f88026c, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 1141038908}
- 114: {fileID: 1141038909}
m_Layer: 0
m_Name: Character
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1141038908
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 400000, guid: b20518d45890e4be59ba82946f88026c, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1141038907}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 292727466}
m_RootOrder: 2
--- !u!114 &1141038909
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11400000, guid: b20518d45890e4be59ba82946f88026c,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1141038907}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 25fb867d2049d41f597aefdd6b19f598, type: 3}
m_Name:
m_EditorClassIdentifier:
nameText: Character Name
nameColor: {r: 1, g: 1, b: 1, a: 1}
soundEffect: {fileID: 0}
profileSprite: {fileID: 0}
portraits: []
portraitsFace: 0
description:
--- !u!1 &1242222009
GameObject:
m_ObjectHideFlags: 0
@ -1051,6 +1497,26 @@ RectTransform:
m_AnchoredPosition: {x: 33, y: 89}
m_SizeDelta: {x: 550, y: 50}
m_Pivot: {x: .5, y: .5}
--- !u!114 &2000112801
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 58783f051e477fd4e93b42ec7a43bb64, type: 3}
m_Name:
m_EditorClassIdentifier:
go: {fileID: 331926888}
thisPropertyPath: Localization.activeLanguage
compareToType: 1
other: {fileID: 0}
otherPropertyPath:
constantValueGeneric:
compareType: 0
comparisonType: 4
ignoreCase: 0
--- !u!1 &2104226803
GameObject:
m_ObjectHideFlags: 0

Loading…
Cancel
Save