diff --git a/app/Http/Controllers/CareerController.php b/app/Http/Controllers/CareerController.php index 8c8b83a..5749b29 100644 --- a/app/Http/Controllers/CareerController.php +++ b/app/Http/Controllers/CareerController.php @@ -427,9 +427,18 @@ class CareerController extends Controller ]; }); + $unapprovedCount = \App\Models\InternshipJournalEntry::where('supervisor_approved', false) + ->whereNotNull('content') + ->where('content', '!=', '') + ->whereHas('careerApplication', function ($q) { + $q->where('type', 'internship'); + }) + ->count(); + return view('front.career.admin_dashboard', [ 'allInterns' => $allInterns, 'ganttInterns' => $ganttInterns, + 'unapprovedCount' => $unapprovedCount, 'meta' => [ 'title' => 'Staj Yönetici Paneli', 'description' => 'Stajyer bilgilerini ve takvimlerini izleyin.', @@ -740,5 +749,53 @@ class CareerController extends Controller ] ]); } + + public function getQuickApprovalEntries(Request $request) + { + if (!auth()->check() || !auth()->user()->hasRole('super_admin')) { + return response()->json(['success' => false, 'message' => 'Yetkisiz işlem.'], 403); + } + + $type = $request->query('type', 'unapproved'); // 'unapproved' or 'today' + $date = $request->query('date'); + + $query = \App\Models\InternshipJournalEntry::with('careerApplication') + ->whereHas('careerApplication', function ($q) { + $q->where('type', 'internship'); + }); + + if ($type === 'today') { + $targetDate = $date ?: \Carbon\Carbon::today()->format('Y-m-d'); + $query->whereDate('date', $targetDate); + } elseif ($type === 'unapproved') { + $query->where('supervisor_approved', false); + } + + // Only return entries that have content + $query->whereNotNull('content')->where('content', '!=', ''); + + $entries = $query->orderBy('date', 'desc')->get()->map(function ($entry) { + return [ + 'id' => $entry->id, + 'day_number' => $entry->day_number, + 'date' => $entry->date, + 'formatted_date' => \Carbon\Carbon::parse($entry->date)->format('d.m.Y'), + 'content' => $entry->content, + 'is_retroactive' => (bool)$entry->is_retroactive, + 'supervisor_approved' => (bool)$entry->supervisor_approved, + 'supervisor_name' => $entry->supervisor_name, + 'intern' => [ + 'id' => $entry->careerApplication->id, + 'name' => $entry->careerApplication->name, + 'email' => $entry->careerApplication->email, + ] + ]; + }); + + return response()->json([ + 'success' => true, + 'entries' => $entries + ]); + } } diff --git a/resources/views/front/career/admin_dashboard.blade.php b/resources/views/front/career/admin_dashboard.blade.php index 12217d7..3b6e168 100644 --- a/resources/views/front/career/admin_dashboard.blade.php +++ b/resources/views/front/career/admin_dashboard.blade.php @@ -23,6 +23,14 @@ Stajyer Listesi ve Detaylı Takip + + @@ -35,6 +43,10 @@ @include('front.career.partials.list') +
+ @@ -632,6 +644,12 @@ } } } + + if (targetId === 'quick-approval') { + if (typeof loadQuickApprovalEntries === 'function') { + loadQuickApprovalEntries(); + } + } } }); }); diff --git a/resources/views/front/career/partials/quick_approval.blade.php b/resources/views/front/career/partials/quick_approval.blade.php new file mode 100644 index 0000000..a41b576 --- /dev/null +++ b/resources/views/front/career/partials/quick_approval.blade.php @@ -0,0 +1,525 @@ + +Stajyerlerin günlük yazdığı raporları tek bir ekrandan inceleyin ve onaylayın.
+Defter kayıtları yükleniyor...
+Şu anda onayınızı bekleyen hiçbir stajyer raporu bulunmuyor.
+1. Gün (01.07.2026) Çalışma Raporu<\/strong><\/p> Bugün staj sürecimin ilk günüydü ve projemizin teknik altyapısını kurarak işe koyuldum. \"Recycle-Rush-VR\" isimli VR tabanlı geri dönüşüm projemiz için ilk adımları attım.<\/p> Kazanım:<\/strong> Bugün, bir yazılım projesinde kod yazmaktan çok, o projenin nasıl disiplinli bir şekilde yönetileceğini öğrendim. Branch ve Pull Request mantığını kullanarak ana kodu korumayı ve işlerimi planlı bir şekilde Kanban panosunda takip etmeyi pratik ettim.<\/p>",
+ "is_retroactive": false,
+ "supervisor_approved": true,
+ "unit_approved": false
+ },
+ {
+ "day_number": 2,
+ "date": "2026-07-02",
+ "content": " 2. Gün (02.07.2026) Çalışma Raporu<\/strong><\/p> Bugün proje için Meta Quest Android build ayarlarını yaptım. Unity projesini Android platformuna geçirerek gerekli yapılandırmaları kontrol ettim. Android Build Support, OpenJDK ve Android SDK\/NDK kurulumlarını doğruladım. Daha sonra Player Settings bölümünde Package Name, API Level, IL2CPP ve ARM64 ayarlarını Meta Quest'e uygun şekilde düzenledim.<\/p> OpenXR ve Meta Quest XR ayarlarını kontrol ederek gerekli özelliklerin aktif olduğunu doğruladım. Quality ve Graphics ayarlarını inceleyip Android platformu için uygun yapılandırmayı kullandım.<\/p> Ayrıca proje dokümantasyonunu düzenledim. Yaptığım değişiklikleri Git üzerinde yeni bir branch oluşturarak kaydettim. Değişiklikleri commit ettikten sonra GitHub'a gönderip Pull Request oluşturarak kod incelemesine sundum.<\/p>",
+ "is_retroactive": false,
+ "supervisor_approved": true,
+ "unit_approved": false
+ },
+ {
+ "day_number": 3,
+ "date": "2026-07-03",
+ "content": " 3. Gün (03.07.2026) Çalışma Raporu<\/strong><\/p> Bugün proje için kullanılacak Low-Poly modelleri araştırdım ve projeye uygun ücretsiz kaynaklardan indirdim. İndirdiğim modelleri Unity projesine eklemeden önce düzenli bir klasör yapısı oluşturdum. Bu kapsamda Assets\/ThirdParty\/Models<\/strong> dizini altında Environment<\/strong>, Props<\/strong> ve Waste<\/strong> klasörlerini oluşturarak modelleri kullanım alanlarına göre kategorilere ayırdım.<\/p> Environment<\/strong> klasörüne fabrika ortamında kullanılacak çevre, zemin, platform ve konveyör bant modellerini, Props<\/strong> klasörüne varil, palet, koli ve benzeri yardımcı nesneleri, Waste<\/strong> klasörüne ise geri dönüştürülebilir atık modellerini yerleştirdim. Bu sayede proje içerisindeki üçüncü taraf varlıkları daha düzenli ve yönetilebilir bir yapıda topladım.<\/p> Daha sonra modelleri Unity projesine import ederek sahne içerisinde kontrollerini yaptım. Model ve materyalleri inceleyerek karşılaştığım uyumluluk sorunlarını gidermeye çalıştım ve gerekli materyal ayarlarını proje ile uyumlu hale getirmek için düzenledim.<\/p> Ayrıca GitHub üzerinde bu çalışma için ayrı bir görev (Issue) oluşturdum. Oluşturduğum görev üzerinden yeni bir branch açarak çalışmaya başladım ve Git akışına uygun şekilde commit ve Pull Request süreci için hazırlık yaptım.<\/p> Git Commit Mesajları:<\/strong><\/p> 4. Gün (04.07.2026) Çalışma Raporu<\/strong><\/p> Bugün oyunun ana sahnesi olan <\/span>MainGame<\/strong> üzerinde blockout çalışmasını gerçekleştirdim. İlk olarak oyun alanının temel yapısını oluşturmak için zemin, duvarlar, taşıma bandı ve geri dönüşüm kutularının yerleşimini planlayarak sahneye ekledim. Oyuncunun hareket edeceği alanı daha rahat görebilmek amacıyla nesnelerin konumlarını ve ölçeklerini düzenledim. Ayrıca oyuncunun oyuna başlayacağı <\/span>SpawnArea<\/strong>, atıkların oluşacağı <\/span>WasteSpawner<\/strong> ve geri dönüşüm işleminin gerçekleştirileceği <\/span>DropZone<\/strong> nesnelerini oluşturarak sahnede uygun konumlara yerleştirdim.<\/span><\/p> Daha sonra VR altyapısını hazırlamak amacıyla <\/span>XR Interaction Toolkit<\/strong> paketi içerisindeki <\/span>Starter Assets<\/strong> paketini projeye kurdum. Kurulum tamamlandıktan sonra <\/span>XR Origin<\/strong> bileşenini sahneye ekleyerek oyuncu kamerası ve kontrolcü yapısını oluşturdum. XR Origin hiyerarşisini inceleyerek kamera, sol ve sağ kontrolcü nesnelerinin doğru şekilde oluşturulduğunu kontrol ettim. Kurulum sırasında gerekli ayarları gözden geçirerek XR bileşenlerinin sorunsuz çalışmasını sağladım.<\/span><\/p> Son olarak oluşturduğum sahneyi Unity üzerinde test ederek nesnelerin yerleşimini, oyuncunun başlangıç konumunu ve XR Origin yapısının doğru çalışıp çalışmadığını kontrol ettim. Yapılan çalışmalar sonucunda ana oyun sahnesinin temel yapısını ve VR geliştirme altyapısını bir sonraki geliştirme aşamasına hazır hale getirdim.<\/span><\/p> Git Commit Mesajları:<\/strong><\/p> 5. Gün (07.07.2026) Çalışma Raporu<\/strong><\/p> Bugün, Recycle Rush VR projesinin temel oyun döngüsünün (core loop) ilk adımı olan taşıma bandı sistemi üzerine çalıştım. Oyuncunun etkileşime gireceği atıkların sahneye sürekli ve düzenli bir şekilde akmasını sağlayacak bu sistemin pürüzsüz çalışması çok önemliydi. Özellikle VR projelerinde objelerin takılarak hareket etmesi deneyimi çok bozduğu için optimizasyona dikkat etmem gerekiyordu.<\/p> Geliştirmeye başlarken öncelikle proje hiyerarşisini düzenli tutmak adına Assets\/_App\/Scripts\/Environment dizini altında BeltMovement.cs adında yeni bir script oluşturdum. Başlangıçta objeleri sadece Update döngüsü içinde transform.position değiştirerek kaydırmayı denedim. Fakat XR Device Simulator ile yaptığım ilk testlerde, objelerin bant üzerinde ilerlerken ciddi şekilde titrediğini (jittering) ve takılmalar yaşadığını fark ettim.<\/p> Bu titreme sorununu çözmek için hareketi tamamen Unity'nin fizik motoruna devretmeye karar verdim. Sahnedeki taşıma bandı objesine bir Rigidbody komponenti ekledim ve yerçekiminden etkilenmemesi için isKinematic özelliğini aktif ettim. Kod tarafında ise hareketi Update yerine fizik hesaplamalarının yapıldığı FixedUpdate fonksiyonuna taşıdım. Bandı kod ile çok küçük bir miktar ileri hareket ettirip, hemen ardından Rigidbody.MovePosition komutuyla tekrar eski konumuna çeken bir mantık kurdum. Bu sayede bant görsel olarak sabit kalsa da, fizik motoru üzerinde bir hareket algıladığı için bandın üzerine düşen atık objeleri sürtünme kuvvetiyle pürüzsüzce ileriye doğru kaydırmaya başladı.<\/p> Scriptin yazımını tamamladıktan sonra sahnede ilgili objeye atamasını yaptım ve hız değişkenlerini (speed) Unity Inspector üzerinden ayarlanabilir hale getirdim. Son olarak VR başlığını sürekli tak-çıkar yapıp zaman kaybetmemek adına XR Device Simulator kullanarak simülasyonu çalıştırdım. Yaptığım testler sonucunda objelerin bant üzerinde hiçbir titreme yapmadan, akıcı bir şekilde oyuncuya doğru aktığını doğruladım.<\/p> Günün ikinci yarısında, projenin sadece koddan ibaret olmaması ve sürdürülebilir olması adına dokümantasyon çalışmalarına ağırlık verdim. GitHub repomuzda Wiki sekmesini aktif ederek oyunun \"Kurulum\", \"Kullanılan Teknolojiler\", \"Proje Yapısı\" ve \"Proje Hakkında\" gibi temel sayfalarını oluşturdum. Geliştirdiğimiz mimariyi ve sistem gereksinimlerini buraya detaylıca işledim.<\/p> Son olarak süreç yönetimimizi daha da profesyonelleştirmek için GitHub Discussions sekmesini kullanmaya başladım. Burada \"Sprint 1 Retrospective\" (1. Sprint Değerlendirmesi) adında bir tartışma başlığı açtım. Geride bıraktığımız ilk sprintte neleri iyi yaptığımızı, nerelerde zorlandığımızı (örneğin fizikteki titreme sorunu) ve bir sonraki sprintte nasıl daha hızlı ilerleyebileceğimizi değerlendirdik. Gerek Kanban board kullanımı, gerekse PR (Pull Request) ve Issue eşleştirmeleriyle proje yönetimi açısından oldukça verimli ve disiplinli bir günü geride bırakmış olduk.<\/p> Git Commit Mesajları:<\/strong><\/p> 6. Gün (08.07.2026) Çalışma Raporu<\/strong><\/p> Bugün, Recycle Rush VR projesinde oyuncunun taşıma bandından alıp geri dönüşüm kutularına atacağı temel atık objelerinin oyun motoruna entegrasyonunu gerçekleştirdim. Takım içi görev dağılımımız kapsamında ben Plastik ve Kağıt atıkların kurulumunu üstlenirken, takım arkadaşım Cam ve Metal atıklar üzerinde çalıştı. Paralel çalışarak hem süreci hızlandırdık hem de GitHub üzerinde aynı dosyalara müdahale etmekten kaynaklanabilecek \"merge conflict\" (çakışma) durumlarının önüne geçtik.<\/span><\/p> Çalışmalarıma başlamadan önce staj hocamın verdiği çok değerli bir tavsiyeyi iş akışıma dahil ettim: Gün sonu devasa tek bir commit atmak yerine, yapılan her anlamlı değişikliği küçük ve takip edilebilir parçalar halinde (Atomic Commits) versiyon kontrol sistemine göndermek. Bu prensiple bugünkü görevimi iki mantıksal aşamaya böldüm.<\/span><\/p> İlk aşamada oyunun atık ayrıştırma (sorting) algoritmasının altyapısını kurdum. Oyuncunun elindeki objeyi doğru kutuya attığını kod üzerinden algılayabilmemiz için Unity Project Settings üzerinden Plastic, Paper, Glass ve Metal etiketlerini (Tag) sisteme tanımladım. Ardından Plastik atıklara odaklandım. Sahip olduğumuz 3D FBX modellerini (su şişesi, şampuan kutusu vb.) doğrudan prefab yapmanın ileride model güncellemelerinde referans sorunlarına (Missing Prefab) yol açabileceğini biliyordum. Bu yüzden modelleri önce sahneye alıp Prefab > Unpack Completely komutuyla orijinal model bağlarını tamamen kopardım. Ardından her birine, plastiğin hafifliğini simüle edecek şekilde kütlesi (mass) 0.5 olan bir Rigidbody ekledim. VR'da performans kaybı yaşamamak ve objeyi tutma (grab) etkileşimlerini pürüzsüz kılmak adına, objelerin tam şeklini saran Mesh Collider bileşeni ekleyip Convex özelliğini aktif ettim. Bu 5 farklı plastik modeli kendi klasörümüzde bağımsız \"Original Prefab\" haline getirdikten sonra, bu değişiklikleri daha önce oluşturduğum Tag tanımlamalarıyla birlikte aynı commit içerisinde kayıt altına aldım.<\/span><\/p> Son aşamada ise aynı işlemleri Kağıt objeleri (karton kutu, defter, parşömen vb.) için uyguladım. Kağıdın plastiğe göre daha hafif olması gerektiğinden kütle değerlerini 0.2 olarak ayarladım. Bu çalışmayı ayrı bir commit ile kayıt altına aldım. Günün sonunda, temiz ve okunabilir bir Git geçmişiyle (history) kodlarımı uzak sunucuya (origin) Push ettim ve takım arkadaşımın incelemesi için bir Pull Request (PR) açtım.<\/span><\/p> Bugünkü çalışmalarım sayesinde hem Unity'de \"Nested Prefab\" (içe içe şablon) mantığının risklerini öğrenip doğru şablonlamayı (Solid Blue Box) kavradım, hem de versiyon kontrol sistemini sadece bir yedekleme aracı olarak değil, geliştirme sürecinin detaylı bir günlüğü olarak kullanma alışkanlığı kazandım.<\/span><\/p> Git Commit Mesajları:<\/strong><\/p> 7. Gün (09.07.2026) Çalışma Raporu<\/strong><\/p> Bugün, Recycle Rush VR projesinin temel oynanış hissini (Game Feel) doğrudan etkileyecek olan en önemli VR mekaniğini, yani atıkları banttan alıp fırlatma sistemini geliştirdim. Dün temel fizik ayarlarını (Rigidbody, Collider) tamamladığımız Plastik ve Kağıt atık prefab'larını, bugün oyuncunun sanal elleriyle etkileşime girebileceği hale getirdim.<\/p> İlk aşamada kendi branch'im üzerinden çalışarak tüm plastik ve kağıt objelere Unity XR Interaction Toolkit'in temel bileşeni olan XR Grab Interactable scriptini entegre ettim. VR'da objeleri tuttuğumuzda ağırlık hissini doğru verebilmek ve objelerin diğer fiziksel yüzeylerin içinden geçmesini engellemek için bileşen içerisindeki Movement Type ayarını Velocity Tracking olarak yapılandırdım. Ayrıca objenin aniden oyuncunun eline ışınlanmasının (snapping) yarattığı yapay hissiyatı kırmak için Smooth Position ve Smooth Rotation algoritmalarını aktif ettim.<\/p> İkinci aşamada, tutuş ergonomisini iyileştirmeye karar verdim. Örneğin bir kitabın veya büyük bir şişenin rasgele bir köşesinden tutulması VR deneyiminin inandırıcılığını bozuyordu. Bu sorunu çözmek için prefab'ların içine görünmez birer `GrabPoint` (Tutma Noktası) alt objesi (Child GameObject) oluşturarak, objelerin tam ağırlık merkezlerine yerleştirdim. Sonrasında bu objeleri XR Grab bileşenindeki Attach Transform özelliğine bağlayarak, oyuncunun atıkları kusursuz ve anatomik olarak doğal bir şekilde kavramasını sağladım. Çalışmalarımı XR Device Simulator ile test edip tüm işlemleri atomik commit'ler halinde uzak sunucuya Push ederek PR açtım.<\/p> Ancak bugünün bana kattığı en büyük tecrübe, staj hocamdan aldığımız Kod İncelemesi (Code Review) geri bildirimi oldu. Hocamız, ana oyun döngüsünü kontrol eden 2000 satırlık `MainGame.cs` dosyasının yazılım mimarisindeki meşhur \"God Object\" (Tanrı Nesne) anti-pattern'ine dönüştüğü uyarısını yaptı. Oyunun puanlamasını, atık üretimini ve bant hareketini tek bir dosyada yürütmenin \"Single Responsibility\" (Tek Sorumluluk) prensibini ihlal ettiğini teorik olarak kavramış olduk. Takım halinde projelerde yaşadığımız entegrasyon sıkıntılarının temel sebebinin de bu spagetti kod yapısı olduğunu fark ettik. Hocamızın tavsiyesi üzerine takım arkadaşımla toplantı yaparak, bir sonraki aşamanın ilk işi olarak bu devasa yapıyı `ScoreManager`, `WasteSpawner` gibi tek bir görevden sorumlu bağımsız modüllere parçalama (Refactoring) kararını aldık.<\/p> Git Commit Mesajları:<\/strong><\/p> 8. Gün (10.07.2026) Çalışma Raporu<\/strong><\/p> Bugün staj planımızdaki Spawner görevine ek olarak, oyunun mekaniklerini daha akıcı ve eğlenceli hale getirmek için çeşitli denemeler ve kodlamalar yaptım. <\/span><\/p> İlk olarak taşıma bandının başlangıcında rastgele atıklar üretecek olan `WasteSpawner.cs` scriptini yazdım. Spawner'ı basit bir sayaç yerine `Coroutine` kullanarak dinamik bir yapıya kavuşturdum; böylece ileride oyun hızlandığında üretim aralıklarını rahatça değiştirebileceğimiz bir altyapı kurmuş oldum. Testler sırasında çöplerin hep aynı saniyede ve bandın tam ortasına düştüğünü fark ettim. Oyunun bu robotik hissiyatını kırmak için üretim sürelerine `Random.Range` ile rastgelelik kattım ve çöplerin pozisyonlarına ufak bir sapma (offset) değeri ekledim. <\/span><\/p> Bu noktada bazı fiziksel problemlerle karşılaştım. Offset değerini başta 0.4f gibi yüksek tuttuğumda, büyük karton kutular bandı aşıp doğrudan yere düşüyordu; değeri 0.1f'e indirerek bu taşma problemini çözdüm. Ayrıca çöplerin farklı açılarla düşmesi için verdiğim 3D rotasyon yüzünden şişeler yan düşüp bantta yuvarlanıyordu. Rotasyonu `Quaternion.Euler` komutuyla sadece Y ekseninde (kendi etrafında) dönecek şekilde kısıtlayarak şişelerin bantta dik bir şekilde ilerlemesini sağladım. Spawner kısmını, aynı çöpün üst üste gelmesini engelleyen ufak bir anti-tekrar kontrolü yazarak tamamladım.<\/span><\/p> Günün ikinci yarısında, VR oyun hissiyatını (Game Feel) artırıp artıramayacağımızı test etmek için alternatif bir mekanik üzerine Ar-Ge yaptım. Çöplerin banttan düşmesi yerine uzay boşluğunda süzülmesini sağlayan `AntigravityItem.cs` adında yepyeni bir script yazdım. Bu kod ile objelerin yerçekimini kapatıp yukarı yönlü hafif bir süzülme kuvveti uyguladım. Objelerin oyuncu tarafından tutulduğunda veya fırlatıldığında normal fiziğine (gerçek dünya yerçekimine) dönmesi gerekiyordu. Bunun için Unity'nin XR Interaction Toolkit kütüphanesini araştırdım ve etkileşim event'lerini (`selectEntered` ve `selectExited`) koda bağlayarak objenin tutulma ve bırakılma durumlarını başarıyla kontrol ettim. <\/span><\/p> Bugün yazdığım kodları ve yaptığım fizik düzeltmelerini detaylı İngilizce açıklamalarla commit'leyip GitHub reposuna Push ettim ve günün görevini başarıyla tamamladım.<\/span><\/p> Git Commit Mesajları:<\/strong><\/p> 9. Gün (13.07.2026) Çalışma Raporu<\/strong><\/p> Bugün, takım arkadaşımla paylaştığımız görev dağılımı doğrultusunda oyunun Puan Sistemi (Score System) altyapısını kurmaya odaklandım. İlk olarak, puanı evrensel olarak yönetecek olan `ScoreManager.cs` sınıfını Singleton tasarım deseniyle oluşturdum. Sistemin işlemciyi yormaması (optimizasyon) adına `Update()` döngüleri kullanmak yerine olay güdümlü (Event-driven) bir mimari tercih ettim ve `Action<int>` (OnScoreChanged) event'ini yazdım.<\/p> Bu puanı ekranda göstermek için yazdığım `ScoreUI.cs` kodunu test ederken çok ilginç bir Unity hatasıyla karşılaştım. Puan arka planda artmasına rağmen arayüz (UI) güncellenmiyordu. Yaptığım debug testleri sonucunda bunun Unity'nin rastgele çalışma sırasından (Execution Order) kaynaklanan bir yarış durumu (Race Condition) olduğunu fark ettim. Dinleme (Subscribe) işlemini `OnEnable` metodundan `Start()` metoduna taşıyarak bu sorunu profesyonelce çözdüm.<\/p> Ardından dün yazılan `BinTrigger.cs` (Kutu Tetikleyicisi) kodu ile benim `ScoreManager` kodumu birbirine bağladım. Bunu yaparken kodların birbirine bağımlı (tight coupling) olmaması için sadece event'ler üzerinden iletişim kurmalarını sağladım. Doğru kutuda puan ekleme, yanlış kutuda ise matematiksel mutlak değer (`Mathf.Abs`) kullanarak puan düşürme mantığını kurguladım.<\/p> Test aşamasında VR projelerinin klasik bir sorunuyla yüzleştim: Çöplerin (Prefab) ana gövdesinde (Root) etiket (Tag) bulunmasına rağmen, çarpışma kutuları (Collider) alt objelerde (Child) olduğu için sistem çöpleri \"Untagged\" olarak görüyordu. `BinTrigger` kodunu güncelleyerek, çarpan objenin en üst atasına (`transform.root`) kadar çıkıp Tag aramasını sağladım ve sorun çözüldü. Ayrıca silinme (Destroy) işleminde havada boş obje (Memory Leak) kalmaması için her zaman Root objenin silinmesini zorunlu kıldım.<\/p> Son olarak, sahnede bulunan 20'den fazla çöp prefab'ına ilgili Tag'leri (Plastic, Glass, Metal, Paper) ekledim. Taşıma bandı ve spawner koordinatlarını düzelterek fiziksel patlamaların (Physics Explosion) önüne geçtim. Yaptığım tüm bu düzeltmeleri GitHub üzerinden iki ayrı \"Atomic Commit\" halinde paketleyip, ana projeye birleştirilmesi için Pull Request (PR) açarak bugünkü görevimi başarıyla tamamladım.<\/p> Git Commit Mesajları:<\/strong><\/p> 10. Gün (14.07.2026) Çalışma Raporu<\/strong><\/p> Bugün, projenin en kritik aşamalarından biri olan kullanıcı arayüzü (UI) sistemlerini VR standartlarına uygun hale getirmek üzerine yoğunlaştım. Geliştirme sürecimde fark ettim ki, geleneksel 2 boyutlu ve kameraya sabitlenmiş (Screen Space) menüler, sanal gerçeklik ortamında oyuncunun derinlik algısını bozuyor ve gerçeklik hissiyatını (immersion) ciddi şekilde zedeliyor. Bu problemi aşmak için oyun endüstrisinde standart bir pratik olan 'Diegetic UI' (oyun dünyasına fiziksel olarak entegre edilmiş arayüz) mimarisine geçiş yapmaya karar verdim. Bunun için sahneye fabrika temasına uygun, düşük poligonlu (low-poly) bir monitör modeli entegre ettim. Unity’nin arayüz sistemindeki Canvas bileşenini 'World Space' moduna alarak ve ölçeklendirme (scale) değerlerini optimize ederek, geri sayım sayacını ve oyunun anlık durumunu (Ana Menü, Oyun Başladı, Süre Bitti vb.) doğrudan bu fiziksel monitörün camına yansıttım.<\/p> Bu görsel sistemi arka planda verimli bir şekilde yönetebilmek için, mimariyi modüler tutmaya özen gösterdim. Tüm kodları tek bir dosyaya yığmak (spaghetti code) yerine, Tek Sorumluluk Prensibi'ne (Single Responsibility Principle) bağlı kalarak sadece arayüzü yönetecek bağımsız bir `UIManager.cs` sınıfı kodladım. Bu sınıf, her saniye kontrol döngüsü (Update) çalıştırmak yerine, `GameManager` üzerindeki olaylara (Event) abone (subscribe) olarak çalışıyor. Böylece gereksiz işlemci (CPU) kullanımının önüne geçerek projede önemli bir optimizasyon sağlamış oldum.<\/p> Test süreçlerim sırasında oyunun temel mekaniğini etkileyen kritik bir hata (bug) tespit ettim. Oyuncu atığı doğru kutuya atsa bile, sistem bazen atığı tanımıyor ve puan vermiyordu. Hiyerarşiyi incelediğimde, VR etkileşimleri (Grab Interactable) için hazırlanan prefab nesnelerinin iç içe geçmiş (nested) yapılardan oluştuğunu; etiketlerin (Tag) ana objede kalırken, çarpışmayı algılayan Collider'ların alt objelere kaydığını fark ettim. Bu kopukluğu gidermek için `BinTrigger.cs` sınıfındaki çarpışma algılama algoritmasını tamamen yeniden yazdım. String karşılaştırmaları yerine `GetComponentsInChildren` fonksiyonunu entegre ederek, çarpışan objenin tüm alt hiyerarşisini tarayan ve doğru etiketi her koşulda bulabilen hatasız (foolproof) bir sistem geliştirdim.<\/p> Günün son bölümünde, oyunun hissiyatını (game feel\/juice) artırmak için görsel geri bildirimler üzerine çalıştım. Oyuncu bir atığı kutuya attığında, puanın aniden değişmesinin yeterince tatmin edici olmadığını gözlemledim. Bu nedenle `ScoreUI.cs` dosyasına müdahale ettim. Unity'de sıkça kullanılan ancak performansı olumsuz etkileyebilen Coroutine yapıları yerine, matematiksel interpolasyon (`Vector3.Lerp` ve `Color.Lerp`) fonksiyonlarını kullandım. Yeni yazdığım bu sistem sayesinde, oyuncu doğru bir atış yaptığında puan yazısı pürüzsüzce büyüyüp yeşil renkte parlarken; hatalı bir atışta (ceza aldığında) kırmızıya dönerek küçülüyor. Yaptığım tüm bu geliştirmeler, projenin basit bir prototipten çıkıp profesyonel bir VR oyununa dönüşmesinde büyük rol oynadı.<\/p> Git Commit Mesajları:<\/strong><\/p> 11. Gün (16.07.2026) Çalışma Raporu<\/strong><\/p> Bugün stajımda projemizin hem arayüz altyapısını hazırladığım hem de oyun hissiyatını (Juice) büyük ölçüde artırdığım, benim için oldukça verimli bir gün oldu. Güne öncelikle oyun içi menülerimizde ve bilgi ekranlarında kullanacağımız kullanıcı arayüzü (UI) ikonlarını ve panel tasarımlarını projeye aktararak (import) başladım. Bu varlıkları klasörleyerek projenin içine dahil ettim. Böylece sadece düz yazılardan oluşan basit bir sistem yerine, daha profesyonel ve oyuncunun gözüne hitap eden bir menü altyapısının temelini atmış oldum.<\/p> Günün büyük bir kısmında ise projemizin en eğlenceli ve yaratıcı alanlarından biri olan Görsel Efektler (Particle System) üzerine yoğunlaştım. Atık ayrıştırma mekaniğinde oyuncuya daha iyi bir geri bildirim verebilmek için, doğru atık atıldığında kutunun içinden havai fişek gibi patlayan ve eriyerek kaybolan doğa temalı yeşil \"Başarı\" efektleri tasarladım. Ardından, oyuncu yanlış atık attığında gerçekten hata yaptığını hissetmesi için daha ağır olan (yerçekimi etkisi fazla), yere çakılan ve etrafa yayılan agresif kırmızı bloklardan oluşan \"Hata\" efektleri hazırladım.<\/p> Bu efektleri sadece Unity arayüzünde tasarlamakla kalmadım; kod tarafında (`BinTrigger.cs`) bunların atığın doğru veya yanlış olma durumuna göre nasıl dinamik olarak çağrılacağını (Instantiate) ve sahnede performansı düşürmemeleri için işleri bitince bellekten nasıl otomatik olarak silineceklerini (Destroy) kodladım. Geliştirme sırasında ufak tefek pürüzleri de aştım. Örneğin efektler ilk başta kutunun görünmeyen en alt kısmında patlıyordu. Araştırarak çarpışma kutusunun (Collider) tam tepe noktasını bulmayı başardım ve efekti VR'da tam olması gerektiği yere getirdim. Ayrıca Unity'de oyun çalışırken (Play modundayken) yapılan kod değişikliklerinin kaydedilmediğini de hataları çözerken bizzat yaşayarak tecrübe etmiş oldum.<\/p> Önceden bir oyun oynarken arayüz tasarımlarının veya o patlamaların arkasındaki mantığı hiç düşünmezdim. Bugün arayüz ikonlarını projeye dahil edip, üzerine kendi efektlerimi tasarlayarak oyuncuya o tatmin hissini verebilmenin ne kadar önemli olduğunu anladım. Gün geçtikçe Unity'nin yapısına ve yazılım geliştirme süreçlerine daha da hakim oluyorum.<\/p> Git Commit Mesajları:<\/strong><\/p> 12. Gün (17.07.2026) Çalışma Raporu<\/strong><\/p> Bugün oyunun en önemli hissiyat (Game Feel) unsurlarından biri olan \"Ses Sistemini\" kurmaya odaklandım. Projedeki tüm arka plan müziklerini (BGM) ve etkileşim ses efektlerini (SFX) tek bir merkezden, düzenli bir şekilde yönetebilmek için Singleton tasarım deseniyle `AudioManager.cs` betiğini yazdım. İlk testlerim sırasında, Unity'nin varsayılan 3 boyutlu ses oynatma fonksiyonu yüzünden (`PlayClipAtPoint`), VR ortamında oyuncu bir objeyi eline aldığında kollarının kameraya olan fiziksel uzaklığı sebebiyle seslerin sönümlenip oyuncuya çok kısık geldiğini fark ettim. Oyunun o tatmin edici ve duyarlı \"Arcade\" hissiyatını korumak için, etkileşim seslerinin tamamını doğrudan kulaklığın içine duyulan 2 boyutlu `PlayOneShot` komutuna çevirerek bu problemi başarıyla çözdüm.<\/span><\/p> Çalışmalarımamakine kolu (`MachineLever`) mekaniğini ses sistemime entegre ederek devam ettim. Spagetti koda sebep olmamak adına `MachineLever.cs` içerisine `OnLeverPulledAction` adında statik bir Event (sinyal) ekledim ve `AudioManager`'ın sadece bu sinyali dinleyerek kol çekilme sesini oynatmasını sağladım. Aynı zamanda oyun başladığında sürekli çalışacak bant motoru sesini (Engine Hum), doğrudan `GameManager`'ın durumlarına (`OnGameStateChanged`) abone yaparak dinamik hale getirdim. Bu süreçte Unity 6'nın yenilenmiş AudioSource Inspector arayüzündeki bazı atama problemleriyle ve kısıtlamalarla karşılaştım; bu sorunu ses dosyası atamalarını doğrudan script içerisinden `[SerializeField]` ile koda gömerek pratik bir şekilde aştım.<\/span><\/p> Günün son bölümünde, projenin uluslararası standartlara uygun olması için Türkçe olan \"ses\" klasörünün adını \"Sounds\" olarak refactor ettim ve televizyon panellerindeki tüm UI metinlerini İngilizceye yerelleştirdim. Ancak bu sırada dijital ekrandaki geri sayım sayacının bazen güncellenmediği şeklinde kritik bir hata keşfettim. Kodları incelediğimde bunun bir çalışma sırası (Script Execution Order) hatası olduğunu; `UIManager`'ın, `GameManager` ayağa kalkmadan önce null dönen event'lere abone olmaya çalıştığını fark edip kodun statik abonelik mantığını düzelterek bu yarışı (race condition) sonlandırdım. Buna ek olarak, VR ortamında objeleri tutarken oyuncunun sanal ellerinin görünmez olması gibi oyun deneyimini baltalayan bir sorunu, `XR Origin` bileşenindeki `Hide Controller On Select` özelliğini devre dışı bırakarak çözdüm. Bugün yaptığım tüm mimari geliştirmeleri ve bulduğum hata çözümlerini birbirine karıştırmadan 5 farklı \"Atomic Commit\" olacak şekilde GitHub'a Push ettim ve detaylı bir Pull Request açarak günün görevini başarıyla tamamladım.<\/span><\/p> Konu: <\/strong>Unity VR Proje İskeletinin Oluşturulması ve Versiyon Kontrol (Git) Ayarları<\/p> Yapılan Çalışmalar:<\/strong><\/p> Git Commit Mesajları:<\/strong><\/p>Recycle-Rush-VR<\/code> deposunu (repository) oluşturdum. Projenin versiyon kontrolünü sağlıklı bir şekilde yönetmek için gerekli ayarları yaptım.<\/li>implementation_plan.md<\/code> dosyasını hazırladım. Projenin teknik mimarisini, oyun döngüsünü ve 20 günlük çalışma planını bu dokümana işledim. Çalışmamı ana dala (main) dahil etmek için \"Pull Request\" sürecini başlattım, bu sayede hocalarımızın onayına sunmuş oldum.<\/li>
<\/p>docs<\/code> klasörü içerisindeki implementation plan dosyasını kontrol ettim. docs\/assets<\/code> klasörüne proje için hazırlanan logo, katmanlı uygulama ikonu (Layered App Icon), VR arayüz görselleri ve uygulama mockuplarını ekledim. README dosyasını bu görselleri gösterecek şekilde güncelleyerek proje tanıtımını daha düzenli hale getirdim.<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>",
+ "is_retroactive": false,
+ "supervisor_approved": true,
+ "unit_approved": false
+ },
+ {
+ "day_number": 9,
+ "date": "2026-07-13",
+ "content": "
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>
<\/p>",
+ "is_retroactive": true,
+ "supervisor_approved": false,
+ "unit_approved": false
+ },
+ {
+ "day_number": 12,
+ "date": "2026-07-16",
+ "content": "
<\/p>
<\/p>
<\/p>
<\/p>",
+ "is_retroactive": true,
+ "supervisor_approved": false,
+ "unit_approved": false
+ }
+ ]
+ },
+ {
+ "id": 19,
+ "name": "Ayşenur Ebrar Gündüz",
+ "email": "aysenurebrargunduzz@gmail.com",
+ "github_username": null,
+ "github_repo": null,
+ "internship_start_date": "2026-07-20",
+ "internship_end_date": "2026-08-14",
+ "journal_entries": []
+ },
+ {
+ "id": 20,
+ "name": "Hakan Üzer",
+ "email": "hakanuzer1@gmail.com",
+ "github_username": "Hakan460",
+ "github_repo": "https:\/\/github.com\/Emresatil\/Recycle-Rush-VR",
+ "internship_start_date": "2026-07-01",
+ "internship_end_date": "2026-08-30",
+ "journal_entries": [
+ {
+ "day_number": 1,
+ "date": "2026-07-01",
+ "content": "
<\/p>
<\/p>