#Case
Renk eşleştirme mekaniği üzerine kurulu, konveyör bazlı bir mobil puzzle oyunu. Oyuncu, ızgara üzerindeki renkli küpleri temizlemek için CollectableBox'ları seçip konveyöre gönderiyor. CollectableBox'lar ilerlerken kendi renkleriyle eşleşen küpleri absorbe ediyor ve grid temizlenince seviye tamamlanıyor.
GithubMP4.mp4
- Ekrandaki CollectableBox kutularından birine tıklayıp konveyöre gönderiyorsun
- Konveyörde ilerleyen CollectableBox, önüne gelen ve kendi rengiyle eşleşen küpleri çekiyor
- Bir CollectableBox tüm çekme kapasitesini doldurunca yok oluyor
- Tüm renkli küpler temizlenirse seviye kazanılıyor
- CollectableBox'lar konveyor boyunca farklı yönlere dönebiliyor, bu sayede grid'in farklı taraflarına bakıp küp alabiliyorlar
Oyun iki ayrı state machine üzerine kurulu:
- MainStateMachine — Oyun mantığını yönetiyor:
Start → Game → Finish - UIStateMachine — UI akışını yönetiyor:
Start → InGame → LevelEnd
Seviyeler ayrı scene'ler değil, ScriptableObject tabanlı LevelData asset'lerinden runtime'da üretiliyor. Her seviye bir texture'dan okunuyor; texture'ın piksel renkleri küp grid'ini oluşturuyor. Level editörü tamamen Odin Inspector üzerine kurulu, Unity inspector'dan texture atayıp grid boyutu ayarlayıp küpleri boyayabiliyorsun.
Üç ayrı grid var:
| Grid | Görev |
|---|---|
| ColorCubeGridSystem | Temizlenmesi gereken renkli küpler |
| CollectableBoxGridSystem | Konveyöre gönderilmeyi bekleyen CollectableBox'lar |
| ReservedSlotGridSystem | Atım hakkı bitmeden konveyordan çıkan CollectableBox'lar için bekleme alanı |
CollectableBoxlar konveyörde ilerlerken her frame raycast atıyor. Raycast bir küpe çarparsa ve renkler eşleşiyorsa küp absorbe ediliyor. Küp fiziksel olarak CollectableBox'a doğru uçuyor, animasyon tamamlandıktan sonra hem sayaç güncelleniyor hem de shake animasyonu oynuyor. Birden fazla küp aynı anda havada uçabilir ama _pendingAbsorbs sayacı sayesinde kapasite aşımı olmuyor.
CoreInstaller tüm sistem referanslarını Awake'de initialize ediyor (DefaultExecutionOrder -100). Event-driven iletişim için GameEvents kullanılıyor.
| Araç | Kullanım Amacı |
|---|---|
| Unity (URP) | Render pipeline |
| DOTween Pro | Tüm animasyonlar |
| Dreamteck Splines | Konveyör yolu ve hareket sistemi |
| UniTask | Async/await operasyonları |
| Odin Inspector | Level editörü ve inspector araçları |
| New Input System | Dokunmatik ve mouse input yönetimi |
Assets/GameAssets/
├── Scripts/
│ ├── Core/ # Dependency injection, başlangıç setup'ı
│ ├── Data/ # GameSettings ScriptableObject
│ ├── Event/ # Oyun içi event sistemi
│ ├── Game/ # Oyun mekanikleri (CollectableBox, küp, konveyör, grid)
│ ├── Level/ # Level üretimi ve yönetimi
│ ├── Managers/ # GameManager, InputManager
│ ├── Pools/ # Object pooling sistemi
│ ├── SaveSystem/ # JSON tabanlı kayıt sistemi
│ ├── State Machine/ # Ana oyun ve UI state machine'leri
│ └── UI/ # UIGame, UIWin, UIFail sayfaları
├── Scenes/
│ └── GameScene.unity # Tek sahne, her şey runtime'da üretiliyor
├── Scriptable/
│ ├── Settings/ # GameSettings asset'i
│ └── Levels/ # Level_1 - Level_4 asset'leri
└── Level Textures/ # Seviye grid'lerini oluşturan texture'lar
Yeni bir seviye eklemek için LevelData ScriptableObject'i oluşturup şu adımları takip etmek yeterli:
- Texture ata — genişlik/yükseklik otomatik olarak küp grid boyutunu belirler
- Create Colors butonuna bas — texture analiz edilip benzer renkler gruplandırılır
- Initialize Grid — CollectableBox grid'i oluşturulur
- Alt kısımdaki renk paletinden renk seç, grid hücrelerine tıklayarak CollectableBox'ları yerleştir
- Z ile çekme kapasitesini artır, X ile azalt
- Check Shooter Values ile toplam kapasitelerin küp sayılarıyla eşleştiğini doğrula
Oyuncu ilerleme bilgisi JSON formatında cihaza kaydediliyor. Şu an kaydedilen tek veri mevcut seviye numarası. Sistem interface tabanlı (ISaveSystem) yazıldığı için farklı bir kayıt yöntemiyle değiştirmek kolay.