Skip to content

Commit f34c57e

Browse files
committed
Create LocalizedImageBinder.cs
1 parent 41cb950 commit f34c57e

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

LocalizedImageBinder.cs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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

Comments
 (0)