Playvoi/Playvoi.Client/Assets/ShiroginSDK/Documents/UI/ThemeService.md

6.5 KiB
Raw Blame History

🎨 ShiroginSDK Theme System (v1.0.0)

Dynamic UI Skin Management • ServiceLocator Architecture • Scriptable Themes

ShiroginSDKnin Theme Systemi, 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 UInı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 ı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.

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

Unityde 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 ServiceBaseten 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.

var themeService = ServiceLocator.Get<IThemeService>();
themeService.SetTheme("Snow");

🎨 Aktif Tema Değiştirme

var themeService = ServiceLocator.Get<IThemeService>();
themeService.SetTheme("Dark");

Bu işlem:

  1. _repository içinden “Dark” temasını bulur
  2. ThemeChanged eventini yayınlar
  3. ThemeData.ActiveThemei kaydeder
  4. Tüm ThemeImage bileşenlerini otomatik yeniler

🧩 Sprite Alma

var themeService = ServiceLocator.Get<IThemeService>();
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.

var dataService = ServiceLocator.Get<IDataService>();
var themeData = dataService.Get<ThemeData>();

Debug.Log($"Active Theme: {themeData.ActiveTheme}");

🧰 7. ThemeImage.cs

Herhangi bir Image bileşenine eklenir. Seçilen ThemeAssetTypea göre spriteı otomatik günceller. Tema değiştiğinde eventler aracılığıyla yeniden sprite ataması yapılır.

Kullanım:

  1. UI objene ThemeImage componenti 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.

public class ThemeData : BaseData
{
    protected override string PrefsKey => "THEME_DATA";

    public string ActiveTheme = "Default";
    public List<string> 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

using ShiroginSDK.Runtime.Services.Interfaces;
using UnityEngine;

public class ThemeSwitcher : MonoBehaviour
{
    public void OnClick_SnowTheme()
    {
        ServiceLocator.Get<IThemeService>().SetTheme("Snow");
    }

    public void OnClick_DefaultTheme()
    {
        ServiceLocator.Get<IThemeService>().SetTheme("Default");
    }
}

🌟 11. Özellikler

Özellik ı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 SDKnı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
FireTheme SnowTheme