Как реализовать локализацию без Update и перезагрузки игры в Unity?
Сделал так, но из-за Update теряется производительность...
public GameObject rusIMG, engIMG;
public string ru, en;
Text text;
void Start () {
text = GetComponent<Text>();
if (PlayerPrefs.GetString ("lang") == "en") {
engIMG.SetActive (false);
rusIMG.SetActive (true);
}
if (PlayerPrefs.GetString ("lang") == "ru") {
rusIMG.SetActive (false);
engIMG.SetActive (true);
}
}
void Update () {
if (rusIMG.activeSelf) {
if (ru != "") {
text.text = ru;
}
}
if (engIMG.activeSelf) {
if (en != "") {
text.text = en;
}
}
}
void OnMouseDown()
{
switch (gameObject.name)
{
case "eng":
PlayerPrefs.SetString ("lang" , "en");
engIMG.SetActive (false);
rusIMG.SetActive (true);
break;
case "rus":
PlayerPrefs.SetString ("lang" , "ru");
rusIMG.SetActive (false);
engIMG.SetActive (true);
break;
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
Наконец оказался у компа
using UnityEngine.Events;
public enum kLengvich { English, Russian }
[System.Serializable]
public class LengvichEvent : UnityEvent<kLengvich> { }
public class Lengvich : MonoBehaviour {
public kLengvich CurrentLengvich;
public LengvichEvent LengvichChange;
private void Awake() {
LengvichChange = new LengvichEvent();
MyConstance.Lengvich = this; // Даем ссылку в статический класс, что бы не заморачиваться с сылками
}
public void Set (kLengvich lengvich) { // <-- Меняет язык
CurrentLengvich = lengvich;
LengvichChange.Invoke(CurrentLengvich);
}
}
public static class MyConstance {
public static Lengvich Lengvich;
}
// .....
using UnityEngine.UI;
public class LengvichText : MonoBehaviour {
[SerializeField] private string _textRu;
[SerializeField] private string _textEn;
private Text _text;
private void Awake () {
_text = gameObject.GetComponent<Text>();
if (MyConstance.Lengvich != null) { // Обращаемся через статический класс
MyConstance.Lengvich.LengvichChange.AddListener(ChangeLengvich);
ChangeLengvich(MyConstance.Lengvich.CurrentLengvich);
}
}
private void ChangeLengvich (kLengvich lengvich) {
switch (lengvich) {
case kLengvich.English: _text.text = _textEn; break;
case kLengvich.Russian: _text.text = _textRu; break;
}
}
}
// .....
MyConstance.Lengvich.Set(kLengvich.English); // <-- Установили английский
Или еще проще, без UnityEvent через Singleton.
public enum kLengvich { English, Russian }
public delegate void LengvichDelegate (kLengvich lengvich);
public class Lengvich {
private static Lengvich instance;
public static Lengvich getInstance () {
if (instance == null)
instance = new Lengvich();
return instance;
}
public kLengvich CurrentLengvich { get; private set; }
private List<LengvichDelegate> _delegates;
private Lengvich () {
_delegates = new List<LengvichDelegate>();
}
public void Set (kLengvich lengvich) {
CurrentLengvich = lengvich;
if (_delegates != null)
foreach (LengvichDelegate ld in _delegates)
if (ld != null)
ld(CurrentLengvich);
}
public void AddListener (LengvichDelegate changeLengvich) {
if (_delegates != null)
_delegates.Add(changeLengvich);
}
public void RemoveListener (LengvichDelegate changeLengvich) {
if (_delegates != null)
_delegates.Remove(changeLengvich);
}
}
// .....
public class LengvichText : MonoBehaviour {
private void Awake () {
Lengvich.getInstance().AddListener(ChangeLengvich);
}
private void OnDestroy () {
Lengvich.getInstance().RemoveListener(ChangeLengvich);
}
private void ChangeLengvich (kLengvich lengvich) {
}
}
// .....
Lengvich.getInstance().Set(kLengvich.English);