Components for integrate FuryDB with unity.
This package depend from FuryDB. First install it using this instruction
Or this link
https://github.com/ze0nni/FDB.git
Second dependency is Fury.Strings install it by follow link:
https://github.com/ze0nni/FuryStrings.git
Thirdly. Install FuryDB Components package by this link:
https://github.com/ze0nni/FuryDB.Components.git
Read details how to work with FuryDB Here. Now look how to work with localizations text.
For example create table with texts Index:
[FuryDB("Assets/Resources/DB.json.txt", "Assets/Kinds.cs")]
[JsonConverter(typeof(DBConverter<DB>))]
class DB {
public Index<TextConfig> Texts;
}
class TestConfig {
public Kind<TextConfig> Kind;
public string En;
public string Ru;
}And here Boot class of yor game. You need load database and store it in static variable.
class Boot : MonoBehaviour
{
public static DB DB { get; private set; }
private void Awake()
{
DB = DBResolver.Load<DB>();
}
}And fill it with same data:
Lets create component who can render localizable text:
using UnityEngine;
using FDB.Components;
using UnityEngine.UI;
using FDB;
class TextComponent : TextComponentBase<DB, TextConfig, TextResolver>
{
// Here you can add any text renderer compont
// Like Text TMP_Text or TextMeshProUGUI
[SerializeField] Text _textUIComponent;
protected override void Render(string text)
{
if (_textUIComponent)
{
//And just apply result string in Render function
_textUIComponent.text = text;
}
}
}
struct TextResolver : ITextResolver<TextConfig>
{
public Index<TextConfig> Index => Boot.DB.Texts;
public string GetText(TextConfig config) => config.Ru;
}You must declare three types in TextComponentBase<>:
- First
DB- type of your database class - Second
TextConfig- class you using for store localization strings - And last
TextResolver- this in empty struct who can two fields:- Indext - this property return data static data from
DB.Textsyou loaded inBoot - GetText(TextConfig config) - this function know about player language and return prefred string. An implementation might look like this:
public string GetText(TextConfig config) { switch (Application.systemLanguage) { case SystemLanguage.Russian: return config.Ru; default: return config.En; } }
- Indext - this property return data static data from
Now go to scene gameobject with and create Text and TextComponent. Dont forget drag Text to field Text UI Component.
Check if toggle Translate is on and click to Link button. Select in drop down menu item level_n
As you see Text display string from config:
If you want manipulate with format string this is simple:
class Boot : MonoBehaviour
{
public static DB DB { get; private set; }
// Add link to TextComponent from scene
[SerializeField] TextComponent _level;
private void Awake()
{
DB = DBResolver.Load<DB>();
// And set value for argument {0}
_level.SetArgs(99);
}
}Run game and enjoy result:
TextComponent has method to manipulate with text:
This method turn off toggle Translate and display textTex as is.
_textComponent.SetText("{0}/{1}");
_textComponent.SetArgs(3, 5)Will render text "3 / 5"
This method turn on toggle Translate and
begin use TextConfig to localize text.
You can find texts kinds in Kinds.cs this class generate from database data. For example
_textComponent.SetText(Kinds.Texts.weapon_name_sword);This is not recommended, but you can create composite Kind in runtime:
var lang = Application.systemLanguage;
_textComponent.SetText(new Kind<TextConfig>($"language_{lang}"));Component will try search Config with same Kind./
You can get Kind from other configs. For example UnitConfig has field Name with type Ref<TextConfig>
class DB {
Index<UnitConfig> Units;
Index<TextConfig> Texts;
}
class Unit {
public Kind<Unit> Kind;
public Ref<TextConfig> Name;
}
void DisplayUnitName(UnitConfig unit) {
_unitName.SetText(unit.Name.Kind);
}If you have settings where player can chane language in runtime you need modify TextComponent for catch events of change language
static class PlayerSettings {
public static event Action OnLanguageChanged;
public static SystemLanguage Language { get; private set; }
public static void UpdateLanguage(SystemLanguage value) {
Language = value;
OnLanguageChanged?.Invoke();
}
}
class TextComponent : TextComponentBase<DB, TextConfig, TextResolver>
{
[SerializeField] Text _textUIComponent;
void OnEnable()
{
// Just call SetDirty when settings changed
PlayerSettings.OnLanguageChanged += SetDirty;
}
void OnDisable()
{
PlayerSettings.OnLanguageChanged -= SetDirty;
}
protected override void Render(string text)
{
if (_textUIComponent)
{
_textUIComponent.text = text;
}
}
}
struct TextResolver : ITextResolver<TextConfig>
{
public Index<TextConfig> Index => Boot.DB.Texts;
public string GetText(TextConfig config) {
// Use language from PlayerSettings
switch (PlayerSettings.Language) {
case SystemLanguage.Russian:
return config.Ru;
default:
return config.En;
}
}
}FyruDB Components containst classes for work with color palette from configs. First declare confgis for in-game colors:
class DB {
public Input<TextConfig> Texts;
public Input<ColorConfig> Colors;
}
public class ColorConfig {
public Kind<ColorConfig> Kind;
public Color Color;
}Next create class for store color data:
Warning
Dont forget [Serializable] attribute
[Serializable]
class ColorValue : ColorValueBase<DB, ColorConfig, ColorResolver>
{
}
struct ColorResolver : IColorResolver<ColorConfig>
{
public Index<ColorConfig> Index => Boot.DB.Colors;
public Color GetColor(ColorConfig config) => config.Color;
public Color[] GetColors(ColorConfig config) => new Color[] { config.Color };
}And modify TextComponent for use palette's:
class TextComponent : TextComponentBase<DB, TextConfig, TextResolver>
{
[SerializeField] ColorValue _color; //ColorField
[SerializeField] Text _textUIComponent;
//Methods for update color in runtime
public void SetColor(Color color)
{
_color.SetColor(color);
SetDirty(); // Dont forget mark component for repaint
}
public void SetColor(Kind<ColorConfig> kind)
{
_color.SetColor(kind);
SetDirty();
}
protected override void Render(string text)
{
if (_textUIComponent)
{
_textUIComponent.text = text;
_textUIComponent.color = _color.Color; // Apply color to text
}
}
}Now you can use ColorValue in other components it's peek data from ColorConfig.







