Skip to content

Commit cf6d8a9

Browse files
committed
Create LocalizedTMPTextBinder.cs
1 parent 5c1ddd6 commit cf6d8a9

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

LocalizedTMPTextBinder.cs

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
#if UNITY_EDITOR
2+
#define UNITY_EDITOR_MODE
3+
#endif
4+
5+
using TMPro;
6+
using UnityEngine;
7+
using UnityEngine.Localization.Components;
8+
9+
#if UNITY_EDITOR_MODE
10+
using UnityEditor;
11+
using UnityEditor.Events;
12+
#endif
13+
14+
namespace RimuruDev
15+
{
16+
/// <summary>
17+
/// Компонент для автоматической привязки локализованного текста TextMeshPro (TMP_Text)
18+
/// с помощью LocalizeStringEvent.
19+
/// </summary>
20+
[SelectionBase]
21+
[ExecuteAlways]
22+
[DisallowMultipleComponent]
23+
[RequireComponent(typeof(TMP_Text))]
24+
[RequireComponent(typeof(RectTransform))]
25+
[RequireComponent(typeof(CanvasRenderer))]
26+
[RequireComponent(typeof(LocalizeStringEvent))]
27+
[AddComponentMenu("0x_/Localization/" + nameof(LocalizedTMPTextBinder))]
28+
public sealed class LocalizedTMPTextBinder : MonoBehaviour
29+
{
30+
private void Awake() =>
31+
SetupBindings();
32+
33+
private void Reset() =>
34+
SetupBindings();
35+
36+
private void OnDestroy()
37+
{
38+
#if UNITY_EDITOR_MODE
39+
var localizeStringEvent = GetComponent<LocalizeStringEvent>();
40+
if (localizeStringEvent != null)
41+
{
42+
RemovePersistentListener(localizeStringEvent);
43+
}
44+
#endif
45+
}
46+
47+
/// <summary>
48+
/// Настраивает связь между LocalizeStringEvent и TMP_Text.
49+
/// </summary>
50+
private void SetupBindings()
51+
{
52+
var localizeStringEvent = GetComponent<LocalizeStringEvent>();
53+
var tmpText = GetComponent<TMP_Text>();
54+
55+
if (localizeStringEvent == null || tmpText == null)
56+
return;
57+
58+
#if UNITY_EDITOR_MODE
59+
if (!HasPersistentListener(localizeStringEvent))
60+
{
61+
AddPersistentListener(localizeStringEvent);
62+
}
63+
#endif
64+
ClearText();
65+
66+
void ClearText() => tmpText.text = string.Empty;
67+
}
68+
69+
#if UNITY_EDITOR_MODE
70+
/// <summary>
71+
/// Проверяет, добавлен ли обработчик обновления текста.
72+
/// </summary>
73+
private bool HasPersistentListener(LocalizeStringEvent localizeStringEvent)
74+
{
75+
for (var i = 0; i < localizeStringEvent.OnUpdateString.GetPersistentEventCount(); i++)
76+
{
77+
if (localizeStringEvent.OnUpdateString.GetPersistentTarget(i) == this &&
78+
localizeStringEvent.OnUpdateString.GetPersistentMethodName(i) == nameof(UpdateTMPText))
79+
{
80+
return true;
81+
}
82+
}
83+
84+
return false;
85+
}
86+
87+
/// <summary>
88+
/// Добавляет обработчик обновления текста для TMP_Text.
89+
/// </summary>
90+
private void AddPersistentListener(LocalizeStringEvent localizeStringEvent)
91+
{
92+
UnityEventTools.AddPersistentListener(localizeStringEvent.OnUpdateString, UpdateTMPText);
93+
EditorUtility.SetDirty(localizeStringEvent);
94+
}
95+
96+
/// <summary>
97+
/// Удаляет обработчик обновления текста для TMP_Text.
98+
/// </summary>
99+
private void RemovePersistentListener(LocalizeStringEvent localizeStringEvent)
100+
{
101+
for (var i = localizeStringEvent.OnUpdateString.GetPersistentEventCount() - 1; i >= 0; i--)
102+
{
103+
if (localizeStringEvent.OnUpdateString.GetPersistentTarget(i) == this &&
104+
localizeStringEvent.OnUpdateString.GetPersistentMethodName(i) == nameof(UpdateTMPText))
105+
{
106+
UnityEventTools.RemovePersistentListener(localizeStringEvent.OnUpdateString, i);
107+
}
108+
}
109+
110+
EditorUtility.SetDirty(localizeStringEvent);
111+
}
112+
#endif
113+
114+
/// <summary>
115+
/// Обновляет текст TMP_Text.
116+
/// </summary>
117+
/// <param name="value">Новое значение локализованного текста.</param>
118+
private void UpdateTMPText(string value)
119+
{
120+
var tmpText = GetComponent<TMP_Text>();
121+
if (tmpText != null)
122+
{
123+
tmpText.text = value;
124+
}
125+
}
126+
}
127+
}

0 commit comments

Comments
 (0)