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