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

251 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎨 ShiroginSDK Theme System (v1.0.0)
**Dynamic UI Skin Management • ServiceLocator Architecture • Scriptable Themes**
ShiroginSDKnin **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 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 | 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`
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 `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<IThemeService>();
themeService.SetTheme("Snow");
```
---
### 🎨 Aktif Tema Değiştirme
```csharp
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.ActiveTheme`i kaydeder
4. Tüm `ThemeImage` bileşenlerini otomatik yeniler
---
### 🧩 Sprite Alma
```csharp
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.
```csharp
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 `ThemeAssetType`a 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.
```csharp
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
```csharp
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 | 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 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](https://i.imgur.com/kpxL5x2.png)
![FireTheme](https://i.imgur.com/tik1x6a.png)
![SnowTheme](https://i.imgur.com/n6eqh2o.png)