1+ #if UNITY_EDITOR
2+ #define UNITY_EDITOR_MODE
3+ #endif
4+
5+ using UnityEngine ;
6+ using UnityEngine . UI ;
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+ /// Компонент для автоматической привязки локализованных спрайтов к Image с помощью LocalizeSpriteEvent.
18+ /// </summary>
19+ [ SelectionBase ]
20+ [ ExecuteAlways ]
21+ [ DisallowMultipleComponent ]
22+ [ RequireComponent ( typeof ( Image ) ) ]
23+ [ RequireComponent ( typeof ( RectTransform ) ) ]
24+ [ RequireComponent ( typeof ( LocalizeSpriteEvent ) ) ]
25+ [ AddComponentMenu ( "0x_/Localization/" + nameof ( LocalizedImageBinder ) ) ]
26+ public sealed class LocalizedImageBinder : MonoBehaviour
27+ {
28+ private void Awake ( ) =>
29+ SetupBindings ( ) ;
30+
31+ private void Reset ( ) =>
32+ SetupBindings ( ) ;
33+
34+ private void OnDestroy ( )
35+ {
36+ #if UNITY_EDITOR_MODE
37+ var localizeSpriteEvent = GetComponent < LocalizeSpriteEvent > ( ) ;
38+ if ( localizeSpriteEvent != null )
39+ {
40+ RemovePersistentListener ( localizeSpriteEvent ) ;
41+ }
42+ #endif
43+ }
44+
45+ /// <summary>
46+ /// Настраивает связь между LocalizeSpriteEvent и Image.
47+ /// </summary>
48+ private void SetupBindings ( )
49+ {
50+ var localizeSpriteEvent = GetComponent < LocalizeSpriteEvent > ( ) ;
51+ var image = GetComponent < Image > ( ) ;
52+
53+ if ( localizeSpriteEvent == null || image == null )
54+ return ;
55+
56+ #if UNITY_EDITOR_MODE
57+ if ( ! HasPersistentListener ( localizeSpriteEvent ) )
58+ {
59+ AddPersistentListener ( localizeSpriteEvent ) ;
60+ }
61+ #endif
62+ ClearSprite ( ) ;
63+
64+ void ClearSprite ( ) =>
65+ image . sprite = null ;
66+ }
67+
68+ #if UNITY_EDITOR_MODE
69+ /// <summary>
70+ /// Проверяет, добавлен ли обработчик обновления спрайта.
71+ /// </summary>
72+ private bool HasPersistentListener ( LocalizeSpriteEvent localizeSpriteEvent )
73+ {
74+ for ( var i = 0 ; i < localizeSpriteEvent . OnUpdateAsset . GetPersistentEventCount ( ) ; i ++ )
75+ {
76+ if ( localizeSpriteEvent . OnUpdateAsset . GetPersistentTarget ( i ) == this &&
77+ localizeSpriteEvent . OnUpdateAsset . GetPersistentMethodName ( i ) == nameof ( UpdateImageSprite ) )
78+ {
79+ return true ;
80+ }
81+ }
82+
83+ return false ;
84+ }
85+
86+ /// <summary>
87+ /// Добавляет обработчик обновления спрайта для Image.
88+ /// </summary>
89+ private void AddPersistentListener ( LocalizeSpriteEvent localizeSpriteEvent )
90+ {
91+ UnityEventTools . AddPersistentListener ( localizeSpriteEvent . OnUpdateAsset , UpdateImageSprite ) ;
92+ EditorUtility . SetDirty ( localizeSpriteEvent ) ;
93+ }
94+
95+ /// <summary>
96+ /// Удаляет обработчик обновления спрайта для Image.
97+ /// </summary>
98+ private void RemovePersistentListener ( LocalizeSpriteEvent localizeSpriteEvent )
99+ {
100+ for ( var i = localizeSpriteEvent . OnUpdateAsset . GetPersistentEventCount ( ) - 1 ; i >= 0 ; i -- )
101+ {
102+ if ( localizeSpriteEvent . OnUpdateAsset . GetPersistentTarget ( i ) == this &&
103+ localizeSpriteEvent . OnUpdateAsset . GetPersistentMethodName ( i ) == nameof ( UpdateImageSprite ) )
104+ {
105+ UnityEventTools . RemovePersistentListener ( localizeSpriteEvent . OnUpdateAsset , i ) ;
106+ }
107+ }
108+
109+ EditorUtility . SetDirty ( localizeSpriteEvent ) ;
110+ }
111+ #endif
112+
113+ /// <summary>
114+ /// Обновляет спрайт компонента Image.
115+ /// </summary>
116+ /// <param name="sprite">Новый локализованный спрайт.</param>
117+ private void UpdateImageSprite ( Sprite sprite )
118+ {
119+ var image = GetComponent < Image > ( ) ;
120+ if ( image != null )
121+ {
122+ image . sprite = sprite ;
123+ }
124+ }
125+ }
126+ }
0 commit comments