# 🎨 ShiroginSDK Theme System (v1.0.0) **Dynamic UI Skin Management • ServiceLocator Architecture • Scriptable Themes** ShiroginSDK’nin **Theme System**’i, oyun içi UI öğelerinin (ikonlar, arka planlar, butonlar vb.) görünümünü merkezi ve modüler bir şekilde yönetmeni sağlar. Tüm temalar **enum tabanlı**, **ScriptableObject destekli**, **event-driven** bir yapıda çalışır. --- ## 🚀 1. Amaç Bu sistemin hedefi, farklı temalar arasında **anında geçiş** sağlamak ve UI öğelerinin görünümünü **kod değiştirmeden** yönetmektir. **Temel Hedefler:** - 🎨 Farklı temalar arasında runtime geçiş - 🔁 Tema değiştiğinde tüm UI’nın otomatik yenilenmesi - 💾 Oyuncunun seçtiği temanın kaydedilmesi (`ThemeData`) - 🧩 Enum tabanlı erişim (string hatalarına karşı güvenli) - ⚡ `ScriptableObject` tabanlı profil yapısı --- ## 🧱 2. Sistem Bileşenleri | Bileşen | Açıklama | |----------|-----------| | **ThemeAssetType** | Görsel tiplerini (ikon, arka plan, vb.) enum olarak listeler | | **ThemeProfile** | Tek bir temaya ait sprite eşlemelerini tutar | | **ThemeRepository** | Tüm `ThemeProfile` varlıklarını barındırır | | **ThemeService** | Aktif temayı yönetir, `ServiceLocator` ile erişilir | | **ThemeImage** | UI `Image` bileşenlerine otomatik sprite ataması yapar | | **ThemeData** | Oyuncunun aktif temasını ve açılmış temaları saklar | --- ## 🧩 3. ThemeAssetType.cs UI görsellerinin türlerini `enum` olarak tanımlar. Kod içinde string kullanmadan, **type-safe** erişim sağlar. ```csharp public enum ThemeAssetType { None = 0, // ICONS Icon_SettingsButton, Icon_VibrationButton, // BACKGROUNDS Background_MainMenu, Background_PopupSuccess, // CURRENCIES Icon_Currency_Gold, Icon_Currency_Gem, } ```` --- ## 🗂️ 5. ThemeRepository Tüm temaları tek bir ScriptableObject altında toplar. Örneğin: * `Default` * `Dark` * `Snow` * `Halloween` Unity’de oluşturmak için: > **Right Click → Create → ShiroginSDK → Theme → Theme Repository** Ardından `ThemeProfile` varlıklarını listeye ekle. --- ## 🧠 6. ThemeService (Yeni Sistem) `ThemeService`, artık `ServiceBase`’ten türetilir ve `ServiceLocator` aracılığıyla erişilir. Tüm bağımlılıklarını (`IDataService`, `IEventService`) otomatik çözer. ### Başlatma `ShiroginServiceRegistry.InitializeAll();` çağrısı ile otomatik olarak başlatılır. `SDKConfig.themeRepository` üzerinden `ThemeRepository` referansını yükler. ```csharp var themeService = ServiceLocator.Get(); themeService.SetTheme("Snow"); ``` --- ### 🎨 Aktif Tema Değiştirme ```csharp var themeService = ServiceLocator.Get(); themeService.SetTheme("Dark"); ``` Bu işlem: 1. `_repository` içinden “Dark” temasını bulur 2. `ThemeChanged` event’ini yayınlar 3. `ThemeData.ActiveTheme`’i kaydeder 4. Tüm `ThemeImage` bileşenlerini otomatik yeniler --- ### 🧩 Sprite Alma ```csharp var themeService = ServiceLocator.Get(); var icon = themeService.GetSprite(ThemeAssetType.Icon_SettingsButton); myButton.image.sprite = icon; ``` --- ### 💾 Kaydetme & Yükleme Aktif tema `ThemeData` aracılığıyla otomatik olarak saklanır ve oyun açılışında geri yüklenir. ```csharp var dataService = ServiceLocator.Get(); var themeData = dataService.Get(); Debug.Log($"Active Theme: {themeData.ActiveTheme}"); ``` --- ## 🧰 7. ThemeImage.cs Herhangi bir `Image` bileşenine eklenir. Seçilen `ThemeAssetType`’a göre sprite’ı otomatik günceller. Tema değiştiğinde event’ler aracılığıyla yeniden sprite ataması yapılır. **Kullanım:** 1. UI objene `ThemeImage` component’i ekle 2. `assetType` alanında örneğin `Icon_SettingsButton` seç 3. Tema değiştiğinde sprite otomatik değişir --- ## 💾 8. ThemeData.cs Oyuncunun aktif temasını ve açılmış temalarını saklar. Oyun açılışında `DataService` tarafından otomatik yüklenir. ```csharp public class ThemeData : BaseData { protected override string PrefsKey => "THEME_DATA"; public string ActiveTheme = "Default"; public List UnlockedThemes = new() { "Default" }; } ``` --- ## 🔄 9. Akış Mantığı ``` [SDKInitializer] ↓ ThemeService → Load from ThemeRepository ↓ ThemeData.ActiveTheme → Set Active ↓ ThemeChanged Event ↓ ThemeImage components update automatically ``` --- ## 🌈 10. Tema Geçişi Örneği ```csharp using ShiroginSDK.Runtime.Services.Interfaces; using UnityEngine; public class ThemeSwitcher : MonoBehaviour { public void OnClick_SnowTheme() { ServiceLocator.Get().SetTheme("Snow"); } public void OnClick_DefaultTheme() { ServiceLocator.Get().SetTheme("Default"); } } ``` --- ## 🌟 11. Özellikler | Özellik | Açıklama | | ---------------------------- | -------------------------------------------- | | 💾 Kalıcı Kayıt | `ThemeData` aracılığıyla otomatik kaydedilir | | 🔄 Gerçek Zamanlı Güncelleme | Tema değişince tüm UI otomatik yenilenir | | 🧩 Modüler | Yeni tema eklemek yalnızca 1 dakika sürer | | 🎨 Editor Dostu | ScriptableObject tabanlı sistem | | ⚡ Optimize | Sadece aktif tema bellekte tutulur | | 🧱 Tip Güvenli | Enum tabanlı erişim ile string hatası yok | --- ## 💡 12. Geliştirici Tavsiyeleri * Her temaya kısa, net bir isim ver (`Default`, `Dark`, `Snow`) * Sprite atlaslarını kullanarak performansı artır * `ThemeImage` ile manuel sprite değişiminden kaçın * Tema varlıklarını düzenli tut (`Assets/ShiroginSDK/Themes/`) * `ThemeRepository` içine tüm temaları dahil etmeyi unutma --- ## ✅ 13. Özet ShiroginSDK Theme System v1.0.0: * UI görsellerini tek yerden yönetmeni sağlar * Oyuncu seçimini kaydeder ve yeniden yükler * Enum tabanlı tip güvenli sistemle çalışır * `ServiceLocator` mimarisiyle SDK’nın diğer servisleriyle uyumludur --- **Prepared by:** Emir Han MAMAK **Version:** 1.1.0 (2025.12) **Module:** ShiroginSDK.Runtime.Services.Implementations.UI.ThemeService --- **Scriptable Objects :** ![DarkTheme](https://i.imgur.com/kpxL5x2.png) ![FireTheme](https://i.imgur.com/tik1x6a.png) ![SnowTheme](https://i.imgur.com/n6eqh2o.png)