tag:github.com,2008:https://github.com/RimuruDev/Unity-LocalizedImageBinder/releasesRelease notes from Unity-LocalizedImageBinder2024-12-28T12:21:00Ztag:github.com,2008:Repository/909341564/v1.0.0.02024-12-28T12:23:23Zv1.0.0.0<h1>LocalizedImageBinder</h1>
<p><code>LocalizedImageBinder</code> — это компонент Unity, предназначенный для автоматизации процесса связывания <code>LocalizeSpriteEvent</code> с компонентом <code>Image</code>. Скрипт устраняет необходимость ручной настройки в инспекторе, автоматически добавляя и управляя обработчиками событий, связанными с локализацией спрайтов.</p>
<h2>Основная задача</h2>
<p>При использовании Unity Localization в связке с компонентами <code>Image</code> часто требуется вручную привязывать событие <code>OnUpdateAsset</code> к свойству <code>sprite</code> объекта <code>Image</code>. Это может быть трудоёмким и подверженным ошибкам процессом, особенно в проектах с большим количеством локализованных спрайтов. Этот компонент решает проблему автоматической привязки, что экономит время и снижает вероятность ошибок.</p>
<h2>Особенности</h2>
<ul>
<li>Автоматическая привязка <code>LocalizeSpriteEvent</code> к <code>Image.sprite</code>.</li>
<li>Удаление "висячих" подписок при удалении компонента.</li>
<li>Работа в режиме редактора и игры.</li>
<li>Гарантированное отсутствие дублирующихся подписок.</li>
<li>Простая интеграция с существующими проектами.</li>
</ul>
<h2>Установка</h2>
<ol>
<li>Скопируйте скрипт <code>LocalizedImageBinder</code> в папку <code>Scripts</code> вашего Unity проекта.</li>
<li>Убедитесь, что у вас установлены следующие зависимости:
<ul>
<li><a href="https://docs.unity3d.com/Packages/com.unity.ugui@latest" rel="nofollow">Unity UI</a>.</li>
<li><a href="https://docs.unity3d.com/Packages/com.unity.localization@latest" rel="nofollow">Unity Localization</a>.</li>
</ul>
</li>
</ol>
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/85500556/399073099-6822d4a7-a013-4aac-822e-1fa2338db7ba.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzMwOTktNjgyMmQ0YTctYTAxMy00YWFjLTgyMmUtMWZhMjMzOGRiN2JhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEzZmUyNmUzN2QwYTVkNjU1ZjY4NmY4M2Y3ZjJmYTFmZTJkMjBiNWYzODBhZTZkNTg1OGNkMzY3NjdiNWQ1YWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lyvZND6rFtg73jRkBBS10Anv6GMNcTKsVrxP11tN_Ug"><img width="779" alt="image" src="https://private-user-images.githubusercontent.com/85500556/399073099-6822d4a7-a013-4aac-822e-1fa2338db7ba.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzMwOTktNjgyMmQ0YTctYTAxMy00YWFjLTgyMmUtMWZhMjMzOGRiN2JhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEzZmUyNmUzN2QwYTVkNjU1ZjY4NmY4M2Y3ZjJmYTFmZTJkMjBiNWYzODBhZTZkNTg1OGNkMzY3NjdiNWQ1YWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lyvZND6rFtg73jRkBBS10Anv6GMNcTKsVrxP11tN_Ug" content-type-secured-asset="image/png" style="max-width: 100%;"></a>
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/85500556/399079038-8a3b6141-c9ce-40ac-a480-185931e318c3.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzkwMzgtOGEzYjYxNDEtYzljZS00MGFjLWE0ODAtMTg1OTMxZTMxOGMzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYyNDQ1N2Q4NmVhNGMwMWQ5MDM3MmJjNDEwNDQ1MzAyYzc1NjBhM2JhN2VkYjIxNTk2ODQ3YzM1ODNhOTJjYzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YycIbIVxfAQ78LWu5KFakQUvLAEsQ_4-vsPT7yKvObc"><img width="760" alt="image" src="https://private-user-images.githubusercontent.com/85500556/399079038-8a3b6141-c9ce-40ac-a480-185931e318c3.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzkwMzgtOGEzYjYxNDEtYzljZS00MGFjLWE0ODAtMTg1OTMxZTMxOGMzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYyNDQ1N2Q4NmVhNGMwMWQ5MDM3MmJjNDEwNDQ1MzAyYzc1NjBhM2JhN2VkYjIxNTk2ODQ3YzM1ODNhOTJjYzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YycIbIVxfAQ78LWu5KFakQUvLAEsQ_4-vsPT7yKvObc" content-type-secured-asset="image/png" style="max-width: 100%;"></a>
<hr>
<h2>Использование</h2>
<ol>
<li>Добавьте компонент <code>LocalizedImageBinder</code> на объект с компонентом <code>Image</code>.</li>
<li>Убедитесь, что на том же объекте уже присутствует компонент <code>LocalizeSpriteEvent</code>. Если его нет, Unity автоматически добавит его благодаря атрибуту <code>[RequireComponent]</code>.</li>
<li>В инспекторе настройте таблицу и записи локализации для компонента <code>LocalizeSpriteEvent</code>.</li>
</ol>
<hr>
<h2>Пример :D</h2>
<h3>До использования</h3>
<p>Вручную настройте <code>LocalizeSpriteEvent</code>:</p>
<ol>
<li>Добавьте компонент <code>LocalizeSpriteEvent</code>.</li>
<li>Вручную свяжите событие <code>OnUpdateAsset</code> с <code>Image.sprite</code>.</li>
<li>Убедитесь, что подписка корректно настроена.</li>
</ol>
<h3>После использования</h3>
<p>Просто добавьте компонент <code>LocalizedImageBinder</code> на объект, и всё произойдёт автоматически:</p>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="[AddComponentMenu("0x_/Localization/LocalizedImageBinder")]"><pre><span class="pl-kos">[</span><span class="pl-s1">AddComponentMenu</span><span class="pl-kos">(</span><span class="pl-s">"0x_/Localization/LocalizedImageBinder"</span><span class="pl-kos">)</span><span class="pl-kos">]</span></pre></div>
<h3>Результат</h3>
<ul>
<li><code>OnUpdateAsset</code> автоматически настроено на обновление <code>Image.sprite</code>.</li>
<li>Подписка удаляется при удалении компонента.</li>
</ul>
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/85500556/399079149-02ba6d51-bc10-4b07-b84d-c82182512cb8.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzkxNDktMDJiYTZkNTEtYmMxMC00YjA3LWI4NGQtYzgyMTgyNTEyY2I4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYwMTRlNDA0MWQ3NDkzOWEzNzRkNDRjOGFmZDE1N2IzMGY3MzFlNWE5MDQwZTQ0NTE4ZWIzMzg0N2MyNjRhM2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lUJ2apk5c0UM_Gqag59QxZShrvbVGc0ZTIetGzgsjlk"><img width="522" alt="image" src="https://private-user-images.githubusercontent.com/85500556/399079149-02ba6d51-bc10-4b07-b84d-c82182512cb8.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjgyOTM2MTQsIm5iZiI6MTc2ODI5MzMxNCwicGF0aCI6Ii84NTUwMDU1Ni8zOTkwNzkxNDktMDJiYTZkNTEtYmMxMC00YjA3LWI4NGQtYzgyMTgyNTEyY2I4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTEzVDA4MzUxNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYwMTRlNDA0MWQ3NDkzOWEzNzRkNDRjOGFmZDE1N2IzMGY3MzFlNWE5MDQwZTQ0NTE4ZWIzMzg0N2MyNjRhM2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lUJ2apk5c0UM_Gqag59QxZShrvbVGc0ZTIetGzgsjlk" content-type-secured-asset="image/png" style="max-width: 100%;"></a>
<hr>
<h2>Ограничения :3</h2>
<ul>
<li>Работает только с компонентом <code>Image</code>. Для других компонентов (например, <code>RawImage</code>) потребуется модификация скрипта.</li>
<li>Динамическая привязка работает только для <code>LocalizeSpriteEvent</code> на том же объекте.</li>
</ul>
<hr>
<h2>Проблемы, которые решает :3</h2>
<ul>
<li>Устранение ручной настройки связей между <code>LocalizeSpriteEvent</code> и <code>Image</code>.</li>
<li>Предотвращение накопления ненужных подписок, которые могут вызывать утечки памяти или ошибки.</li>
<li>Повышение удобства и автоматизация локализации спрайтов.</li>
</ul>
<hr>
<h2>Как это работает :3</h2>
<ol>
<li>При добавлении компонента <code>LocalizedImageBinder</code>:
<ul>
<li>Проверяется наличие <code>LocalizeSpriteEvent</code> и <code>Image</code>.</li>
<li>Если их нет, они добавляются автоматически.</li>
<li>Настраивается связь между <code>OnUpdateAsset</code> и <code>Image.sprite</code>.</li>
</ul>
</li>
<li>При удалении компонента:
<ul>
<li>Все подписки очищаются, чтобы избежать утечек.</li>
</ul>
</li>
<li>В режиме редактора:
<ul>
<li>Обеспечивается возможность визуального контроля через инспектор.</li>
</ul>
</li>
</ol>
<hr>
<h2>Атрибуты :3</h2>
<ul>
<li><code>[SelectionBase]</code>: Выделяет объект с компонентом <code>LocalizedImageBinder</code> при клике на дочерние объекты в сцене. Это упрощает выбор объекта в сложных иерархиях.</li>
<li><code>[DisallowMultipleComponent]</code>: Запрещает добавлять несколько экземпляров компонента <code>LocalizedImageBinder</code> на один объект, предотвращая дублирование логики и возможные ошибки.</li>
<li><code>[ExecuteAlways]</code>: Обеспечивает выполнение компонента как в режиме игры, так и в режиме редактора. Это полезно для автоматической настройки в редакторе.</li>
<li><code>[RequireComponent]</code>: Гарантирует наличие необходимых компонентов <code>Image</code>, <code>LocalizeSpriteEvent</code> и <code>RectTransform</code>, предотвращая ошибки, если какой-либо из них отсутствует.</li>
</ul>
<hr>
<h2>Лицензия ;3</h2>
<p>Этот скрипт распространяется на условиях MIT License :3</p>
<p><strong>Full Changelog</strong>: <a href="https://github.com/RimuruDev/Unity-LocalizedImageBinder/commits/v1.0.0.0">https://github.com/RimuruDev/Unity-LocalizedImageBinder/commits/v1.0.0.0</a></p>RimuruDev