Ana Sayfa Blog

Unity 2022 LTS yayında

0

Daha önce Tech Stream sürümünü duyurduğumuz 2022 sürümünde sonunda Unity 2022 LTS yayında! 1 Haziran 2023 tarihi itibariyle 2022.3 sürümü LTS (Long Term Support) olarak erişime sunuldu. Unity’ye göre 2022 sürümü sayesinde oyun geliştiriciler olarak daha esnek bir yapı içeren araçlarla oyunculara hayranlık bıraktıracak etkileşimler sunabileceğimiz gücü bize veriyor.

Genel hatlarıyla DOTS-ECS güncellemesi ve tam sürüm yayınlanması, multiplayer tarafındaki güncelleştirmeler, yüksek kaliteli görsellik üzerine yapılan çalışmalar sayesinde 2022 sürümü oyun geliştiriciler açısından dolu dolu diyebiliriz. 

Bu yazımızda da ana hatlarıyla bu güncelleştirmelere ve yeniliklere dair bilgi edinebileceksiniz. 

DOTS-ECS

Unity 2022 LTS yayında ve bu sürümle beraber ECS uygulamalarımızın yayınlanması aşamasında tam olarak kullanılabilecek ilk sürümüyle de yayınlandı. Daha basit haliyle belirtmemiz gerekirse ECS 1.0 sürümü bize sunuldu. ECS (Entity Component System) paketini tam sürüme geçmeden önce hali hazırda kullanmak da mümkündü. Ancak hem mimari olarak GameObjects yapısına alışkın geliştiricilere ayrı bir mücadele oluşturuyor hem de sistem tam olarak bütün ihtiyaçları karşılamıyordu. Bu sebeple ECS tam haliyle çıkması hem bu sistemi kullanmak isteyen hem de meraklı olan geliştiriciler için tam kıvama geldi diyebiliriz.

Özellikle yapılan güncellemelerle beraber GameObjects yapısını kullanmamıza sağlayan araçlar gibi, ECS yapısı için de editor üzerinde yeni araçlarımız bulunuyor. İlk duyurulduğunda ECS ile uğraşanları en çok korkutan şeylerden biri de bu araçların eksikliklerinden biriydi diyebiliriz. Böyle bir gelişme olması

ECS paketiyle beraber hali hazırda varolan Burst Compiler ve C# Jobs System sistemleriyle artık DOTS (Data-Oriented Technology Stack) ile geliştiricilerin eli performans dahil birden çok konuda güçlendi diyebiliriz. 

İşin güzel yanlarından biri aşina olduğumuz GameObjects yapısıyla beraber ECS sistemini kullanabilmemiz. Yani ihtiyaç duyduğumuz bir kısımda sadece ECS kullanmamız mümkün, hibrit bir yapı kullanılmasına müsaade ediyor bu sistem. Özellikle ilk defa ECS tarafına geçiş yapacaklar için bu özelliğin olması öğrenme açısından usandırmamaya teşvik edecektir diye düşünüyorum. 

Ancak bunun dışında, zaten elimizde hali hazırda çalışan sistemleri ECS yapısına uyarlamak da, ECS yapısına hakim olsak bile vakit harcamamız gereken bir şey olacak. Sadece DOTS yapısıyla beraber bize kazanç sağlayacak parçaları güncellemek verimlilik açısında çok iyi olacaktır. 

Bahsettiğim gibi DOTS yapısını kullanan bir sürü proje hali hazırda şu an pazarda bulunuyor. Ancak yakın zamanda duymuş olabileceğinizi düşündüğüm V Rising oyunu da Unity’nin örnek olarak sunduğu projelerden bir tanesi. Özellikle yüksek sayıda verinizi işlediğiniz çok fazla obje olma durumunu DOTS sayesinde nasıl çözümlediklerini görebiliyoruz.

MULTIPLAYER

Daha önce bahsettiğimiz Unity Gaming Services ve Netcode for GameObjects ile multiplayer tarafına dair Unity’nin bir atılımda bulunduğundan bahsetmiştik. Unity 2022 LTS ile artık oyunlarınızda gönül rahatlığıyla kullanabileceğiniz tam sürüm haliyle (product-ready) Netcode for Entities paketi de erişime sunulmuş halde. ECS yapısını kullanarak multiplayer oyunlarınızın performansını ve oyuncularınıza sunabileceklerinizi daha da arttırabileceğinizi belirtmek yanlış olmayacaktır.

ECS için ilk duyurulan örnek projelerden biri Megacity idi. Megacity projesini temel alan ve 64 oyuncudan daha fazla oyuncuyu destekleyen, uçan arabaları kontrol ederek oyuncuların birbirleriyle kapıştığı multiplayer bir proje daha sunuldu. Bu proje içerisinde hem Netcode for Entities paketi kullanımını hem de daha önce bahsettiğimiz hosting, matchmaking, authentication ve voice chat gibi unity servis kullanım örneklerini de inceleyebilirsiniz.

HDRP 

Özellikle piyasada sürekli olarak Unreal Engine ile Unity karşılaştırmalarında grafik konusu en çok tartışılan başlıklardan biri. Mühendislik tarafı yaklaşımları sebebiyle Unity çok geri planda kalıyormuş gibi değerlendiriliyor hep maalesef. Ancak özellikle HDRP ile Unity çoktan bu açığı kapatmaya başladı desek yalan olmaz. Unity 2022 LTS sürümünde de High Definition Render Pipeline için güncellemeler ve yeni özellikler olmaması çok şaşırtıcı olurdu. 

Özellikle uzun süredir görmeyi istediğim şeylerden biri olan Volumetric Materials sonunda kullanımımıza sunuldu. Volumetric Material sistemi ile geliştimiş şekilde procedural fog ve volumetrik efektler oluşturmamız mümkün hale geliyor.

Volumetrik konusuna girmişken ayrıca Volumetric Clouds güncellemesinden de bahsetmek lazım. Bu yeni sistemle artık muazzam ve gerçekçi bulutlar elde etmemiz mümkün. Cloud Layers sistemiyle dinamik şekilde ışıktan da etkilenen bu bulutlarla çeşitli hava durumları oluşturmak ve bunların arasında yumuşak geçişler yapmak mümkün.

HDRP başlığında son olarak bahsedebileceğimiz konu ise yeni Water System, yeni deniz sistemi. Unitynin kendi blog yazısını incelerseniz özellikle render tarafında gerçekçilik ve ayar çeşitliiğinden bahsedilmekte, aşağıdaki linkteki görselde görebileceğiniz gibi ciddi manada tatmin edici görsellik bize sunuyor.

Unity HDRP Water System Örnek Görsel

Görsellik dışında kullanım açısından bazı şeylere de değinmek istiyorum. Öncelikle bu paket ile havuz, nehir, deniz, okyanus veya göl oluşturmamız mümkün. Ayrıca su altına has çalışan bir render seçeneğini bize getiriyor bu paket. Oluşturduğunuz suyun rüzgar ve su akımlarından etkilenerek davranış sergilemesi imkanı bulunmakta. Su köpürmesi, dalgalanmalar, yansımalar da tabii ki sisteme dahil. Ayrıca shader graph üzerinde kullanabileceğiniz Water ShaderGraph seçeneği de bulunuyor. Ayrıca yarattığınız su sistemini scriptleriniz üzerinden erişerek kullanmanız da mümkün. Bu sayede su sisteminizde objelerin batıp çıkmasını veya yüzeyde kalmasını sağlayabilirsiniz. 

Bu su sisteminin aslında çok çok önceden Unity içerisinde dahil edilmesi gerektiğini düşünüyorum ve özellikle URP tarafında henüz böyle bir şey sunulmamız olması da hala sinir bozucu. Hali hazırda hazır paketler bulunsa da, bu tarz bir sistem ana unsurlardan biri olması gerekiyor diye düşünüyorum. Hâlâ geliştirilmesi gereken taraflar olduğunu da belirtmek gerekiyor.

Neyse, en azından artık biz de Unreal Engine geliştiriclerinin yaptığı gibi third person bir karakterin etrafta dolanıp durduğu deniz, dere falan yapıp paylaşabileceğiz rahat rahat :p

URP

Özellikle görsellik konusunda canavar gibi sistemleri değil de, çok geniş bir yelpazede cihazları ve platformları desteklemek istediğimizde URP can simidi konumunda. Unity 2022 LTS sürümünde de yapılan URP gerek güncelleme gerek yeni özellikler konusunda es geçilmiyor haliyle.

Öncelikle en önemli başlıklardan biri kullanabileceğimi ışık (Light) sayısındaki limitin kalkmasına imkan sağlayan Forward+ Rendering seçeneği. Özellikle yüksek kalitede gerçek zamanlı ışıklandırma yaratmak istediğimizde ışık sayısındaki limit geliştiriceleri zorlayan bir durum idi. Biraz teknik tarafa değinmek gerekirse Forward Rendering sisteminden farklı olarak Forward+ Rendering, ışığı objeler tekelinde değil düzlemsel olarak işleme sokmakta. Ancak belirtmekte fayda var,GLES2 grafik API kullanan cihazlarda bu render yöntemi kullanılamamakta. 

Bir diğer yeni özellik LOD sistemine geliyor. LOD Crossfade seçeneği LOD sisteminin daha yumuşak bir şekilde geçiş yapmasına imkan tanıyan bir şey. Normalde LOD belli mesafelerde modelin farklı çözünürlükteki versiyonlarının render edilmesi şeklinde çalışıyor. Örneğin 10 metreden daha yakınsak en yüksek çözünürlükteki versiyonu görürken, 10 metreden 1 cm bile uzaklaştığımızda anında düşük olan versiyona geçiyordu. Ancak Crossfade seçeneği bu geçişi çok yumuşak bir hale getiriyor. Aşağıdaki linkteki görselden aradaki farkı görmeniz mümkün

Unity LOD Cross Fade Vazo Örneği

Yumuşatma demişken değinebileceğimiz bir diğer başlık da Temporal Anti-Aliasing. Özellikle çok keskin şekilde piksellenmeler ve titrek ışıklara çözüm olacak bir özellik Temporal Anti-Aliasing. Temelde bir önceki karedeki kullanarak varolan karede yumuşatma yapan bir yöntem aslında. Sonunda bu yöntemi URP tarafında görmek de hoş. Açıkçası bu sistemi yazıyla anlatmak yerine aşağıdaki görselden görmenizi tercih ederim. 

Unity TAA (Temporal Anti-Aliasing) Örneği

Decal Layers özelliğiyle beraber, sahnelerimizde kullandığımız decal sistemlerin hangi layer üzerinde çalışacağını seçmemize imkan tanınıyor artık. Decal uygulamak istediğimiz yüzeye farklı bir obje yaklaştığında, yaklaşan objenin üzerinde de decal uygulanıyordu normalde. Ancak aşağıda da görebildiğiniz gibi, layer yapısı sayesinde artık yalnızca belirlediğimiz objelerde çalışacak şekilde decal ayarlamamız mümkün.

Unity Decal Layers Kullanımı Karşılaştırması

URP özelinde bir diğer gelen özellik de Shader Graph Full Screen seçeneği. Bu seçenek sayesinde yalnızca ekranda çalışacak çeşitli post-processing efektleri oluşturmamız mümkün. URP başlığında değinmiş olsak da, ayrıca HDRP de de bu özelliği kullanabilirsiniz.

Son olarak da Shader Variant Prefiltering sistemi ile hem build sürecinde hem de oynanış esnasında performans artışı sağlanmakta. Ayrıca Built-in Converter aracı ile hali hazırda URP kullanmaya projeleri URP sistemine geçirmede kolaylık sağlanmakta.

Spline Paketi

Sonunda sonunda artık dediğim bir güncelleme daha. Unity Spline paketi sonunda 2022 ile kullanıma sunuluyor ve deneyimlediğim kadarıyla o kadar güzel ki. Belki abarttığımı düşüncek çoğunuz. Özellikle hali hazırda ücretsiz olan paketlerle ihtiyacımızı giderebileceğimiz bir şey olduğunun düşünürsek bu kadar sevinmek garip gelebilir . Ancak hiçbir paket kullanım konusunda istediğim rahatlığı sunamıyor, kontrolleri doğal ve Unity’e ait hissettirmiyordu.  Veya özellikle kendi ihtiyaçlarıma göre bir eklenti oluşturmaya çalıştığımda API kısmında Unity ekosistemi dışında hissettiriyordu. 

Unity Spline paketi özellikle de bu tarz kötü deneyimlerden sonra kullanımı yağ gibi ve mis gibi bir API sunması ile kalbimi kazandı. Özellikle örneklerini de incelediğinizde göreceksiniz, çok çok basit şekilde temel ihtiyaçlarımızı da fazlasıyla karşılıyor. En basit kullanım olarak ilk akla gelen yollar oluşturmak olacaktır. Ancak yol dışında da özellikle çevre elementlerini yerleştirme konusunda da hem doğallık hem de hız açısından çok büyük rahatlık sağlıyor.

Kendi eklentilerinizi yapma konusunda rahat ve basit bir API sunması da çabası, özellikle benim gibi arkaplanda projeleriniz için çeşitli araçlar yazmaya bayılıyorsanız. Bir de ufak bir ekstra bilgi, Cinemachine 3 sürümünde de Camera Track oluştururken Spline paketinin bu faydalarından yararlanıp kameralarımızın hareket edeceği yolları da ayarlayacağız. 

Platform ve Build Optimizasyonları

Her yeni sürümde olduğu gibi performans optimizasyonları da Unity 2022 LTS sürümünün bir parçası. DirectX 12 grafik API ile cihazlarda daha windows ve Xbox cihazlarda stabilliği ve performansı arttırabileceğiz artık. Ayrıca deneysel halde olsa da Ray Tracing seçeneğini Xbox Series X ve Playstation 5 cihazlarda deneyip daha gerçekçi ışıklandırma ve yansımaları oyunlarınızda kullanabilirsiniz.

Build işlemlerinde yapılan iyileştirmelerle özellikle Xbox, Playstation, IOS ve Nintendo Switch cihazlarınızda yayınlama süreçlerinizi hızlandırıp, hızlıca güncellemelerinizi yayınlayarak oyunlarınızdaki kaliteyi yükseltebilirsiniz. 

Andriod cihazlar tarafında da çeşitli güncelleştirmeler bulunmakta. System Metrics Mali paketi ile ARM ekran kartlarında performans analizlerine daha derinlemesine dalmanız mümkün. Samsung cihazlarda Adaptive Performance 4.0 sistemini artık visual scripting ile de kullanabiliyoruz. Ayrıca mobil cihazlarda web çıktılarınızda  WebGL bellek kullanımı iyileştirmeleri ve C++ native multithread desteği de bu sürümle beraber gelmekte.

XR konusunda da bazı geliştirmeler sunulmuş durumda. Playstation VR2 ve Meta Quest 2 cihazlara build alma süreçlerini XR Interaction aracı ile bize sunuyor. Vulkan grafik API kullandığınız oyunlarınızda çeşitli cihazlarda geliştirilmiş performans elde etmenize de imkan tanınıyor. 

Unity 2022 LTS sürümü şu an karşımızda olan en stabil, güvenilebilir Unity sürümü olarak sunuluyor. 2 yıl boyunca 2 haftada bir olacak şekilde güncelleştirmeler alarak gelişeceğini ve iyileştirileceğini hatırlatmakta da fayda var.

Unity 2022 LTS yayında yazımızda değineceklerimiz bu kadar, keyifli bir okuma olmuştur umarım. Eğer Unity’nin yeni sürümünde neler olacak derseniz, hatta ve hatta belli başlı özellikleri önermek isterseniz diye şuraya Unity Roadmap linkini bırakayım. Her ne kadar bazen sinir etseler de hâlâ Unity içerisinde biz geliştiricileri dinleyenler bulunmakta. Bundan yararlanmak gerektiğini düşünüyorum.

Bir sonraki yazımıda görüşmek dileğiyle, hoşçakalın.

Humble Bundle Unity Tools Kampanyası

0

Humble Bundle Unity Tools Kampanyası muhteşem paketleri bize büyük indirimlerle sunuyor. 22 Eylül 2022 tarihinde sürecek bu kampanya ile toplamda 26,227TL değerindeki toplam 26 pakete yalnızca 543.45 TL karşılığında sahip olabilirsiniz. Eğer bütçeniz daha düşükse, daha düşük ücret ödeyebileceğiniz farklı paket grupları da sunuyor. 

Bu fiyat farklılığı da aslında bu tarz kampanyaların belirli kuruluşlara yardım amacıyla oluşturulması. Örneğin bu kampanya GameHeads isimli kuruluşa destek amacıyla yapılmakta. Yani burada belirtilen fiyatlardan daha fazlasını vererek isterseniz bu kuruluşa daha fazla destek olmanız da mümkün. GameHeads kuruluşu da çeşitli alanlarda eğitimler vererek toplumun farklı kesimlerine erişip destek olmaya çalışan bir kurum. Bu satın almalarla aslında hem yeni assetlere sahip olurken hem de başkalarına yardımcı olabiliyorsunuz yani.

Şimdiden hatırlatmakta fayda var, kur farkı sebebiyle fiyatlar günden güne değişiklik gösterebilir ve güncellenebilir. Bu yazıdaki fiyatlar, yazının yazıldığı tarih olan 10 Eylül 2022 tarihindeki güncel fiyatlardır.

Humble Bundle Unity Tools Kampanyası içerisindeki paketler özellikle hazır oyun sistemleri, geliştirme aşamasında işlerimi kolaylaştıracak ve hızlandıracak eklentileri içeriyor. Bahsettiğim gibi farklı ücret seçenekleri ve içerisinde bulunan paketleri ve tam olarak paketlerin bize ne sağladığını adım adım anlatacağım. Ama onun öncesinde isterseniz diğer kampanya olan Humble Bundle Unity Art kampanyasına ve bu iki kampanyada benim en çok ilgimi çeken paketlerden bahsettiğim videoya bakabilirsiniz.

Humble Bundle Unity Tools Kampanyası Seçenek 1 

Fiyat: 18.11 TL

İçerikler:

  • Unity Asset Store 10$ değerinde indirim kuponu
  • RPG Cameras & Controllers:
    • RPG Cameras & Controllers içerisinde 2 adet kamera ve karakter kontrol sistemi bulunduruyor. MMO ve RPG Action oyunları için olan bu hareket ve kamera sistemleriyle oyunlarınıza hızlı bir başlangıç yapabilirsiniz.
  • Modular Motion:
    • Modular Motion paketi UI animasyonları üzerindeki çalışma hızınızı 2 katına çıkarma iddiasında bulunan bir animasyon sistemi paketi. Unity UI ve TextMeshPro animasyonları oluşturmaya destekleyen paket içerisinde ayrıca bir ses kontrol yapısı, özelleştirilebilir animasyon seçenekleri ve procedural olarak ui kullanımı için uygun Image oluşturmanızı sağlayan bir eklenti de bulunuyor.
  • Bones Simulator:
    • Bones Simulator paketi hali hazırda var olan 3D animasyonlara rastgelelik katarak daha canlı ve gerçekçi animasyonlar oluşturmaya imkan tanıyor. Animasyona sahip modellerin iskeletlerinde bulunan herhangi bir kemiğe bir component atayarak kolaylıkla rastgelelik, ekstra hareket ve dönme gibi işlemler uygulayabiliyorsunuz. 

Humble Bundle Unity Tools Kampanyası Seçenek 2: 

Fiyat: 536.18 TL

İçerikler

  • Seçenek 1 içerisindeki her şey.
  • Blocks Engine 2:
    • Blocks Engine 2 oyun içerisinde oyuncularınıza basit arayüz üzerinden görsel programlama imkanı yapmanızı sağlayan bir paket. Görsellerine bakarsanız, genellikle bilgisayar derslerinde kullanılan Scratch uygulamasına benzer bir arayüze sahip. Burada güzel yanı şu, kendi belirlediğiniz fonksiyonları oyuncuların kullanmasını sağlayabiliyorsunuz. Özellikle eğitim alanında çalışan kişilerin istedikleri gibi uygulamalar geliştirmesine faydalı olacaktır. Ancak sadece eğitim değil, genel olarak bir bulmaca türü oyun için veya oyununuzun bir mekaniğinde de yararlanabileceğiniz bir paket.
  • Train Controller (Railroad System) ULTIMATE COLLECTION:
    • Train Controller, adı üstünde Tren kontrol mekanizmaları sunan bir paket. Collection halinde olduğu için hem ana kontrol paketi hem de farklı tren modellerinin olduğu eklenti paketleri içerisine dahil. Tren severlere hitap edeceği kesin, ÇUF ÇUFF.
  • Broccoli Tree Creator:
    • Broccoli Tree Creator yalnızca ağaç değil çeşitli bitkileri de procedural olarak yaratmanıza imkan sağlayan bir paket. Shader Graph ve VFX Graph kullandıysanız, nispeten aşina olacağınız graph yapısı ile görsel olarak istediğiniz yapıda ağaç ve bitki oluşturmanız mümkün.
  • Performance Tools:
  • Performance Tools aslında içerisinde 3 ayrı paketi bulunduran bir toplama paket. Advanced Render System, SuperLevelOptimizer ve Advanced Culling System açık ve kapalı alanlarda draw call sayılarını azaltarak render tarafında oluşan yükü azaltıp performansa yardımcı olmakta.
  • True Shadow – UI Soft Shadow and Glow:
    • True Shadow paketi ile UI objeleri için hızlıca çeşitli efektlerle gölge ve parlama oluşturmanız mümkün hale geliyor.
  • Archimatix Pro:
    • Archimatix Pro graph-node temelli bir 3d mesh oluşturma paketi. Bu muazzam paket ile procedural olarak basit geometrik şekillerin yanında muazzam binalar, yapılar, modeller oluşturmanız mümkün. Archimatrix kelimesi de Architecture kelimesinden bir uydurma gibi geliyor bana. Hatta Matrix’teki ile Architecture bağlantı olması çok olası. Her neyse, bu muazzam paketi denemeyi 4 gözle beklediğimi belirtmeliyim.

Humble Bundle Unity Tools Kampanyası Seçenek 3: 

Fiyat: 548.45 TL

İçerikler:

  • Seçenek 1 ve Seçenek 2 içerisindeki her şey.
  • Mech Combat Kit:
    • Mech Combat Kit ülkemizde pek yaygın olmasa da yurtdışında baya popüler olan ve koca koca robotları kontrol ettiğimiz bir tür olan Mech- Mecha türü için çok güzel bir hazır oyun sistemi sunan bir paket. İçerisinde Mech kontrolleri, kamera, silah,  sağlık sistemi, HUD arayüzü, düşman yapay zekası için sistemleri hazır olarak bulunduruyor.
  • Very Animation:
    • Very Animation tamamen animasyonla alakalı bir paket. Bu paket sayesinde var olan animasyonları paketin sunduğu arayüz sayesinde daha rahat şekilde düzenleyip, optimize edebilir ve yenilerini oluşturabilirsiniz. Generic ve Humanoid animasyon tiplerini desteklemekte.
  • CCG Kit:
    • CCG Kit CCG(Collective Card Game), yani kart toplama diyebileceğimiz, örnek olarak HearthStone veya Gwent’i verebileceğimiz türde oyunlar yapabilmek için komple hazır bir sistem sunuyor. Mirror paketiyle beraber online oyunlar geliştirmeyi de destekliyor.
  • Dialogue System for Unity:
    • Oyunlarınızda diyalog sistemi için kesinlikle kullanmanızı önereceğim paket. Özellik ve uyumluluk açısından dolu dolu. Graph-node tabanlı yapısıyla diyalog akışlarını hızlıca ayarlamanız mümkün. Ayrıca kendi içerisinde yerelleştirme(farklı dil desteği) bulunduruyor ancak isterseniz Unity’nin kendi yerelleştirme paketiyle de kullanabilirsiniz. Detayları için muhakkak paketin sayfasını incelemenizi öneriyorum.
  • Script Inspector 3:
    • Script Inspector 3 denemeyi 4 gözle beklediğim başka bir paket. Visual Studio veya Rider gibi harici bir kod editörü kullanmadan, Unity editörü içerisinde bir pencere açarak kodlarınızı düzenlemeye imkan tanıyan bu paket, otomatik tamamlama (auto-completion) gibi özelliklere de sahip. Tamamen diğer kod editörlerini bıraktıracak kadar geniş çaplı bir çözüm olmasa da, özellikle tek ekran çalışmaya alışan kişiler için Alt+Tab kısayoluyla etkileşimi azaltmak için güzel bir araç olacaktır. 
  • EndlessBook:
    • EndlessBook sayfaların içeriğini istediğiniz gibi doldurabileceğiniz 3 boyutlu kitaplar oluşturmanızı sağlıyor. Bu kadar basit ve net.
  • FluXY – 2.5D fluid simulator:
    • FluXY paketi 2 boyutlu görselleri 3 boyutlu gibi gösterip, taklit eden bir akışkan simulasyon sistemi sunuyor. Suda yürüyen bir karakterin adımlarının yaratacağı dalgaları, farklı sıvıların birbirine karışmasını veya ateş gibi görsellikler elde etmenize imkan sağlıyor. Daha iyi anlamanız açısından paketi ve görsellerini incelemenizi kesinlikle öneririm.
  • BetterUI:
    • BetterUI Unity UI görsel kalitesini ve kullanımı için kendi içerisinde yardımcı araçlar bulunduran bir paket. Özellikle UI ile çalışmak benim gibi sizi de delirtiyorsa bir göz atmakta fayda var.
  • Fullscreen Editor:
    • Fullscreen Editor, adından da tahmin edebileceğiniz üzere Unity editörünün herhangi bir penceresini tam ekran hale getirmenizi sağlayan bir paket. Kullanım için verebileceğimiz en basit örnek, oyunun tam ekranda nasıl göründüğünü görmek için build almanıza gerek kalmadan Unity içerisinde “Game” panelini tam ekran yapmak. Anında sonucu görmeniz mümkün.  Ayrıca “Scene” panelini tam ekran yapıp sahneyi düzenlemek de çok büyük rahatlık olacaktır.
  • DestroyIt – Destruction System:
    • DestroyIt paketi, 3d objelerinize parçalanabilirlik katmaya yardımcı olan bir paket. Bu noktada önden belirtmekte fayda var, varolan 3 boyutlu modeli otomatik olarak parçalara ayıran bir özelliği yok. Temel olarak parçalanma için ne kadar hasar alınması gerekiyor, tamir etme sistemi, parçalanma ve hasar alma anında hangi particle efekt kullanılacak gibi değişkenleri hızlı bir şekilde ayarlayıp sahnemize eklememize imkan tanıyor.
  • Storyteller:
    • Storyteller Visual Novel, Görsel Roman diyebileceğimiz oyun türleri için kullanabileceğimiz çeşitli araçları içerisinde bulunduruyor. Node tabanlı olarak diyalog yapısı, görsel olarak bir akış, ara sahne oluşturma gibi şeyler yapılmasına imkan tanıyor.
  • Smart Lighting 2D:
    • Smart Lighting 2D iki boyutlu ışıklandırma için kullanabileceğiniz en iyi paketlerden biri. Unity’nin sunduğu ışık kaynağına ek ışık kaynakları, gölge oluşturma için çeşitli seçenekler sunması bile başlı başına bir artı. Bunun dışında fazlasıyla optimize ve mobil desteği de bulunuyor.
  • UniStorm – Volumetric Clouds, Sky, Modular Weather, and Cloud Shadows:
    • Unistorm gökyüzü için  için arayacağınız her özelliği sunuyor neredeyse. Volumetric bulutlar, bulutların gölgeleri, farklı hava durumları ve efektleri, gece gündüz döngüsü,  gece gündüz döngüsünde farklı anlarda farklı sesler çalınması için ses kontrolcüsü. Anlayacağınız dolu dolu. HDRP ve URP üzerinden kullanılabiliyor ve mobil de destekliyor.
  • Prefab World Builder:
    • Prefab World Builder bir kağıdı boyar gibi prefabları hızlıca sahnemize yerleştirip tasarım tarafını hızlandırmaya imkan veren bir araç. Unity Terrain aracına benzer özellikler yanında (rastgele konumlandırma, boyutlandırma vb), belirttiğini alana grid halinde yerleştirme, belirttiğiniz yol üzerine peşpeşe sıralama gibi bir dünya kolaylık sağlıyor. Özellikle büyük sahneler oluştururken fazlasıyla vakit kazandıracak, işinizi kolaylaştıracak bir paket.
  • Magic Light Probes:
    • Magic Light Probes, oyunlarımızda ışıklandırma için önemli bir faktör olan Light Probe objelerinin konumlandırmasında muazzam kolaylık sağlayan bir paket. Light Probe düzenlemeyle uğraşanların gözlerinin şu an ışıl ışıl olduğuna o kadar eminim ki.
  • TopDown Engine:
    • TopDown Engine muazzam bir paket, bunu öncelikle söylemeliyim kesinlikle. 2 ve 3 boyutlu TopDown(Kuşbakışı) modda oyunlarda kullanabileceğiniz farklı hareket sistemlerini içeren karakter kontrolcüsü, Unity Cinemachine temelli güçlü bir kamera kontrol sistemi, envanter sistemi, multiplayer hazır, etkileşime girilebilecek çeşitli objeler. Dolu dolu yahu dolu dolu. İçerisinde bir sürü hazır asset ve örnek sahneler de bulunuyor. Kesinlikle bir dünya işten kurtaracak bir paket.

Humble Bundle Unity Art Kampanyası

0

Humble Bundle Unity Art Kampanyası içerisinde muhteşem görsel 3D modeller,, materyaller, ses dosyaları ve sanatsal eklentilerle beraber yayında. Humble Bundle Unity Art Kampanyası dahilinde toplam 26.665 TL değerindeki paketleri 449.05 TL karşılığında elde edebileceksiniz. Ancak fiyat size çok gelirse ve üst seviye paketlere o kadar ihtiyaç duymazsanız, farklı fiyat seçenekleriyle daha az sayıda pakete yine çok güzel bir indirimle sahip olabilirsiniz.

Bu fiyat farklılığı da aslında bu tarz kampanyaların belirli kuruluşlara yardım amacıyla oluşturulması. Örneğin bu kampanya Girls Make Games Scholarship Fund isimli kuruluşa destek amacıyla yapılmakta. Yani burada belirtilen fiyatlardan daha fazlasını vererek isterseniz bu kuruluşa daha fazla destek olmanız da mümkün. Girls Make Games Scholarship Fund kuruluşu da aslında özellikle oyun geliştirme alanında ilerlemek isteyen kız öğrencilere burs sağlayan bir kurum. Bu satın almalarla aslında hem yeni assetlere sahip olurken hem de başkalarına yardımcı olabiliyorsunuz yani.

Ufak bir hatırlatma, kur sebebiyle fiyatlarda günden güne değişiklikler olabilir. Böyle bir durumda doğal olarak website üzerinde fiyatlar güncellenecektir. Bu yazıdaki fiyatlar, yazının yazıldığı tarih olan 10 Eylül 2022 tarihindeki güncel fiyatlardır. 30 Eylül 2022 tarihinde kampanya son bulacak.

Farklı fiyat seçenekleri kısmına geçmeden, aynı anda aktif olan bir başka kampanya Humble Bundle Unity Tools kampanyası hakkındaki yazımıza ve bu iki kampanyada benim en çok ilgimi çeken paketlere değindiğim videoya göz atabilirsiniz.

Humble Bundle Unity Art Kampanyası Seçenek 1

Fiyat: 17.96 TL

İçindekiler:

  • Unity Asset Store 10$ değerinde indirim kuponu.
  • RPG VFX Bundle:
    • RPG VFX Bundle özellikle RPG oyunlarında kullanabileceğiniz bir dünya görsel efekte sahip bir paket. Sihirli oklar, kalkanlar, güçlendirme ve zayıflatma büyü efektleri, seviye yükseltme üzerine kullanabileceğiniz çeşitli efektleri bu pakette bulabilirsiniz.
  • Brute Force – Snow & Ice Shader:
    • Brute Force – Snow & Ice Shader paketi temelde kar ve buz objeleri için kullanabileceğiniz materyaller içeren bir paket. Tamamen özelleştirilebilir ve etkileşime girilebilir(karın üzerinde iz bırakma gibi) özelliklere sahip bu paket kar ve buz objeleri için temel görsel ihtiyaçlarınızı giderebilecek bir paket.
  • Seamless Texture Generator:
    • Seamless Texture Generator paketi, kullandığınız texture, görsel dosyaları düzenlemenize yardımcı olan bir araç içeriyor. Texture dosyalarının kesilme veya daha doğrusu görselin bittiği ve tekrar ettiği kısımların belirgenliğini kaybettirerek, verdiğiniz texture dosyasından yanyana durduğunda daha iyi karışabilen, uyum sağlayan bir texture yaratmaya imkan tanıyor. Özellikle internetten bulduğunuz texture dosyalarında bu özelliği bulmak zor olabiliyor, o yüzden özellikle görsellerinizi kendiniz hazırlamıyorsanız işinize yarayacak bir asset. 

Humble Bundle Unity Art Kampanyası Seçenek 2 

Fiyat: 442.48 TL.

İçindekiler:

  • Seçenek 1 içerisindeki her şey dahil.
  • Map Graph:
    • Map Graph graph-node tabanlı yapısı ile yaratacağınız sahnelerde kullanacağınız özelleştirebilir Level Generator(Level Oluşturucu) yaratmanıza imkan sağlayan bir paket. Bu paket sayesinde Level içerisinde çevrenin hangi kurallara göre oluşturulacağını baştan belirleyip, sonrasında hızlıca level hazırlamanız mümkün hale geliyor. 2 boyutlu veya 3 boyutlu objeler üzerinden level oluşturmanıza da imkan tanıyor.
  • Pixelate:  
    • Pixelate, 3 boyutlu modellerinizi 2 boyutlu pixel art  texture hale getirmenize imkan veren bir paket. Yalnızca statik halde değil, karakter animasyonlarını da texture dosyasına çevirmeyi sağlaması da hoş bir detay, 3 boyutlu animasyonları hızlıca 2 boyutlu hale getirmek süreci baya hızlandıracaktır. Ve çok hoş ayrı bir özellik, modelin default texture halinin yanında 2 boyutlu ışıklandırma için kullanabileceğin normal texture dosyasını da oluşturabiliyorsunuz.
  • Little Dragons: Tiger:
    • Little Dragons: Tiger paket, tatlı mı tatlı bir sürü yavru ejderha modelini sizlere sunuyor. Ayrıca yürüme, uçma, zıplama gibi 80 adet animasyon da dahil.
  • Birds Pack:
    • Birds Pack 7 adet kuş modeli ve çeşitli animasyonları içeren bir paket. Paket içeriğinde Karga, Baykuş, Kartal, Güvercin, Martı ve Serçe modelleri, hem PBR hem de eski usül materyal destekleriyle beraber geliyor.
  • Basic Motions:
    • Basic Motions paket insansı modellerinizde kullanabileceğiniz temel animasyonlar içeren bir paket. Sabit duruşlar, hareket, sosyalleşme, yerden eşya alma gibi çeşitli animasyonlar sunuyor.
  • Footsteps Sound Pack:
    • Footsteps Sound Pack ciddi manada dolu dolu bir ses paketi. Adım sesleri ihtiyacınızı gidermek için 1230 adet ses dosyası hizmetinizde. 

Humble Bundle Unity Art Kampanyası Seçenek 3

Fiyat: 449.05 TL.

İçindekiler:

  • Seçenek 1 ve Seçenek 2 içerisindeki her şey dahil.
  • Magica Cloth: 
    • Magica Cloth kıyafetleri, kumaşları Unity Jobs System ve Burst Compiler altyapısı ile performanslı bir şekilde fizikten etkilenir hale getirmenize imkan sağlıyor. Sağladığı cloth simulasyonu yalnızca kumaşlar değil, toplu halde olan örülmüş saçlarda da kullanılabiliyor, ki örnek videolarında bunu da görebiliyoruz.
  • Character Creator 2D:
    • Character Creator 2D, 2 boyutlu karakterler yaratmanıza imkan veren bir araç. Renk, boyut gibi değerleri de özelleştirmek sayesinde sıradan bir karakterden, muazzam güçlü bir kahraman yaratmaya kadar geniş yelpazede farklı karakter yaratmak da mümkün hale geliyor.  Ayrıca sabit duruş, yürüme, ölme gibi temel animasyonlar da pakete dahil.
  • Monsters Sound Pack:
    • Monsters Sound Pack 838 adet ses dosyası ile oyununuzdaki canavarlara hayat vermek için karşınızda. Zombilerden şeytanlara, ejderhalardan goblinlere kadar çeşitli yaratığa uygun sesi bu paket içerisinde bulabilirsiniz.
  • Underwater FX: 
    • Underwater FX içerisinde bulunan modeller, efektler ve seslerle temel düzeyde su altı ortamı yaratma ihtiyacımızı giderebilecek bir paket.
  • Quirky Series – Animals Pack 1 ve Pack 2
    • Yumuşacık tatlı mı tatlı hayvanların bulunduğu bu iki pakette toplam 90 canlı dostumuza sahip olabiliyor. Riglenmiş ve çeşitli animasyonların da sunulduğu pakette, ayrıca modellerde 4 farklı LOD seçeneği de bulunuyor.  Ayrıca yüz ifadeleri için çeşitli blendshape seçenekleri de sunulmuş halde. 
  • Eternal Temple:
    • Eternal Temple 300 adet prefabla doğayla içiçe geçmiş muhteşem bir tapınak yaratmak için ihtiyaç duyduğumuz bileşenleri bize sunan bir paket. Temel mimari tapınak parçaları dışında, ağaç, bitkiler eşyalar da 300 adet prefab içerisinde bulunuyor.
  • Party Monster Rumble PBR:
    • Party Monster Rumble PBR tatlış mı tatlış yaratıkları modüler şekilde oluşturmamıza imkan sunan bir paket. Modüler olmasını da 6 farklı vücut tipi, 10 vücut parçası, 7 kuyruk ve özelleştirilebilir bir sürü eşya ile sağlıyor.
  • Forest Animals:
    • Forest Animals paketi içerisinde 21 adet ormanlık bölgede yaşayan canlıya sahip olabiliyor. Her birinin kendine has animasyonları olması da gayet ilgi çekici duruyor. 4K çözünürlükte texture dosyalarıyla gerçekçi görüntüyü elde ederken, 4 farklı LOD seçenekleriyle de modeller farklı cihazlarda performans konusunda işimizi zorlaştırmıyor.
  • ProPixelizer:
    • ProPixelizer paketi, 3 boyutlu objelerinizin pixelleştirilmiş halde render edilmesini sağlayan bir paket. Her bir objede farklı pixelleştirme seçeneklerini de destekleyen paket, ayrıca Shader Graph destekli. Böylece kendi özel shader yapılarınızla beraber kullanabileceksiniz. Hali hazırda sunduğu outline özelliği, gradient renk belirleyebilme gibi temel özellikler de başka paketler eklemenizi veya kendiniz bazı temel şeylere el atmanızı da ihtiyaç bırakmayacak.
  • Toon Fantasy Nature:
    • Toon Fantasy Nature çizgifilm tadında görselliğe sahip doğa objelerini içeren bir paket. 200 civarı çeşitli boyutlarda bitki, ağaç prefabı, 20 adet boy boy kaya prefabı, çeşitli eşya ve gökyüzü bulunduruyor.
  • Boing Kit: Dynamic Bouncy Bones, Grass, and More:
    • Boing Kit paketiyle 3d objelerinizin iskeletleri ve kemikleri daha esnek ve etkileşimli hale geliyor. Eğilip bükülmeler ile modelleriniz uzuvları tatlı bir görselliğe sahip olacak.
  • Meadow Environment:
    • Meadow Environment gerçek objelerin taranmasıyla oluşturulmuş, kendinizi doğada hissetmenizi sağlayacak bir çevre görsel paketi. Modellerin yanında bunlara uygun materyal ve shaderları da içeren paket, modellerin de 5 farklı LOD seçeneğiyle performans konusunda da hazırlıklı olmanıza dikkat etmiş. 
  • Ultimate Sound FX Bundle:
    • Ultimate Sound FX Bundle 9849 adet ses dosyasıyla görebileceğimiz en dolu ses paketlerinden biri kesinlikle. Silahlardan arabalara, hayvanlardan ortam seslerine kadar çeşitli paketin birleştirilmiş bu paket oyununuzdaki ses ihtiyaçlarını karşılamak için her şeyi yapmaya hazır gibi duruyor.
  • Monsters Ultimate Pack 02 Cute Series:
    • Tatlı mı tatlı 24 adet canavarcıklarımız bu pakette bize sunulmuş. Rigleri hazır ve kendine has animasyonlarıyla beraber ortalık neşe dolacak, sonrasında kaos yaratmanız da mümkün tabii. 
  • Total Music Collection:
    • Total Music Collection 800 üzerindeki ses dosyası ile oyununuzda yansıtmak istediğiniz duyguları desteklemeye hazır nitelikte, güven veren bir paket. Rock’tan pop’a, ambiyans’tan elektronik müziğe kadar çeşitli tarzda parçaları içinde bulunduruyor. Bütün parçalar veya kısa loop halinde versiyonlarıyla tekrar editleme gibi işlerden sizi kurtarıyor.
  • POLYGON Dungeons:
    • Zindan, zindanlar, daha da fazla zindan.. Polygon Dungeons içeriğinde binalar, eşyalar ve karakterler ile istediğiniz zindan ortamını Low Poly tadıyla yaratmanız için gerekli olan görsel ögeleri size sunuyor. 770 öge 4 farklı renk seçeneğiyle kesinlikle dolu dolu bir paket diyebiliriz.
  • Quibli: Anime Shaders And Tools:
    • Quibli: Anime Shaders And Tool paketi, anime görsellerine sahip oyunlar geliştirmeniz için gereken shader dosyalarını ve bulut, bitki örtüsü yaratma araçları içeriyor. Bulutlar, bitkiler, çimenler ve skybox için kullanabileceğiniz shader dosyaları ile fazlasıyla özelleştirebilir materyaller yaratmanız mümkün hale geliyor. Örnek sahneleri ve dokümanlarıyla hayalinizdeki anime esintili dünyayı yaratmak oldukça kolaylaşıyor. Ayrıca post processing için kullanabileceğiniz farklı efektleri de bize sunuyor. Ve evet, bence de isim kesinlikle Ghibli’den geliyor 😀  

Unity 2022.1 Tech Sürümü Yayında

0

Unity 2022.1 Tech Sürümü 10 Haziran 2022 itibariyle yayında. Biz de bu yazımızda bu sürümle gelen yenilikler, güncellemeler neler, beraber göz atalım istedik. Öncelikle Tech sürümünden kastedilen ne, bunu belirtmekte fayda var. 

Tech olarak adlandırılan sürümler, LTS yani Long-Term Support, Türkçesi ile uzun süre desteklenecek sürümler öncesinde, bu yeni sürümler gelen özellikleri, güncellemeleri erkenden deneme imkanı sağlayan sürümlerdir. Tabii ki bu sürümler hâlâ geliştirme aşamasında olduğundan, kullanıcılar tarafından varolan hataların farkedilip, geri bildirim alınmasını da sağlamakta. Böylece severek kullandığımız Unity, hepimizin dönütleriyle çok daha iyi hale geliyor.

Unity’nin bugün varolan haline gelmesinde de bu dönütlerin etkisi fazla. Örneğin, orjinal blog yazısını incelerseniz, Unity RoadMap üzerinden 7600 bildirim ve Unity forumları üzerinden 5000 gönderi, bu sürüm geliştirilirken dikkate alınmış. Bu arada kesinlikle Unity RoadMap sayfasını takip etmenizi öneririm, buradan siz de gelecek özellikler ve güncellemelere dair önerilerde bulunabilir veya hali hazırda planlanan güncellemelerin sizin için ne kadar önemli olduğunu belirtebilirsiniz.

Bahsettiğimiz bu dönütler sayesinde bu sürümde 280 farklı iyileştirme ve 70’in üzerinde yeni özellik olduğu bahsedilyor. Bu yazımızda iyileştirme ve yeni özelliklerden göze çarpanları ele alıp sizinle paylaşacağız.

Daha Esnek Bir Editor

Şayet Youtube kanalımızı takip ediyorsanız, Unity’nin sunduğu editör araçlarını ve bunların özelleştirilebilirliğini ne kadar sevdiğimi ve ne kadar hayran olduğumu bilirsiniz. Kullandığımız araçların bize azıcık bile açık olması çok sevdiğim bir özellik. Ki Unity bunu bize fazlasıyla sunuyordu bu vakte kadar. Tabii ki bu haliyle durmayıp, bize daha esnek bir editör sunmaktan geri kalmıyorlar.

Unity 2022.1 Tech Sürümü ile artık UI Toolkit daha fazla özelliğe sahip. Bilmeyenleriniz için ufak bir özet geçmek gerekirse, UI Toolkit bazılarınız tahmin edebileceğiz üzere bir kullanıcı arayüzü (User Interface) aracı. Altyapısını incelediğimizde daha öncesinde özellikle Unity editörünü genişletirken, kendi editör arayüzlerimizi oluştururken kullanılırken artık geliştirdiğimiz oyunlar içerisinde de kullanabiliyoruz. 2022.1 sürümü ile beraber ayrıca Vector çizim için API güncellemesi, editörü özelleştirmek için kullandığımız Property Drawer ve Property Attributes özellikleri ve arayüz düzenlemelerinde dallandırılmış arayüzde çoklu sütun görünümü desteği bulunuyor. Henüz Youtube kanalımızda veya sitede yer vermedik ancak merak ediyorsanız Property Drawer ve Property Attributes konuları hakkında içerik geliştirmemizi isterseniz, istediğiniz herhangi bir içerik için geçerli olduğu gibi, yorum kısmında veya Discord kanalımızdaki içerik önerileri bölümünde öneride bulunabilirsiniz.  

VE SONUNDA, SPLINE EDITOR GELDI. Spline aracı bu sürümde henüz direkt olarak sürüm içerisinde dahil değil, ancak paket olarak indirilebilir halde. Spline aracı basitçe bir yol oluşturmamıza ve bu yolu çeşitli şekillerde kullanmamızı sağlıyor. 

Unity Spline Editor
Unity Spline Editor

Tabii ki buna benzer araçlar Unity Asset Store üzerinde hali hazırda bulunuyor, hatta ücretsiz olanlar var. Örneğin Sebastian Lague’un geliştirdiği Path Creator bunlardan biri. Hatta Youtube kanalımızda bu tarz yolları nasıl kullanabileceğimize dair bir örnek de oluşturmuştuk.

Yeni Spline aracı şu anda içerisinde basitçe belli noktalar belirleyip bunların birleşmesiyle bir yol elde etmemizi sağlıyor. Bu araç üzerinden oluşturduğumuz yolu bahsettiğimiz noktalar aracılığıyla manipüle edip istediğimiz şekle sokabiliyoruz. Yolu oluşturan nokta veya Unity’nin tabiri ile düğüm (Knot) konumlarının ayarlanması aslında çok sorun değil. Asıl sorun olabilecek konu, 2 düğüm arasında yolun yine nasıl ilerleyeceğini belirlemek, o bölgedeki tangent değerini değiştirmek. Bunun için Spline aracı içerisinde Catmull Rom algoritması ile otomatik hesaplama yaptırabilir, Bezier Curve algoritması ile elle bu iki düğüm arasında kontrolü sağlayabilir veya Linear seçeneği ile iki düğüm arasındaki yolu bir çizgi olarak düz hale getirebiliriz. Kesinlikle Spline paketini indirip biraz kurcalamanızı öneririm, her zaman dediğimiz gibi bazı şeyleri boza boza nasıl çalıştığını öğreniriz, çekinmeyin 🙂

Bir yeni özellik de materyal tarafında geliyor. Özellikle kodlama üzerinden materyal oluşturanlar için, Material API artık bütün materyal değişkenlerini kapsıyor, keyword states desteği, HDRP diffusion proffileri ve IES ışıklandırma desteğiyle procedural materyal kullanımı hem editör hem de oyun içi kullanımlar da geliştirilmiş durumda.

Ve son olarak, Unity File System altyapısı özellikle Asset Bundle görselleştirme ve analizleri için araç geliştirmelerinize imkan sağlaması amacıyla editör’e dahil edilmiş durumda.

Daha Gelişmiş Üretkenlik

Herhangi bir iş yaparken, kullandığımız araçların kapasitelerine bağlı haldeyizdir. Özellikle proje geliştirme adımlarında her bir adımda hızlıca ilerleme, tekrar tekrar göz atma adımlarında, kullandığımız araçların becerileri üretkenliğimizi ve hızımızı etkiler. Unity de bu konunun farkında olduğu için, özellikle her güncellemesinde bu durum için editör’ün üretkenlik becerilerini arttıracak eklemeler yapıyor. 

Unity 2022.1 Tech Sürümü de daha gelişmişlik üretkenlik açısından yeni özelliklerle yayında. Bunlardan belki de en öne çıkanı, materyal varyantları (Material Variants) oluşturma imkanı. Materyal varyantlarını bir nevi prefablar gibi düşünebiliriz. Farklı renklerde ancak aynı normal, metallic vb diğer bütün özellikleri ortak objeleriniz olduğunu düşünelim. Daha önce varolan haliyle, her biri için ayrı bir materyal yaratmamız gerekiyordu. Ve örneğin, normal değerini değiştirmeye kalktığınızda, yarattığınız her bir materyal üzerinde bunu yapmak zorunda kalıyorduk. Materyal varyantları ile bu yükten kurtuluyoruz.

Bir material yaratıp sonrasında bunun farklı özelliklere sahip varyantlarını yarattığımızı düşünelim. Başlangıçta bir normal map ataması yaptık ve projemize devam ettik. İlerleyen süreçte materyali ve varyantları kullandığımız obje bir güncelleme aldı ve yeni bir normal map eklememiz gerekti. Kaynak olarak kullandığımız, yani ilk yarattığımız materyal üzerindeki normal map değişkenini güncelleyerek kolayca işimizi halledip projeye devam edebileceğiz. En basit haliyle tam olarak prefab yapısındaki varyant olayıyla benzer şekilde çalışıyor. Özellikle projeniz büyüdüğünde, bu tarz editör becerilerinin size çok daha gelişmiş üretkenlik imkanı sunduğunu görebilirsiniz.

Projenin büyüklüğünden bahsetmişken, yeni güncellemelerden biri projedeki dosyalar arasında kaybolmamak için bir çözüm sunuyor. Unity 2022.1 Tech Sürümü, 2021 ile gelen gelişmiş arama sayfası için daha fazla filtreleme kategorisi ve daha gelişmiş filtreleme imkanlarıyla yayında. Örneğin sahnenizde belli bir vertex sayısının üstündeki modelleri bulmak istiyorsunuz, Mesh Filter içeren objeleri ve mesh değişkenindeki vertex sayısının belirttiğiniz sayıdan daha fazla olduğu objeleri filtrelemeniz mümkün. Veya aynı şekilde, animasyon oynattırılabilen, yani Skinned Mesh Renderer içeren objeleri de bu şekilde filtreleyebilirsiniz. Bu aramaları tabii ki sadece sahne içinde değil, dosyalarınız içerisinde de rahatlıkla kullanabilirsiniz. Örneğin, belli bir klasör altındaki resim dosyalarını bulmak için filtreleme oluşturmanız mümkün. Resimden kastettiğimiz tabii, Unity arayüzüne sahip olanlar için Texture veya Sprite gibi dosyalar. 

Unity 2022.1 Tech Sürümü Sprite konusunda da yeni güncellemelere sahip. Örneğin özellikle Photoshop üzerinden yaptığınız çalışmalarda, .psd uzantı dosyalarını direkt olarak içerik aktarabiliyor. Tabii sadece tek sunulan bu dosyaları içeri aktarmak değil, aynı zamanda Photoshop içerisindeki katmanlarınızı (layer) da içeri aktarabilmek. Bu sayede görsel içeriğinizi oluşturan sanatçınızın çalışmasını, aynı Photoshop üzerinde sahip olduğu hiyerarşik yapıyla Unity içerisinde kullanmaya başlayabilirsiniz. Ayrıca içerik aktarma esnasında yalnızca istediğiniz katmanların projeye dahil edilmesini de sağlayabilirsiniz.

2 boyutlu taraf için bir yeni özellik de, Delaunay Tesselation algoritmasının desteklenmesi. Bu özellik aslınde özellikle 2 boyutlu fizik işlemleri için daha hassas bir temas/çarpışma algılama (collision detection) için gerekli şeklin-ana hattın oluşturulmasında kullanılıyor. Daha öncesinde özellikle çok ince veya ufak parçalar fizik motoru tarafından yok sayılabiliyordu. Deluanay Tesselation algoritması ile hem bu parçalar daha düzgün hesaplanabiliyor hem de daha az polygon kullanılarak oluşturulabiliyor. 

Nispeten basit diğer güncelleme de Package Manager tarafından geliyor. Bu sürüm ile beraber artık birden fazla paketi seçip toplu işlemler yapmamız mümkün hale geliyor. Çok büyük bir özellik değil belki ama hoş bir detay olmuş ve hızlanma konusunda fayda sağlayacağı kesin.

Detayına çok fazla girmeyeceğimiz diğer güncellemeler ise şöyle:

  • Play moduna geçiş daha hızlandı, Texture ve ufak dosyaları içeri aktarmak neredeyse %60 civarında hızlandı.
  • Geri Alma (Undo) ve Tekrar Yapma(Redo) işlemleri için daha kullanışlı bir arayüz sağlandı.
  • Shortcut Manager üzerinde geliştirmeler yapıldı.

Detaylı Performans İncelemeleri

Oyun geliştirme aşamasında önemli şeylerden biri de yarattığınız oyunun genel olarak nasıl performansa sahip olduğundan haberdar olmak.

Frame Timing Manager ile artık işlemci ve ekran kartı tarafında her bir kare (frame) hakkında harcanan süre ve zamanlamaları geniş çaplı şekilde erişmek ve kaydetmek mümükün hale geliyor. Bu aracı editör içerisinde kullanmanız ve platformdan bağımsız olarak, daha detaylı bilgilerle performans darboğazlarını düzenlemeniz mümkün. 

Rendering Debugger üzerinden de gelen bir güncelleme ile, Frame Stats Profiler üzerinden bir sahnenin her bir karede işlemci veya ekran kartına bağımlı, yük oluşturup oluşturmadığını ve her bir kare(frame) üzerindeki zaman hesaplamalarının da detalyarını görebiliyoruz. Bu özelliği istersek editör içerisinde istersek de build aldığımız uygulamamız içerisinde kullanabiliriz.

Platform Bazlı Optimizasyonlar

Unity PC, Xbox, Android, IOS gibi çeşitli platformlarda çıktı almamıza imkan sağlıyor bildiğiniz üzere. Tabii ki her platformun kendine has özellikleri, güncellemeleri bulunuyor. Bu platformlara aldığımız çıktılarda iyileştirmelerin ve optimizasyonların olması da biz geliştiriciler için önemli bir mesele.

Android tarafında performans arttırmak için Samsung marka cihazlarda Adaptive Performance 4.0 teknolojisinden faydalanabilmeniz mümkün. Adaptive Performanca ile cihazın ısısı, batarya durumu gibi bilgileri elde edip, bu bilgilerden faydalanarak oyununuzu daha az yük oluşturacak şekilde çalışacak hale indirebilirsiniz. Böylelikle daha uzun süre sabit bir fps elde etmeniz mümkün olabilir. Ayrıca görsel programlama (visual scripting) tarafında da Adaptive Performance ile ilgili yapılar eklenmiş durumda.

Ayrıca ARM çipseti kullanan cihazlarda da System Metric Mali paketi ile daha donanım seviyesinde performans bilgileri elde etmeniz mümkün hale geliyor. Package Manager üzerinden “Read GPU Metric” örneğini indirerek inceleyebilirsiniz.

IOS tarafında da “incremental build pipeline” adı verilen, daha önce aldığınız çıktı (build) üzerinden farklı olan kısımları algılayıp yalnızca bu kısımların rebuild işlemine tabii tutulmasını sağlayan bir özellik gelmiş bulunmakta.

Ve son olarak konsol cihazları tarafında kararlılık üzerine yapılan çalışmalara ek olarak, Xbox tarafında yine IOS’ta olduğu gibi ”incremental build pipeline” özelliği eklenmiş durumda.
Genel olarak Unity 2022.1 Tech Sürümü bu bahsettiğimiz özelliklerle beraber yayında. Bütün güncelleme ve değişimleri incemek isterseniz “Release Notes” linkine bakmanızı öneririm. Unity’nin biz geliştiriciler için sunacağı yeni imkanları tam kararlı sürümlerde de görmeyi her zaman 4 gözle bekliyorum. LTS sürümlerinde ne gibi yenilikler göreceğiz bakalım. Yeni yazılarda görüşmek dileğiyle, hoşça kalın.

Unity Gaming Services Duyuruldu

0

Unity Gaming Services Duyuruldu. Unity hali hazırda varolan çeşitli hizmetlerine çeşitli güncellemeler eşliğinde Unity Gaming Services adıyla duyurdu. Multiplayer altyapısından, geliştirme ve içerik yayınlamaya kadar farklı başlıklarda gelen yeni güncellemeleri toparlayıp bu yazıda sizinle paylaşmak istedim. Öncesinde, tanıtım videosu olarak yayınladıkları youtube videosuna bir bakalım.

Videoyu izlediğimde, açıkçası bir geliştirici olarak benim için yeni neler var, neler oluyor gibi sorulara dair ufacık bir ipucu bile göremedim. Bu noktada birazcık hayal kırıklığına uğradığımı belirtmek isterim. Ancak yatırımcılara yönelik duyurular da yapıldığını düşündüğümüzde, o kadar takılmamak gerektiğini düşünüyorum. Geliştiricilerin gözünden de bir video olmasını beni memnun ederdi sadece.

Unity Gaming Services Neler İçeriyor?

Temel olarak aslında daha önce bildiğimiz hizmetlerin çoğunlukta olduğunu belirtmekte yarar var. Yeni olarak özellikle multiplayer tarafındaki çözümler benim dikkatimi çekti. Hatırlarsınız ki, Unity eski çevrimiçi sistemi yerine yeni bir sisteme geçeceğini uzun süre önce duyurmuştu. Geçen sene açık kaynak oluşturulan MLAPI yapısını çevrimiçi oynanış için kendi sistemine dahil etti ve geliştirmeye devam ediyorlardı. Bu altyapının güncellenmiş haliyle burada olduğunu da görebiliyoruz.

Genel olarak Unity Gaming Services içerisinde yeni ve güncellenmiş hizmetler 4 başlık altına alınmış durumda. Bunlar Multiplayer, Backend, Analytics & Player Engagement, Monetization & Growth şeklinde. İçerdikleri hizmetleri ve tam olarak ne işe yaradıklarını başlıklar altında ele alabiliriz. 

Unity Gaming Services Multiplayer

Unity Gaming Services Multiplayer tarafı, yazının öncesinde de belirttiğim gibi, özellikle geliştiriciler için eksik taraflarının farkında olmasıyla biraz daha önem verilen bir yön haline geldi. Bunun etkilerini de bu duyuruda görmüş olduk. MLAPI yapısı üzerinden geliştirilen ve yayınlanan yeni güncellemeler ile NetCode for GameObjects ve NetCode for Entities duyuruldu. İsimlendirmelerden de anlayacağınız şekilde, hem GameObjects yapısı, hem de ECS veya DOTS olarak da bildiğimiz yapı için bir multiplayer altyapısı sunulmuş halde. 

Objelerin haberleşmesi, sunucu üzerinden kontrol için, yani genel olarak çevrimiçi oyun objelerinin haberleşmesi için kullanabileceğimiz NetCode yanı sıra, oyuncuları birbirine nasıl bağlayabileceğimiz de önemli bu konu. Unity’nin burada da bize sunduğu iki yeni çözüm var, Relay ve Lobby.

Relay, sunucusuz şekilde peer-to-peer denilen, oyuncuların direkt olarak birbirine bağlanması için kullanabileceğimiz bir çözüm. Bu sayede ortada direkt olarak oyunumuzu çalıştıran bir sunucu olmasına ihtiyaç duymuyoruz. Çoğunuz bildiğini düşündüğüm olay aslında, bir oyuncu bir nevi sunucu görevini üstleniyor ve diğerleri ona bağlanıyor. 

Lobby ise adından da tahmin edebileceğiniz üzere lobi sistemi ile alakalı. Oyuncularımız için kolaylıkla farklı oyunları, lobileri arayıp oyunlara katılabildikleri veya kendi lobilerini oluşturabildikleri bir yapı sunuyor bize. Ayrıca yalnızca davet sistemi ile oyuncuların yalnızca istedikleri kişileri lobiye almaları da mümkün. Böyle bir altyapının da hazır olarak sunuluyor olması gayet iyi bir gelişme.

Dokümanları incelediğimde, özellikle Relay ve Lobby yapılarının beraber kullanılması önerildiği dikkatimi çekti, sizinle de paylaşmak istedim. Bir zorunluluk değil ama ikisi bir arada kullanılabilecek ve birbirinden yararlanabilecek şekilde geliştirilmiş. Örneğin Relay ile bir oyuncunun oyundan ayrıldığını Lobby sistemine haber verebileceksiniz. Belirtmekte de fayda var, bu iki paket şu anda açık beta sürecinde ve açık beta sonuna kadar ücretsiz olarak denenebilecek. 

Çevrimiçi oyun geliştirmenin bir diğer önemli kısmı da sunucu işleri. Özellikle dünya çapında yayılma niyetiniz varsa, dünyanın her yerinde sağlıklı bağlantılar kurmak baş ağrıtabilir. Unity bunun için de bir hizmet sunuyor; Multiplay. 

Unity Multiplay, global olarak oyun sunucusu ve bunların teknik bakımlarını içeren bir hizmet. Bu yazı yazılırken, dünya genelinde 190 üzerinde sunucu merkezine sahip oldukları bilgisini de kendi sitelerinden edinebiliyoruz. Bu sunucu merkezleri üzerinden, ihtiyaca göre kapasitenin anında arttırılabilmesi, kolaylıkla güncellenebilme gibi çeşitli seçenekler sunuluyor.  Özellikle teknik sorunlardan kurtulmak, oyun geliştirici firmalar için büyük rahatlık sağlayacak bir durum. Gerek genişletilebilir olması, kapasitenin arttırılabilmesi, gerek bu teknik destek mevzusu Apex Legends geliştiricilerinin de ilgisini çekmiş ki, öve öve bitiremiyorlar. 

Bu sunucu desteği olsa da, oyuncuların anında bir maç, karşılaşma bulup oyunu oynamaya başlaması da ayrı bir sorun olabiliyor. Unity’nin bunun için çözümü ise Matchmaker. Unity Matchmaker sistemi ile oyuncuların birbirini bulması, bağlanması ve anında bir oyun oluşturulması çok daha kolay hale geliyor. Apex Legends geliştiricileriyle yapılan ve neden Unity Multiplay ve Matchmaker kullandıklarını anlattıkları röportajı da şöyle bırakalım.

Unity Gaming Services Backend

Unity Gaming Services Backend içeriğinde genel olarak oyuna dair arka planda kalan save (oyun kaydı), oyun güncelleme, oyun içi ekonomi ve oyuncu kaydı için çözümler bulunuyor. Bunlardan oyun güncelleme olarak bahsettiğim Cloud Code özellikle benim baya bir ilgimi çekti. Ancak daha detaya girmeden, bahsedeceğim sistemlerin şu an Beta sürecinde olduğunu belirtmekte fayda var. Yani güncellemeler gelecek ve haliyle sistemlerin çalışmalarında ufak değişikliklere sebep olabilecektir. 

Unity Cloud Code, temelde kodunuzun bir kısmını sunucuda tuttuğunuz bir yapı. Basitçe verebileceğimiz bir örnekle, bir zar atıyorsunuz ama burada olasılığı hesaplattığınız fonksiyonunuz sunucuda bulunuyor. Oyun internet üzerinden sunucuya bu fonksiyonda ihtiyaç duyulan bilgileri yolluyor, sunucu hesapları yapıyor ve oyuncuya geri yolluyor. Ne gerek var diyebilirsiniz böyle bir şeye. Ama diyelim ki, bu fonksiyonu biraz daha dengelemek istediniz veya tamamen çalışmasını değiştirdiniz. Bunu oyunculara aktarmak için oyunu güncelleyip tekrar build alıp oyuncuların indirmesini beklemeniz gerekiyor. Cloud Code ile bu sorunu çözmeniz çok daha kolay hale geliyor, çünkü çok sunucu üzerinden rahatlıkla kodunuzu güncelleyebiliyorsunuz. Hatta bunu tamamen internet tarayıcınız üzerinden yapmanız mümkün, en azından dokümanda verdikleri bilgi bu şekilde. 

Unity Cloud Save ve Unity Authentication sistemleriyle de oyuncularımızın sistemimize kayıt olmasını ve oyun verilerin saklamayı, daha önce bahsettiğim Cloud Code ile backend yapımızda bu verilerin iletimini, işlenmesini sağlayabiliyoruz. Daha öncesinde farklı çözümler ile bu sorunu çözmeye çalıştığımız düşünüldüğünde, kesinlikle işimize yarayacak bir sistem yaratıldığı belli.

Son olarak da Unity Economy sisteminden bahsedeceğim. Tahmin edeceğiniz üzere, oyununuz içerisindeki ekonomi, para ve eşya sistemiyle alakalı bir sistem. Yine Cloud Code sisteminde olduğu gibi, ekonomi sisteminizi tamamen sunucu tarafında düzenleyip, oyun güncellemesi ve oyuncuların bunu indirmesini beklemeden rahatlıkla bu düzenlemeyi hayata geçirebiliyoruz. Ayrıca yine bu sistem yazının devamında bahsedeceğimiz Unity In-App Purchase sistemiyle beraber de çalışabiliyor. Yani oyun için gerçek para ile alışverişlerimiz için, oyun içindeki paralar ve objelerin düzenlenmesini de gerçekleştirmemiz kolaylaştırılıyor. 

Unity Gaming Services Analytics ve Player Engagement

Unity Analytics ve Player Engagement, oyununuzu daha iyi analiz edebilmeniz ve oyuncuları oyununuza ilgi duymalarına devam ettirmenizi sağlayan 4 sistem içermekte. Bunlar; Analytics, Cloud Content Delivery, Remote Config ve Cloud Diagnostics. 

Unity Analytics, oyuncuların, oyun esnasında yaptığı işlemleri analiz ve takip etmenizi sağlayan bir sistem. Oyun içi belirli olayların oyuncular tarafından gerçekleştirildiğinde sunucuda kayıt altına alınması sayesinde, oyuncularımızın oyun içerisinde nelerle ilgilendiğine, hangi işlemleri gerçekleştirdiğine erişebiliyoruz. Böylece oyunumuzu analiz etmemiz daha kolay hale geliyor. 

Örneğin oyuncuların büyük bir kesiminin istediğimiz, yönlendirmeye çalıştığımız şekilde bir bölümü geçmeye çalışmalarını bekliyoruz. Ancak oyuncuların büyük bir çoğunluğu yöntemimizi tercih etmiyor. Bundan haberdar olabilmemiz için belirli bir analiz sistemine ihtiyacımız var. Bunu farkettikten sonra anında oyunumuzu ele alıp buna neyin sebep olabileceğini inceleyebiliriz. Tabii sebebi bulduktan sonra, bu sorunu gidermek için güncelleme yayınlamamız da gerekiyor. Bu noktada da Unity Cloud Content Delivery sistemini kullanabiliriz.

Unity Cloud Content Delivery sistemi, oyunumuzda yaptığımız güncellemeleri, yeni bir build almadan oyuncularımızla paylaşmaya imkan veren bir sistem. Temelde Unity Addressable altyapısını kullanıyor. Burada Addressable yapısı kilit bir nokta. Normalde bu yapı ile objelerinizi, sahnelerinizi paketleyip, herhangi bir sunucuya aktararak oyuncularınızla sunucuya güncel hallerini yollayarak otomatik olarak paylaşabiliyoruz. 

Unity Cloud Content Delivery sistemi ise hem sunucu olayını, hem de bu paketlerin sunucuya aktarılması, yayınlanması, denetlenmesi için gerekli şeyleri bize sunuyor. Yani geliştirme aşaması dışındaki teknik konular için ekstra bir zaman ve maddi kayıptan bizi kurtaran bir çözüm. Örneğin bir karakterimiz var ve artık bir şapkası olmasını istiyorsunuz, sadece prefabınızı güncelleyip, Unity sunucularına bunu aktarmanız yeterli oluyor. Addressable altyapısı ile, yaptığımız ayarlamalar sonucu oyunumuz açıldığında internete bağlı ise, bizim ayarladığımız sunucuda veri kontrolü yapıyor. Herhangi bir yeni veri varsa bunu çekiyor ve içeriğini güncelliyor. Ayrıca sadece bir obje de değil, tamamen sahneleri de aynı şekilde güncellememiz mümkün. 

Diyelim ki, bu kadar büyük değişiklikler yapmadan, yani tamamen bir sahne veya obje değişikliği yapmadan bazı ufak düzenlemeler yapmamız gerekiyor. Belki oyuncuların her level için gerekli xp hesabında kullanılan katsayı değeri, belki bir seviyede kazanacağı altın sayısı. Bunlar o kadar ufak değişiklikler ki, tamamen bir objeyi veya sahneyi güncellemeyle uğraşmamıza ve tekrar sunucuya aktarmamıza gerek kalmamalı. Ki, Unity Remote Config ile buna gerek de yok.

Unity Remote Config, tam sayı, bool gibi basit değerleri sunucularımızda tutarak, sanki bir sosyal medya hesabında bir ayar değiştirir gibi anında ve kolaylıkla oyun verilerinizi üzerinde düzenlemeler yapmanızı sağlayan bir sistem. Bu değişikliklerin hangi oyunculara erişeceğini de belirleyebiliriz. Örneğin konuma göre, o ülkenin bir bayramı için yalnızca o ülkedeki kullanıcılarınıza yönelik bir temayı aktif hale getirebiliriz. 

İstediğimiz şekilde güncellemelerimizi paylaşıyoruz, oyun içerisine gerçekleşen olayları gözlemleyebiliyoruz, gayet güzel. Ancak oyuncuların karşılaştığı herhangi bir sorun, oyun donması, kapanması gibi durumlardan da haberdar olmamız gerekiyor. Bunu yapabilmemiz için de tabii ki Unity bir sistem sunuyor, Unity Diagnostics.

Unity Diagnostics ile, oyuncularımızın karşılaştığı donma, kapanma gibi sorunlardan haberdar olabiliyoruz. Sadece “x kişi crash aldı, oyunu kapandı” şeklinde değil, baya detaylı bilgiler sunuyor bize bu sistem. Ayrıca oyunun hangi bölümlerinde bu durumun yaşandığı, teknik hata kodunu ve sorunun temelinde ne olabileceğini bu sistem sayesinde anlayabiliyoruz. 

Bu sistemlerle beraber Unity’nin kesinlikle geliştiricilere çok yardımcı olduğunu söylemek mümkün. Rahatlıkla güncelleme yapmak, sorunları takip edebilmek, anında ufak düzeltmeler yapmak, kesinlikle geliştirici tarafında zaman kazandıran şeyler. 

Unity Gaming Services Monetization & Growth

Oyunumuzu oluşturmak işin bir kısmı iken, bunu uygun kitlelere ulaştırmak ve oyunumuzdan gelir etmek ise diğer bir önemli kısmı. Ve ciddi şekilde önem verilmesi gereken bir kısım. Emeklerimizin karşılığını alıp oyunumuzu güncellemeye devam edebilmek veya yeni projelere başlayabilmek için bütçeye ihtiyaç duyacağımız su götürmez bir gerçek. Bunun için de Unity Gaming Services içerisinde 4 servis bulunuyor.

Unity Acquire sistemi ile, oyunumuz için uygun oyuncu kitlesini bulmak ve hedef kitlemize erişmemiz kolaylaşıyor. Belirlediğimiz kriterlere göre reklamları istediğimiz kitlelere sunarak, daha doğru bir şekilde istediğimiz oyunculara ulaşırken, bunu daha az maaliyetli şekilde gerçekleştirmemize de olanak tanıyor.

Oyunumuzdan gelir elde etme yollarından biri, oyun içi satın alımlar. Bunun için ise kullanabileceğimiz altyapı Unity In-App Purchase. Basit bir eklenti olarak bunu oyunumuza dahil ettiğimizde, AppStore veya PlayStore gibi farklı mağazalardan satın alma işlemlerini kolaylıkla oyunumuza entegre edebiliyoruz. Her mağaza için ayrı bir entegre süreci ile uğraşmamıza gerek kalmıyor. Satın almanın başlatılması ve satın almanın gerçekleşip gerçekleşmemesi durumları bu altyapı ile oyunumuzda kontrol edilebiliyor. 

Bir başka gelir elde yöntemi ise oyun içi reklamlar kullanmak. Unity Ads Monitize ile oyununuz içerisine bir reklam sistemini basitçe ekleyebiliyoruz. Sistem içerisinde ödüllü, kısa süreli gibi çeşitli reklam şekilleri de hazır olarak bulunuyor. Sisteminize ekledikten sonra nerede reklam girileceği veya nerede ödüllü reklam açılacağı ve ödülün kazanılıp kazanılmadığını rahatlıkla ayarlanabiliyor. 

Son olarak, beta sürecinde olan Unity Mediation ile size daha fazla gelir getirecek reklamların belirlenmesini,  kitlenizin hangi reklamlara daha çok ilgi duyduğu gibi verileri sunan bir altyapı. Ayrıca reklam alanlarınızı teklif veren reklam kampanyaları arasından seçerek doldurmanız, böylece daha yüksek gelir elde etmeniz de bu sistem içerisinde var olan bir özellik.

Unity Gaming Services oyun güncellemesi, oyuncuların birbirine bağlanması, hataların analizi gibi geliştiriciler için gerekli teknik özelliklerin yanında, ekonomik tarafı da rahatlatan çeşitli çözümler içeriyor. Özellikle dünya geneline erişmek ve teknik olarak daha rahat bir konumda olabilmek için bu servisleri kullanmayı göz önünde bulunmanızı kesinlikle öneriyorum.

Genel olarak Unity Gaming Services için diyeceklerim şuanlık bu kadar. Direkt olarak kaynaktan incelemek isterseniz buraya tıklayarak Unity kaynaklarından da bilgi edinebilirsiniz. Umarım faydalı bir içerik olmuştur. Yeni yazılarda görüşmek dileğiyle.

Unity Character Controller

Unity Character Controller, Rigidbody ile uğraşmadan etraftaki objelerle çarpışmaya sadık kalacak şekilde karakterlerimizi hareket ettirmemizi sağlayan bir bileşendir. Temelde böyle bir bileşene ihtiyaç duyma nedenimiz de her ne kadar gerçekçi hareketlere sahip bir kontrol mekaniği istesek de gerçekçiliğin tümünün bu kontrol mekaniğinde olmasını istemeyiz.

Örneğin klasik Doom-benzeri fps oyunlarını ele alalım. Karakterimiz aşırı hızlı hareket eder, aniden yön değiştirir ve aniden durur. Rigidbody temelli bir sistemde bunu başarmak ciddi manada uğraş gerektirir ve başarıldığında bile doğru şekilde hissettirmez. Unity Character Controller ise tam olarak bu ihtiyaçlara cevap verecek şekilde oluşturulmuştur. Etraftaki objelerin içinden geçmeden, istediğimiz şekilde karakteri hareket ettirmemizi sağlar.

Ayrıca, direkt olarak fizik sistemi aracılığıyla Rigidbody objelerin birbirine kuvvet uygulamasının aksine, Character Controller bundan etkilenmez. Rigidbody ile hareket ettirilen bir merminin, yüksek hızlarda başka bir rigidbody bileşene çarptığını düşünün. Ne kadar ağır olsa da diğer obje bu kuvvetten etkilenecek ve kontrolümüz dışında hareket edecektir. Mermiyi trigger halde kullanmak da bir çözüm tabii, ama sadece mermiler kuvvet uygulamıyor sonuçta 🙂 Bunun dışında olan örnek olaylarda da, kaçınmak istediğimiz temel şey, dışarıdan bir kuvvetin hareketimizi bozmasıdır. Rigidbody bileşeninde bu kontrolleri sağlamak bizim için ayrı bir iş yükü oluşturacaktır.

Tabii bu korunma etkisiyle, aynı şekilde Character Controller diğer rigidbody objelere kuvvet uygulayamaz. Yani temel haliyle diğer objeleri itemez, hareket ettiremez. Yazının devamında da örneğini bulacağınız şekilde, isterseniz bu özelliği OnCharacterColliderHit mesajı ile temas eden objelere elle kuvvet uygulama şeklinde gerçekleştirebilirsiniz.  

Tabii tam tersi şekilde, dış kuvvetlerden, diğer rigidbody objelerden otomatik olarak etkilenen bir karakteriniz olsun isteyebilirsiniz. O durumda Unity Rigidbody bileşeninden devam etmekte fayda var. 

Ayrıca hatırlatmakta fayda var, Unity’nin kendi yayınladığı en son karakter kontrolcüsü paketlerinde de Unity Character Controller kullanılıyor. Daha önce hazır sunulan pakette Rigidbody kullanılıyordu. Bu yeni kontrolcüler hakkında daha fazla bilgi edinmek isterseniz “Unity Starter Assets Yayınlandı” yazımıza göz atabilirsiniz.

Character Controller, kapsül şeklinde bir collider’a sahiptir. Bu sayede diğer objelerle olan çarpışmalardan haberdar olabilir. Bileşen üzerinden bu kapsülün yüksekliğini ve genişliğini belirlememiz mümkündür. Ayrıca ne kadar eğimli yüzeylerde dolanabilir, sahip olduğu collider merkez noktası nerede olmalıdır gibi çeşitli ayarları da yapabiliriz. Editör üzerinden yapabildiğimiz bu ayarları, aynı şekilde kod kısmından da oyun esnasında düzenlememiz mümkündür. Bunun için öncelikle Character Controller Özelliklerini inceleyelim.

Unity Character Controller Bileşeni
Unity Character Controller Bileşeni

Character Controller Özellikleri

Character Controller Özellikleri bileşeninin yapısını, etkileşim ayarlarını ve etkileşim durumlarına dair bilgileri tutan değişkenleri içerir. Bunların bazılarını anlık olarak değiştirirken, örneğin karakterin boyunu kısaltabiliriz, bazılarını sadece okuyabiliriz, örneğin karakter yere temas ediyor mu bilgisini elde edebiliriz. Her başlık altında örnek kod olmasa da, çoğu özelliği içeren örnek kodları da ekledim. Kodlar içerisindeki yorum satırları ile işleyişi daha iyi anlayabileceğinizi umuyorum.

center: Character Controller bileşenine ait olan kapsül konumunu belirlemizi, okumamızı sağlayan değişkendir. Vector3 cinsinden bir değerdir.

collisionFlags: Character Controller bileşenine ait kapsül ile yapılan diğer objeye temas durumlarında, karakterin hangi bölgesine (aşağısı, yukarısı, yanları) temas edildiği bilgisine erişmemizi sağlar. CollisionFlags enum tipinde değer döndürür.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//RequireComponent içerisinde CharacterController tipini belirtiyoruz, 
//böylece bu scripti atadığımız her objede Character Controller olduğundan emin olabiliriz, otomatik olarak eklenir.
[RequireComponent(typeof(CharacterController))]
public class KaradotCCCollisionFlags : MonoBehaviour
{
	
    private CharacterController controller;
   
	//Başlangıçta bileşenimize erişiyoruz ve değişkenimize alıyoruz.
    private void Start()
    {
        controller = GetComponent<CharacterController>();
    }

     void Update()
    {
      
        if (controller.collisionFlags == CollisionFlags.None)
        {
            print("Havada süzülüyor, temas yok!");
        }

        if ((controller.collisionFlags & CollisionFlags.Sides) != 0)
        {
            print("Etrafından bir şeylere temas ediyor");
        }

        if (controller.collisionFlags == CollisionFlags.Sides)
        {
            print("Yalnızca yanlardan temas var,başka bir temas yok");
        }

        if ((controller.collisionFlags & CollisionFlags.Above) != 0)
        {
            print("Tavana değiyor");
        }

        if (controller.collisionFlags == CollisionFlags.Above)
        {
            print("Sadece yukardıan temas,başka bir temas yok");
        }

        if ((controller.collisionFlags & CollisionFlags.Below) != 0)
        {
            print("Yere değiyor");
        }

        if (controller.collisionFlags == CollisionFlags.Below)
        {
            print("Yalnızca yere değiyor, başka bir temas yok");
        }
    }
}

detectCollisions: Collider ve diğer character controller bileşenine sahip objelerle olan temasların algılanıp algılanmayacağını belirtmemizi sağlayan değişkendir. Standart olarak sahip olduğu değer true değeridir. Yani standart olarak her teması algılar. 

enableOverlapRecovery: Diğer objelerle iç içe geçme durumunun otomatik olarak engellenip engellenmeyeceğini belirttiğimiz değişkendir. Bu koruma sistemi standart olarak aktiftir, yani bu değişken true değerine sahiptir. Böylece diğer objelerin içinde kalma, sıkışma gibi durumlar otomatik olarak engellenir. 

height: Karakter kapsülünün yüksekliğini tutan ve değiştirmemize imkan sağlayan değişkendir. Bunu değiştirerek karakter modeline uygun yüksekliğe getirebilirsiniz veya karakter eğildiğinde de eğilme boyutuna göre ayarlayıp, daha dar alanlardan geçmesini sağlayabilirsiniz. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//RequireComponent içerisinde CharacterController tipini belirtiyoruz, 
//böylece bu scripti atadığımız her objede Character Controller olduğundan emin olabiliriz, otomatik olarak eklenir.

[RequireComponent (typeof (CharacterController))]
public class KaradotCCCrouch : MonoBehaviour {

    private CharacterController controller;

    bool isCrouching = false;

    //Başlangıçta bileşenimize erişiyoruz ve değişkenimize alıyoruz.
    private void Start () {
        controller = GetComponent<CharacterController> ();
    }

    void Update () {
        if (Input.GetKeyDown (KeyCode.LeftControl)) {
            ChangeCrouch ();
        }
    }
    //Uyarmakta fayda var, bunu yaptığımızda merkeze doğru yükselik değişmekte
    //Yani bir kapsül düşünürsek, üstten ve alttan azalacaktır boyutunu kısalttığımızda
    //Bunu önlemek adına center değerini de objenin yere değecek kısmına göre ayarlamakta fayda var.
    //Örnek verdiğim kapsül objesinde bu kod işimize yarayacaktır. Görsel olarak olmasa da collider üzerinden bunu görebilir
    //eğilince daha kısa yerlerden geçebiliriz. 
    void ChangeCrouch () {
        isCrouching = !isCrouching;
        if (isCrouching) {
            controller.height = 1.5f;
            controller.center = new Vector3 (0, -.25f, 0);
        } else {
            controller.height = 2;
            controller.center = Vector3.zero;
        }
    }
}

isGrounded: Karakterin yere teması edip etmediği bilgisini elde etmemizi sağlayan değişkendir. Bool tipinde değer döndürür.

minMoveDistance: Karakterin hareket edebileceğini minimum mesafeye erişebileceğimiz ve bu mesafeyi değiştirebileceğimiz değişkendir. Karakter belirtilen mesafenin altındaki hareketleri gerçekleştirmeyecektir. Float cinsinde bir değişkendir.

radius: Karaktere ait kapsülün genişliğini tutan ve bu genişliği değiştirmemizi sağlayan değişkendir. Float cinsinde bir değişkendir.

skinWidth: Karaktere ait kapsülün etrafında oluşturulacak ve temasları algılamayı sağlayacak alanın kalınlığı. Birebir çevirirsek aslında deri kalınlığı gibi de oluyor ama, kafa karıştırmayalım 🙂 Normalde oldukça ufak tutmak gerekir, tabii oyununuzda geçerli olan boyutlar büyürse bunu da büyütmeniz gerekebilir. Float cinsinden bir değişkendir.

slopeLimit: Karakterin hareket edebileceği eğimli yüzeyler için maksimum eğim değeri. Açı cinsinden belirtilir. Basit bir örnekle 30 derece olarak ayarlarsanız, karakteriniz yalnızca 30 derece altındaki eğime sahip yüzeylerde hareket edebilir. Float cinsinden bir değişkendir.

stepOffset: Karakterin varolan zeminden daha yukarı çıkabileceği, adım atabileceği maksimum yüksekliği belirtir. Basit bir örnekle, eğer bu değer 2 ise ve 1 birimlik basamaklara sahip bir merdiveniniz varsa o merdiven üzerinde ilerleyebilirsiniz. Ancak 5 metrelik bir duvarın üstüne çıkmasını böylece engellemiş oluruz. Tabii basamak değerleri bu kadar yüksek olmaz normalde 🙂 Daha önce bahsettiğimiz height değerinden yüksek bir değer vermemeniz önemli, yoksa hata ile karşılaşabilirsiniz. Float cinsinden değer vermemiz gerekir.

velocity: Karakterimizin anlık konum değişim, hareketini Vector3 cinsinden elde etmemizi sağlayan değişkendir.

Character Controller Fonksiyonları

Unity Character Controller fonksiyonları ile karakterimizi 2 farklı şekilde hareket ettirebiliriz. 

Move: Karakterimizi belirttiğimiz anlık hareket değerine göre hareket ettirir. Yani anlık olarak, uyguladığımız karede ne kadarlık bir konum değişimi, hareket gerçekleşmesini istiyorsak bunu değişken olarak vermemiz gerekir. 

SimpleMove: Karakteri Vector3 cinsinde belirttiğimiz hızda hareket ettirmemizi sağlar. Ancak verdiğimiz Vector3 değişkeninin y değeri yani dikeyde yapılacak hareketi görmezden gelir. Ayrıca otomatik olarak karaterimize yerçekimi uygular. 

using UnityEngine;

//RequireComponent içerisinde CharacterController tipini belirtiyoruz, 
//böylece bu scripti atadığımız her objede Character Controller olduğundan emin olabiliriz, otomatik olarak eklenir.
[RequireComponent (typeof (CharacterController))]
public class KaradotCCMove : MonoBehaviour {
    //Karakterimizin CharacterController bileşeni, anlık hızı, yere temas edip etmeme durumu gibi verileri tutmak için değişkenlerimizi oluşturuyoruz.
    [SerializeField]
    private CharacterController controller;
    [SerializeField] private Vector3 playerVelocity;
    [SerializeField] private bool groundedPlayer;
    [SerializeField] private float playerSpeed = 2.0f, rotateSpeed = 2f;
    [SerializeField] private float jumpHeight = 1.0f;
    [SerializeField] private float gravityValue = -9.81f;

    [SerializeField]
    bool isSimpleMove = false;

    //Başlangıçta bileşenimize erişiyoruz ve değişkenimize alıyoruz.
    private void Start () {
        controller = GetComponent<CharacterController> ();
    }

    void Update () {

        //editor üzerinden rahat geçiş yapabilmek adına, bool tipinde bir değişken ile hangi tipte hareket istediğimiz kontrol edip
        //ona uygun fonksiyonları çağırıyoruz.
        //Normalde sadece birini kullanacağımız için böyle bir kontrol eklemeye gerek yok, tamamen ikisini görebilmek adına
        //kapatıp açabileceğimiz bir işlevsellik eklemek istedim.
        if (isSimpleMove) {
            SimpleMoveFunc ();
        } else {
            MoveFunc ();
        }

    }

    //Move fonksiyonu ile yapılan hareket, içerisinde zıplama da bulunuyor.
    void MoveFunc () {
        //Controller içerisinde isGrounded seçeneğine erişiyoruz ve değişkenimize alıyoruz.
        groundedPlayer = controller.isGrounded;
        //Eğer karakterimiz yerde ise ve y eksenindeki hareketi, yani dikeyde yaptığı hareketi negatif değere sahipse bunu sıfırlıyoruz.
        //Çünkü zaten yerde olduğu için içerisinden geçemeyecek, bu değeri tutarak aşağı doğru hareket ettirmeye çalışmamıza gerek yok.
        if (groundedPlayer && playerVelocity.y < 0) {
            playerVelocity.y = 0f;
        }

        //Horizontal ve Vertical axis değerlerini okuyarak kullanıcının verdiği girdiye göre bir Vector3 değişken oluşturuyoruz.
        //Bu temelde hareketimizin nasıl olacağını bize belirtmekte. Yalnızca x ve z eksenlerine değer aldığımıza dikkat edin.
        //Global yani genel sahne koordinat sisteminde yalnızca ileri geri veya sağa sola hareket ettirmek için değer oluşturuyoruz.
        Vector3 move = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical"));
        //Move fonksiyonu ile hareket gerçekleştiriyoruz. Burada dikkat etmemiz gereken şey
        //Time.deltaTime değeri. Bu değer bize bir önceki kare(frame) ile şu anki arasındaki zaman farkını verecektir.
        //Bizim oluşturduğumuz vektör 1 saniyede yapılacak hareketi temsil ediyor diyebiliriz, 
        //anlık kare farkı ile çaprtığımızda, ufak bir anda ne kadarlık bir hareketi gerçekleştireceğini elde etmiş oluyoruz.
        controller.Move (move * Time.deltaTime * playerSpeed);

        //Eğer herhangi bir hareket gerçekleştiriliyorsa, kullanıcı girdi oluşturduysa
        //karakterin ileri yönünü harekete eşitliyoruz. Yani karakterimiz hareket ettiğimiz yöne bakıyor.
        if (move != Vector3.zero) {
            gameObject.transform.forward = move;
        }

        //Burada karakterimiz yerdeyken "Jump" butonuna basılması durumunda, ki klavyede space tuşuna denk gelir,
        //Karakterimizin hız değerini değiştiriyoruz. Dikkat ederseniz yalnızca y eksenindeki değeri değiştiriyoruz, 
        //böylece yukarı yönlü bir hareket değeri elde etmiş oluyoruz.
        if (Input.GetButtonDown ("Jump") && groundedPlayer) {
            //Burada y değerine formül ile karşı koymamız gereken yer çekimi kuvvetini ve istedğimiz yüksekliği içeriyor.
            //ortadaki değerin negatif olmasının sebebi, aslında gravity değişkeninin tersini elde etmek ile alakalı. Direkt olarak
            //gravityValue başına da - işareti koyabilirsiniz.
            playerVelocity.y += Mathf.Sqrt (jumpHeight * -3.0f * gravityValue);
        }

        //Her kare(frame) içerisinde karakterimize yerçekimi uyguluyoruz ve yer çekimini uygulamak için hareket ettiriyoruz.
        playerVelocity.y += gravityValue * Time.deltaTime;
        controller.Move (playerVelocity * Time.deltaTime);
    }

    void SimpleMoveFunc () {
        // A-D tuşlarından ("Horizontal" input axis değerinden) gelen girdiye göre karakterimizi sağa sola çeviriyoruz.
        transform.Rotate (0, Input.GetAxis ("Horizontal") * rotateSpeed, 0);

        //Objemizin ileri yön vektörünü elde ediyoruz
        Vector3 forward = transform.TransformDirection (Vector3.forward);
        //  W-S tuşlarından ("Horizontal" input axis değerinden) gelen girdiler ile karakterimizin ileri veya geri hareket hızını belirleyip değişkene atıyoruz
        float curSpeed = playerSpeed * Input.GetAxis ("Vertical");
        //SimpleMove fonksiyonu aracılığıyla yön vektörümüz ve hız değerimizi çarparak ne kadar hızlı ve hangi yönde ilerleyeceğini beirtiyoruz.
        controller.SimpleMove (forward * curSpeed);
    }
}

Character Controller Mesajları

Character Controller mesajları arasında aslında tek mesaj bulunmakta. O da OnCharacterControllerHit mesajıdır.

OnControllerColliderHit Karakterimiz hareket ederken başka bir obje ile temas ettiğinde çalışır. Aynı collider mesajlarında olduğu gibi düşünebilirsiniz. 

using UnityEngine;

public class KaradotCCSimpleRigidbodyPush : MonoBehaviour {
    // Bu script sayesinde Character Controller kapsülüne temas eden her Rigidbody bileşenine sahip objeye kuvvet uygulanacak ve itilecektir
    [SerializeField] float pushPower = 2.0f;
    void OnControllerColliderHit (ControllerColliderHit hit) {
        Rigidbody body = hit.collider.attachedRigidbody;

        // Temas edilen objede rigidbody yoksa veya kinematic halde ise hiçbir şey yapmadan geri dönüyoruz
        if (body == null || body.isKinematic) {
            return;
        }

        // hareketimiz aşağı yönlü ise geri dönüyoruz, çünkü objeleri aşağı doğru itmek istemeyiz
        if (hit.moveDirection.y < -0.3) {
            return;
        }

        // moveDirection değişkeni ile hareket değerimizi elde ediyoruz
        // ve yalnızca x, z değerlerini alıyoruz ki objeleri yukarı veya aşağı doğru itmeyelim.
        Vector3 pushDir = new Vector3 (hit.moveDirection.x, 0, hit.moveDirection.z);
        //İsterseniz ayrıca karakterin hızını alıp, magnitude değerine göre kuvvetin şiddetini de ayarlayabilirsiniz.

        // Ve son adım olarak temas edilen rigidbody objesinin velocity değerini değiştiriyoruz.
        body.velocity = pushDir * pushPower;
    }
}

Unity Character Controller yazımızın sonuna gelmiş olduk böylece. Her ne kadar Türkçe çeviri halinde bu yazıları oluşturuyor ve sizinle paylaşıyor olsak da, dokümanı orjinal dilinde incelemek isterseniz buraya tıklamanız yeterli.

Unity Starter Assets Yayınlandı

0

Tamamen ücretsiz Unity Starter Assets Yayınlandı. Bu paketler içerisinde birinci şahıs (first person) ve üçüncü şahıs (third person) karakter kontrolcüleri bulunuyor. Unity ekibinin geliştirdiği bu paket ile, 2020 LTS ve üstü sürümlerde bu paketleri kolaylıkla kullanmaya başlayabilirsiniz. Asıl hedeflenen sürümler 2020 üstü olsa da,  bazı ufak düzenlemelerle önceki sistemlerde de çalıştırmanız mümkün. Ayrıca bu iki kontrolcüde de Cinemachine ve yeni Input System kullanılıyor. Böylece bu teknolojilere daha aşina olmanız ve bunlardan yararlanmanız da mümkün hale geliyor.

Starter Assets derken 2 paket diyip duruyorum, çünkü indirme için de asset store üzerinde 2 ayrı paket halinde yayınlandılar. Baktığımızda mantıklı olan bu, önceden Standart Assets içerisinde hangi dosyaları import edeyim gibi şeylerle uğraşıp vaktimizi harcıyorduk. Şu anki haliyle istediğimizi seçip, projemize ekleyerek hızlıca kullanmaya başlayabiliyoruz. Ayrıca örnekleri incelediğinizde de çok benzer şekilde kontrol işlemleri gerçekleştiğini, scriptlerin çok benzer olduğunu görebilirsiniz. 

Bu iki paket de hali hazırda built-in render pipeline kullanmakta, ancak URP veya HDRP sistemlerine de kolaylıkla geçiş yapabilirsiniz. URP ve HDRP hakkında daha fazla bilgi edinmek isterseniz Unity HDRP ve URP yazımızı inceleyebilirsiniz.

Unity Starter Assets Yayınlandı peki, ama Starter Assets paketleri içerisinde ne var?

Karakter Kontrolcüleri: Paketlerin temelinde birinci ve üçüncü şahıs kullanımı için 2 adet temel karakter kontrolcüsü bulunuyor.

Input System: Oyuncudan veri almak için eski Input sınıf yerine yeni Input System altyapısı kullanılmakta. Hem klavye ve fare, hem gamepad hem de dokunmatik ekranlar için kontrol ayarları paketler içerisinde hazır halde. Eğer hali hazırda eski Input sistemini kullanan bir projenize bunları dahil etmek istiyorsanız, Project Settings altında hem eski hem yeni sistemi kullanmak için ayarlama yapmanız mümkün.

Cinemachine: Cinemachine eklentisi aracılığıyla çeşitli kamera özelliklerini kendi isteğinize göre ayarlamanız mümkün. Ayrıca yine kontrolcü bileşenleri üzerinde de cinemachine için bazı değişkenler eklenmiş bulunmakta, böylece ihtiyacınıza göre değiştirmeniz mümkün. 

Görsel Ögeler: Paket içerisinde karakterde kullanabileceğiniz insansı modelin yanında, zemin, duvar gibi yapılar ve mobil kontrol için UI görselleri de bulunmakta. 

Uyumluluk: Paketlerin birbirinden bağımsız ve modüler halde olması sebebiyle çeşitli yapıdaki projelerde kullanılmaya başlanabilir. Ayrıca kullanım hazır prefablar ile anında sisteminize dahil edebilirsiniz. 

Unity Starter Assets kontrolcülerini ne için kullanabiliriz?

Unity Starter Assets içerisindeki kontrolcüler gerek protipleme gerek oyun yapısına göre, direkt olarak projelerinizde kullanmanız için yeterli temel özelliklere sahip halde. Bu sayede, ister yeni başlayan bir Unity kullanıcısı olun, isterseniz uzman bir oyun geliştiricisi, rahatlıkla projenize dahil edip çalışmaya başlayabilirsiniz. En güzel yanı, yeni başlıyorsanız da, sadece sahneye sürükleyip bırakarak kullanmanız mümkün. Böylece hem öğrenme sürecinde güzel şeyler üretebilmeniz için daha büyük bir adım atmış olacaksınız, hem de ortaya istediğiniz şeyleri çıkarabildiğiniz için motivasyonunuz yüksek kalacaktır 🙂 

Yazının sonunda bulunan videoda da anlattım ancak, yazılı olarak da kurulumdan bahsetmek istiyorum. Kurulumu gerçekleştirmek için, öncelikle aşağıda verdiğimiz linklerden paketleri “Add to My Assets” butonu ile kendi paketlerinize eklemeniz gerekiyor. Sonrasında Unity projenizi açıp, “Package Manager” altından “My Packages” seçeneğini seçtikten sonra, arama kısmından “Starter Assets” şeklinde arayarak indirip projeye aktarma işlemini gerçekleştirebilirsiniz. 

Öncelikle örnek sahneyi incelemenizi öneririm. İndirdiğiniz paketin klasörü içerisine girdiğinizde örnek sahneyi bulabilirsiniz. Kendi sahnenize eklemek istediğinizde ise, paketler ile gelen prefabları sahneye sürükleyip bırakmanız yeterli. İsterseniz direkt olarak üst menüde bulunan “Tools>Starter Assets” altında bulunan “Reset” ile başlayan controller seçeneklerini kullanarak da otomatik olarak eklemeyi gerçekleştirebilirsiniz. 

İndirme linkleri
Birincil Şahıs Karakter Kontrolcüsü
Üçüncü Şahıs Karakter Kontrolcüsü

Genel olarak Unity Starter Assets paketi için söylenebilecekler bu kadar. Videolu değerlendirme ve kullanımı izlemek isterseniz buyrun;

Unity Starter Assets Yayınlandı içeriğimiz genel olarak bu şekilde. Güncel içerikler için e-posta bildirim sistemimize abone olmayı, sosyal medya kanallarından takip etmeyi unutmayın. Yeni Unity içeriklerinde görüşmek dileğiyle, hoşçakalın.

Unity Monobehaviour Sınıfı

Unity Monobehaviour sınıfı, her bir Unity bileşenin, script dosyasının türetildiği temel sınıftır (base class). Herhangi bir bileşen yaratmak istiyorsanız, bunun direkt veya dolaylı olarak Monobehaviour sınıfından türetilmesi zorunludur. Unity üzerinde 1 defa bile bileşen, component oluşturduysanız Monobehaviour kelimesinin sınıf isminizin yanında yer aldığını görebilirsiniz. Yeni bir script oluşturduğumuzda karşımıza çıkacak olan kod şu şekilde gözükecektir. 

using UnityEngine;

public class NewComponentExample : MonoBehaviour {
    // Çalışan ilk karede çağırılır
    void Start () {

    }
    // Her bir karede çağırılır.
    void Update () {

    }
}

Burada gördüğümüz örnek, direkt olarak türetilmeyi bize gösteriyor. Ancak kendi temel sınıflarınızı oluşturup bundan yeni sınıflar türetmeniz de mümkün. Aşağıdaki kodu incelerseniz, önce toplanabilir şeklinde bir temel sınıf, ardından da meyveler için bir sınıf oluşturuyoruz. Yaptığımız şey de meyveler sınıfını toplanabilir sınıfından türetmek, bu şekilde dolaylı olarak da Monobehaviour sınıfından türetmiş oluyoruz aslında.

using UnityEngine;

public class Collectable : MonoBehaviour {
    public virtual void Collect () {
        Destroy (gameObject);
    }
}

public class Fruit : Collectable {
    public override void Collect () {
        base.Collect ();
        Debug.Log ("Fruit picked up" + gameObject.name);
    }
}

Monobehaviour sınıfını kullandığımızda, yazdığımız script artık oyundaki nesnelerimize (GameObject) bileşen olarak eklenebilir hale geliyor. Bu bileşenler aracılığıyla da farklı işlevleri objelerimize entegre edebiliyor. Az önce verdiğimiz örnek koddaki gibi, istediğimiz objeleri toplanabilir hale getirebiliriz. Bu konuda daha fazla bilgi edinmek için türetme konusunu da içeren “Unity Abstract Class ve Interface Kavramları” yazımızı inceleyebilirsiniz.

Unity Monobehaviour Sınıfı Özellikleri

runInEditMode: Editör üzerinde çalışırken bazı scriptlerin oyunu başlatmadan da çalışmasını isteyebiliriz. Basit bir örnek olarak verebileceğimiz ise, bir objenin sürekli dönmesi olabilir.

using UnityEngine;

public class RunInEditModeExample: MonoBehaviour {

    public float rotateSpeed = 15;
    // Start is called before the first frame update
    void Start () {
        runInEditMode = true;
    }
    // Update is called once per frame
    void Update () {
        transform.Rotate (Vector3.up, rotateSpeed * Time.deltaTime);
    }
}

Bu şekilde runInEditMode komutunu eklediğinizde, genelde yapmak istediğiniz şeye göre yalnızca etkileşime girdiğinizde komutun çalıştığını görebilirsiniz. Tam olarak aynı oyun modunda olduğu gibi çalışmasını isterseniz EditorApplication sınıfındaki Update işlemini inceleyebilirsiniz.

useGUILayout: Kodlar ile ekrana çizdirebileceğimiz GUI arayüz objelerini çizme durumunun es geçilmesini sağlayabileceğimiz komut. False değer atarsak bahsettiğimiz GUI arayüz durumu es geçilecektir. Ancak kodunuz içerisinde OnGUI fonksiyonu bulunuyorsa false değer verseniz bile ekrana çizilecektir. 

using UnityEngine;

public class UseGUILayoutExample: MonoBehaviour {

    // Start is called before the first frame update
    void Start () {
       useGUILayout = false;
    }
}

Unity Monobehaviour Sınıfı Public Fonksiyonları

Unity Monobehaviour Sınıfı public fonksiyonları ister script içerisinde isterseniz de farklı bir script ile erişebildiğimiz fonksiyonlardır. Genel olarak oluşturduğumuz sınıf içerisinde bulunan fonksiyonları farklı şekillerde çalıştırmamızı veya durdurmamızı sağlayan fonksiyonlardır.

CancelInvoke: Invoke veya InvokeRepeating komutuyla çağırılan ve hali hazırda çalışan bütün fonksiyonları veya belirtilen fonksiyonu durdurmamızı sağlayan komuttur. Eğer herhangi bir fonksiyon ismi verilmezse bahsedilen komutlarla çalıştırılan bütün fonksiyonlar durdurulur.

Invoke: Verilen isimdeki fonksiyonu belirtilen süre geçtikten sonra çalıştırmamızı sağlayan komuttur. 

InvokeRepeating: İsmi belirtilen fonksiyonu, belirtilen süre geçtikten sonra, tekrar tekrar çalıştıran fonksiyondur. Ayrıca ne kadar süreye sahip aralıklarla çalıştırılacağını da belirtebiliriz.

IsInvoking: Belirtilen isimdeki fonksiyon Invoke komutuyla çağırılmış ve çalıştırılmayı bekliyor mu durumunu kontrol etmemizi sağlayan komut. Eğer Invoke ile çağrılmış ancak henüz çalıştırılmadıysa true değer döndürecektir.  

using UnityEngine;

public class InvokeExamples : MonoBehaviour {
    //fırlatilacak obje
    public GameObject projectile;

    void Start () {
        // LaunchProjectile 2 saniye sonra başlayacak ve .3 saniye aralıkla devam edecek
        InvokeRepeating ("LaunchProjectile", 2, 0.3F);
        // Launching fonksiyonu 1 saniye sonra başlayacak.
        Invoke ("Launching", 1f);
    }

    void Launching () {
        Debug.Log ("Launching in one second");
    }

    void LaunchProjectile () {
        // projectile isimli objeyi yaratıp 5 birim hızda rastgele yönde velocity değeri atıyoruz.
        GameObject instance = Instantiate (projectile);
        Rigidbody rigidbody = instance.GetComponent<Rigidbody> ();

        rigidbody.velocity = Random.insideUnitSphere * 5;
    }

    void Update () {
        // Sol tık basıldığı anda LaunchProjectile isimli fonksiyona ait Invoke işlemini durduruyoruz.
        if (Input.GetButtonDown ("Fire1")) {
            //eğer hali hazırda çalışıyorsa işlemleri durduralım
            if (IsInvoking ("LaunchProjectile")) {
                CancelInvoke ("LaunchProjectile");
            } else { //eğer çalışan bir fonksiyon yoksa durumdan haberdar ediyoruz.
                Debug.Log ("Nothing to stop");
            }
        }
        //Eğer bütün işlemleri durdurmak isterseniz CancelInvoke() kullanın.
    }
}

StartCoroutine: IEnumarator dönüş tipine sahip olan bir fonksiyonu çağırarak bir Coroutine oluşturmamızı sağlar. 

StopAllCoroutines: Yazıldığı script içerisinde çalışan bütün Coroutine işlemlerini durdurmamızı sağlayan komuttur. 

StopCoroutine: Belirtilen Coroutine işlemini durdurmamızı sağlayan komuttur. 

using System.Collections;
using UnityEngine;

public class CoroutineExamples : MonoBehaviour {
    Coroutine yatayHareket, dikeyHareket;

    public int border = 5;

    //Objenin pozisyonunu sıfırlayıp gerekli hareket fonksiyonlarını StartCoroutine ile çalıştırıyoruz.
    void Start () {
        transform.position = Vector3.zero;
        yatayHareket = StartCoroutine ("Yatay");
        dikeyHareket = StartCoroutine ("Dikey");
    }
    //Sol-sağ fare tuşlarına tıklandıkça Coroutine çalıştıran durduran basit kontroller
    //Dikkat ederseniz hem değişken aracılığıyla hem de fonksiyon ismiyle durdurabilmemiz mümkün.
    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            if (yatayHareket != null) {
                StopCoroutine (yatayHareket);
                yatayHareket = null;
            } else
                yatayHareket = StartCoroutine ("Yatay");
        }
        if (Input.GetMouseButtonDown (1)) {
            if (dikeyHareket != null) {
                StopCoroutine ("Dikey");
                dikeyHareket = null;
            } else
                dikeyHareket = StartCoroutine ("Dikey");
        }

        if (Input.GetKeyDown (KeyCode.Space)) {
            StopAllCoroutines ();
        }
    }
    //Durdurulmadığı sürece y ekseninde belirtilen +- border değeri arasında hareket ettirmeyi sağlayan fonksiyon
    //WaitForEndOfFrame ile her bir karede çalışmasını sağlıyoruz.
    IEnumerator Yatay () {
        Vector3 movement = Vector3.up;
        while (true) {
            if (transform.position.y > border) {
                movement = Vector3.down;
            } else if (transform.position.y < -border) {
                movement = Vector3.up;
            }
            transform.position += movement * Time.deltaTime;
            yield return new WaitForEndOfFrame ();
        }
    }
    //Durdurulmadığı sürece x ekseninde belirtilen +- border değeri arasında hareket ettirmeyi sağlayan fonksiyon
    IEnumerator Dikey () {
        Vector3 movement = Vector3.right;
        while (true) {
            if (transform.position.x > border) {
                movement = Vector3.left;
            } else if (transform.position.x < -border) {
                movement = Vector3.right;
            }
            transform.position += movement * Time.deltaTime;
            yield return new WaitForEndOfFrame ();
        }
    }
}


Coroutine işlemleri ile ilgili daha detaylı bilgi için “Unity Coroutine nedir?” yazımızı inceleyebilirsiniz.

Unity Monobehaviour Sınıfı Mesajlar

Unity Monobehaviour sınıfı mesajları aslında oyun çalışırken var olan döngü içerisinde çeşitli durumlar için farklı işlemler oluşturmamızı sağlayan komutlardır. Görselde göreceğiniz üzere, her bir karede sırayla çalışan farklı işlemler bulunmakta. Resme sağ tıklayıp yeni sekmede açarak tam halini görebilir ve inceleyebilirsiniz.

Yazının devamında belirtilen mesajlar da aslında her bir işlem için oluşturulan fonksiyon taslakları denilebilir. Bu isimlerde fonksiyonlar yarattığımızda, Unity uygulamanın çalışma esnasında bunların hangi sırada veya ne zaman çalışacağını bizim için ayarlayacaktır. Öncelikle en sık kullanacağımız fonksiyonlardan başlayıp sonrasında alfabetik olarak inceleyelim tek tek.

Bu arada belirtmekte fayda var, Unity dokümanını incelediğinizde Network, ağ bağlantılarıyla alakalı fonksiyonlar da bulunuyor. Ancak bunlar yeni sistemde var olmayan ve gelecekte de desteklenmeyecek fonksiyonlar olduğundan bu yazıda onlara yer vermedim.

Start: Obje ilk yaratıldığı anda herhangi bir update fonksiyonu çağrılmaya başlanmadan önce çağrılan fonksiyondur. Yazdığınız script’e dair genel ayarlamaları yapmak için uygundur.

Update: Bileşen aktif olduğu sürece her bir karede çağrılan fonksiyondur.

using UnityEngine;

public class StartUpdateExample : MonoBehaviour {

    Material material;
    //Renderer bileşenine erişmeye çalışıp materyali değişkene alıyoruz, renderer yoksa uyarı veriyoruz.

    private void Start () {
        if (TryGetComponent<Renderer> (out Renderer renderer)) {
            material = renderer.material;
        } else {
            Debug.LogError ("Objede renderer olmalı");
            //eğer editörde çalışıyorsak play moddan çıkış yapıyoruz, diğer durumda uygulamayı kapatıyoruz.
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#else
            Application.Quit ();
#endif
        }
    }

    //Update fonksiyonu her bir karede(frame) çalışacaktır.
    private void Update () {
        //WASD tuşlarına basıldığında objeyi hareket ettirip materyal rengini değiştiriyoruz.
        if (Input.GetKeyDown (KeyCode.A)) {
            transform.position += Vector3.left;
            material.color = Color.black;
        }
        if (Input.GetKeyDown (KeyCode.D)) {
            transform.position += Vector3.right;
            material.color = Color.white;
        }
        if (Input.GetKeyDown (KeyCode.W)) {
            transform.position += Vector3.forward;
            material.color = Color.blue;
        }
        if (Input.GetKeyDown (KeyCode.S)) {
            transform.position += Vector3.back;
            material.color = Color.red;
        }

        //Her karede global Y ekseninde, 1 saniyede 360 derece döndürüyoruz
        transform.Rotate (Vector3.up * 360 * Time.deltaTime);
    }
}

Awake: Awake fonksiyonu oyun çalışırken scriptin yüklendiği ilk anda çağırılan fonksiyondur. 

FixedUpdate: FPS değerinden farklı olarak, sabit zaman aralıklarıyla çalışan fonksiyondur. Update fonksiyonuna benzese de, elde edilen kare sayısından bağımsız olduğundan dolayı, fizik işlemlerini uygulamak amacıyla kullanıma daha uygundur. 

using UnityEngine;

public class AwakeFixedUpdateExample : MonoBehaviour {

    public float jumpForce = 15f;
    Rigidbody rigidbody;

    //Başlangıçta rigidbody değişkenine erişip bir değişkende saklıyoruz.
    void Awake () {
        rigidbody = GetComponent<Rigidbody> ();
    }

    //Space tuşuna basıldığında belirtilen büyüklükte yukarı yönlü bir kuvvet uyguluyoruz. 
    void FixedUpdate () {
        if (Input.GetKeyDown (KeyCode.Space))
            rigidbody.AddForce (Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

Reset: Inspector panelinde bulunan bileşene ait ayarlar menüsünde bulunan Reset butonuna basıldığı anda çağrılır, temelde yaptığı şey bütün değişken değerlerini sıfırlamaktır. Bu değişkenleri kendinize göre ayarlamak için bunu fonksiyonu kullanabilirsiniz. Örneğin oyuncuyu takip edecek bir objede “target” değişkeni Reset ile null hale gelecektir. Player etiketine sahip objeyi bulup atama yapmasını sağlayabilirsiniz. 

using UnityEngine;

public class ResetExample : MonoBehaviour {
    [SerializeField]
    Transform target;

    private void Reset () {
        GameObject player = GameObject.FindGameObjectWithTag ("Player");
        if (player != null)
            target = player.transform;
        else
            Debug.LogWarning ("Sahnede 'Player' tagına sahip obje yok");
    }
}

LateUpdate: Update ve genel Coroutine işlemleri sonrasında, aslında genel olarak yazdığımız oyun mantığının işlendiği her bir karenin sonrasında çağırılan fonksiyondur. Özellikle komutların sıralanması için kullanışlıdır. Örneğin bir kamera script dosyasında, takip edilen objenin Update içerisinde takip ediliyor olması işlemleri doğru yapmamızı engelleyebilir. Update içerisinde takip eden obje hareket eder, işlemlerini bitirir ve kamera objesi de LateUpdate içerisinde sırası gelince gerekli konum ve açı değişikliğini yapar. 

using UnityEngine;

public class LateUpdateExample : MonoBehaviour {
    [SerializeField]
    Transform target;
    Vector3 offset;
    //Hedef ile aradaki mesafeyi alıyoruz
    void Start () {
        offset = target.position - transform.position;
    }
    //Aradaki mesafeyi kullanarak sürekli olarak pozisyon ve rotasyon belirliyoruz
    void LateUpdate () {
        transform.position = target.position - offset;
        transform.rotation = Quaternion.LookRotation (offset);
    }
}

OnDestroy: Bileşenin kendisi veya obje bir şekilde yok edildiğinde (destroy), veya yeni sahneye geçildiğinde, uygulama kapatıldığında da çağırılacak fonksiyondur. 

OnDisable: Obje veya bileşen deaktif hale geldiğinde çağırılan fonksiyondur. Ayrıca herhangi bir şekilde yok edilmeleri durumunda da çağırılacaktır.

OnEnable: Obje aktif hale geldiği anda çağrılan fonksiyondur. 

using UnityEngine;

public class ActiveDeactiveState : MonoBehaviour {
    private void OnDestroy () {
        print (transform.name + " isimli obje yok edildi");
    }
    private void OnDisable () {
        print (transform.name + " isimli obje deaktif hale getirildi");
    }
    private void OnEnable () {
        print (transform.name + " isimli obje aktif hale getirildi");
    }
}

OnAnimatorIK: Animator bileşeni tarafından dahili olan IK sistemi güncellendiğinde otomatik olarak çağırılır. Bu fonksiyon içerisinde IK konumları güncellenebilir ve ne kadar etkili olacakları belirtilebilir.

using System.Collections;
using UnityEngine;

public class OnAnimatorIKExample : MonoBehaviour {
    float leftFootPositionWeight;
    float leftFootRotationWeight;

    Transform leftFootTarget;

    Animator animator;
    //animator bileşenine erişip bir değişkene aktarıyoruz.
    void Start () {
        animator = GetComponent<Animator> ();
    }
    //Sol ayağın pozisyon ve açı değerlerini belirtilen objeyi kopyalayacak şekilde IK aracılığıyla ayarlıyoruz.
    void OnAnimatorIK (int layerIndex) {
        animator.SetIKPositionWeight (AvatarIKGoal.LeftFoot, leftFootPositionWeight);
        animator.SetIKRotationWeight (AvatarIKGoal.LeftFoot, leftFootRotationWeight);
        animator.SetIKPosition (AvatarIKGoal.LeftFoot, leftFootObj.position);
        animator.SetIKRotation (AvatarIKGoal.LeftFoot, leftFootObj.rotation);
    }
}

OnAnimatorMove: Her bir karede çağırılan ve animator objesi aracılığıyla konum bilgisini değiştirmemize olanak veren fonksiyondur. Sıralama olarak OnAnimatorIK fonksiyonundan önce çalışmaktadır.

OnApplicationFocus: Geliştirdiğimiz oyun veya uygulamanın o an aktif mi yoksa arkaplanda mı olduğunu elde etmemizi sağlayan fonksiyondur. True veya false değer elde etmemizi sağlar. Dikkat edilecek bir diğer şey de, unity dokümanlarına göre, Android sistemlerde klavye açılırsa bu fonksiyon false değer alacaktır, yani oyun odak noktası olmayacaktır artık. 

OnApplicationPause : Uygulamanın sistem tarafından durdurulup durdurulmadığını anlamamızı ve ona göre işlemler yapmamızı sağlayan fonksiyondur. OnApplicationFocus ile benzer şekilde çalışıyor gibi görünse de, birbirlerinden farklıdırlar. 

using System.Collections;
using UnityEngine;

public class AppPaused : MonoBehaviour
{
    bool isPaused = false;

    void OnGUI()
    {
        if (isPaused)
            GUI.Label(new Rect(100, 100, 50, 30), "Game paused");
    }

    void OnApplicationFocus(bool hasFocus)
    {
        isPaused = !hasFocus;
    }

    void OnApplicationPause(bool pauseStatus)
    {
        isPaused = pauseStatus;
    }
}

OnApplicationQuit: Uygulamadan çıkış yapılmadan önce işlemler yapmamız için kullanabileceğimiz fonksiyon. Oyuncunun durumunu kayıt gibi işlemleri burada gerçekleştirebiliriz. 

using UnityEngine;

public class LevelManager : MonoBehaviour {
    int currentLevelID;

    private void OnApplicationQuit () {
        //varolan sahne ID değerini alıp playerPrefs üzerinden kayıt alıyoruz.
        PlayerPrefs.SetInt ("LastLevelID", currentLevelID);
        PlayerPrefs.Save ();
    }
}

OnAudioFilterRead: Audio Source üzerinden gelen veriyi manipüle etmemizi sağlayan fonksiyondur. Bu sayede varolan sesleri manipüle edebiliriz veya prosedüral olarak ses yaratabiliriz.

using UnityEngine;

//Bu örnekte prosedural olarak verilen hızda metronom sesi çaldırma işlemi gerçekleştirilmektedir.
[RequireComponent (typeof (AudioSource))]
public class OnAudioFilterReadExample : MonoBehaviour {
    public double bpm = 140.0F;
    public float gain = 0.5F;
    public int signatureHi = 4;
    public int signatureLo = 4;

    private double nextTick = 0.0F;
    private float amp = 0.0F;
    private float phase = 0.0F;
    private double sampleRate = 0.0F;
    private int accent;
    private bool running = false;

    void Start () {
        accent = signatureHi;
        double startTick = AudioSettings.dspTime;
        sampleRate = AudioSettings.outputSampleRate;
        nextTick = startTick * sampleRate;
        running = true;
    }

    /*
    OnAudioFilterRead ile 2 tipte veri geliyor bize. 
    gelen veriler üzerinde oynamalar yaparak istediğimiz hızda bir metronom sesi yaratıyoruz.
    Herhangi bi dosya vermemize gerek kalmıyor.
    */
    void OnAudioFilterRead (float[] data, int channels) {
        if (!running)
            return;

        double samplesPerTick = sampleRate * 60.0F / bpm * 4.0F / signatureLo;
        double sample = AudioSettings.dspTime * sampleRate;
        int dataLen = data.Length / channels;

        int n = 0;
        while (n < dataLen) {
            float x = gain * amp * Mathf.Sin (phase);
            int i = 0;
            while (i < channels) {
                data[n * channels + i] += x;
                i++;
            }
            while (sample + n >= nextTick) {
                nextTick += samplesPerTick;
                amp = 1.0F;
                if (++accent > signatureHi) {
                    accent = 1;
                    amp *= 2.0F;
                }
                Debug.Log ("Tick: " + accent + "/" + signatureHi);
            }
            phase += amp * 0.3F;
            amp *= 0.993F;
            n++;
        }
    }
}

OnBecameInvisible: Scriptin bulunduğu objenin kameranın görüşünde çıktığı an istediğimiz işlemleri gerçekleştirmemizi sağlayan fonksiyondur. 

OnBecameVisible: Scriptin bulunduğu objenin kamerada görünür hale geldiğinde çağırılan fonksiyondur. 

using UnityEngine;

//Sadece kamerada görünür olmadığı durumlarda hedefi takip etme işlemini gerçekleştiren script
public class WeepingAngel : MonoBehaviour {

    [SerializeField]
    Transform target;
    [SerializeField]
    float speed = 15;

    bool canMove = false;

    private void OnBecameVisible () {
        canMove = false;
    }

    private void OnBecameInvisible () {
        canMove = true;
    }
    //hareket edebilir (canMove) değeri false ise  return komutu ile fonksiyonu direkt geri döndürüyoruz, yani return satırı sonrasına geçmiyor işlemler.
    //eğer true değere sahipse, hedef objeye doğru hareket ettiriyoruz.
    private void Update () {
        if (!canMove)
            return;
        //hedef konumundan varolan konumumuzu çıkardığımızda gitmemiz gereken yönü elde ediyoruz. 
        Vector3 direction = target.position - transform.position;
        //Daha sonra elde ettiğimiz vektörü 1 birim uzunluğa sahip olacak şekile getiriyoruz, normalleştiriyoruz.
        direction.Normalize ();
        //ardından direction, yön değerini kullanarak objemizi hareket ettiriyoruz.
        transform.position += direction * speed * Time.deltaTime;
    }
}

OnCollisionEnter: Objenin başka bir objeye temas ettiği, dokunduğu an çalışan fonksiyondur.

OnCollisionExit: Objenin başka bir objeyle temasının bittiği an çağırılan fonksiyondur. 

OnCollisionStay: Objenin başka bir obje ile teması sürdüğü sürece her bir karede çağırılan fonksiyondur. 

using UnityEngine;

public class Fire : MonoBehaviour {
    [SerializeField]
    float damageAmount;

    //temas başladığı anda temasa başlanan objenin hasar alabilir (Damageble) isimli bileşene sahip olup olmadığını kontrol ediyoruz.
    private void OnCollisionEnter (Collision other) {
        other.gameObject.TryGetComponent<Damageble> (out Damageble damageble);
        //Eğer damageble bileşeni varsa, hasar alma efektlerini aktif hale getiriyoruz.
        if (damageble != null) {
            Debug.Log (damageble.damagebleName + "isimli obje yakılmaya başlandı.");
            damageble.ActivateDamageEffect (true);
        }
    }
    //temas bittiği anda temas halindeki objenin hasar alabilir (Damageble) isimli bileşene sahip olup olmadığını kontrol ediyoruz.
    private void OnCollisionExit (Collision other) {
        other.gameObject.TryGetComponent<Damageble> (out Damageble damageble);
        //Eğer damageble bileşeni varsa, hasar alma efektlerini deaktif hale getiriyoruz.
        if (damageble != null) {
            damageble.ActivateDamageEffect (false);
            Debug.Log (damageble.damagebleName + "isimli obje söndü.");
        }
    }
    private void OnCollisionStay (Collision other) {
        other.gameObject.TryGetComponent<Damageble> (out Damageble damageble);
        if (damageble != null) {
            /*Eğer damageble bileşeni varsa, DoDamage fonksiyonu ile hasar uyguluyoruz.
            Aynı update gibi temas olduğu her an, her karede çalıştığı için 
            Time.deltaTime ile hasar değerimizi çarparak, 1 kare geçişinde ne kadarlık hasar
            vermek istediğimizi belirtiyoruz.
            */
            damageble.DoDamage (damageAmount * Time.deltaTime);
            Debug.Log (damageble.damagebleName + "hâlâ yanıyor.");
        }
    }
}

//Damageble isimli bir script yaratıp o dosyaya koymayı unutmayın.
public class Damageble : MonoBehaviour {
    [SerializeField]
    float health = 100;

    public string damagebleName = "Object";

    [SerializeField]
    ParticleSystem damageEffect;

    //Health değerini verilmek istenen hasar kadar azaltıyoruz, ardından 0'ın altına indiyse objeyi yok ediyoruz.
    public void DoDamage (float damageAmount) {
        health -= damageAmount;

        if (health <= 0) {
            Debug.Log (damagebleName + "isimli obje yok oldu");
            Destroy (gameObject);
        } else {
            Debug.Log (damagebleName + "isimli obje " + damageAmount + " kadar hasar aldı, anlık sağlığı" + health);
        }
    }
    //Hasar alma efektlerinin açılıp kapanması için kullanacağımız fonksiyon.
    public void ActivateDamageEffect (bool isActive) {
        if (isActive)
            damageEffect.Play ();
        else
            damageEffect.Stop ();
    }
}

OnCollison fonksiyonlarında dikkat ederseniz Collison tipinde bir değişken belirtmemiz gerekiyor. Bu veri Unity tarafından bize sağlanıyor. Örnekte kullanmadık ancak Collision tipi veriler içerisinde temas etme noktaları, temas edilen objenin collider ve rigidbody gibi bileşenleri bulunmakta. Daha detaylı bilgi elde etmek isterseniz, Unity Collision dokümanına göz atabilirsiniz. Türkçe çevirisi de yakında sitemize eklenecektir 🙂

OnCollisionExit2D: 2D fizik sistemine sahip bir objenin başka bir obje ile teması bittiği an çağırılan fonksiyondur. 

OnCollisionEnter2D: 2D fizik sistemi kullanan objenin başka bir objeye temas ettiği, değdiği an çalışan fonksiyondur. 

OnCollisionStay2D: 2D fizik sistemine sahip bir objenin başka bir obje ile teması sürdüğü sürece her bir karede çağırılan fonksiyondur. 

Yazının öncesinde kullandığımız Collision örneğini de 2D için kullanabilirsiniz. Yalnız dikkat etmeniz gereken şey, objelerde Rigidbody2D ve Collider2D bileşenlerinin olması. Eğer 3d için olan fizik bileşenlerik kullanırsanız 2D fonksiyonları çalışmayacaktır. Ayrıca 2D versiyonlarda Collision yerine Collision2D tipinde değişken kullanıyoruz. Collision2D tipindeki verilerle hangi değişkenlere erişebileceğinizi Unity Collision2D dokümanından inceleyebilirsiniz.

OnControllerColliderHit: Character Controller bileşenine sahip bir objede, Character Controller bileşeniyle gelen collider nesnesinin başka bir nesne ile temas etmesi durumunda çağrılan fonksiyondur.

using UnityEngine;

//Character Controller bileşeni ile hareket ettirilen bir objenin 
//Rigidbody bileşenine sahip olduğu objeleri ittirmesini sağlayan komut.
public class CharacterControllerInteractions : MonoBehaviour {
    public float pushPower = 2.0F;

    void OnControllerColliderHit (ControllerColliderHit hit) {
        //temas edilen objedeki rigidbody bileşenine erişiyoruz.
        Rigidbody body = hit.collider.attachedRigidbody;

        //Temas edilen objede rigidbody yok veya kinematic halde ise return ile hiçbir şey yapmadan dönüyoruz.
        if (body == null || body.isKinematic)
            return;

        // eğer Character Controller aşağı doğru hareket ediyorsa, aşağımızda bulunan objeleri itmek istemeyiz bu yüzden yine geri dönüyoruz. 
        if (hit.moveDirection.y < -0.3f)
            return;

        //Gittiğimiz yöne göre temas ettiğimiz objeye uygulanacak itme için yön belirliyoruz.
        Vector3 pushDir = new Vector3 (hit.moveDirection.x, 0, hit.moveDirection.z);
        //Elde ettiğimiz yön değerini itme kuvveti ile çarparak temas edilen objenin velocity, hareket değerine atıyoruz.
        //Eğer karakterinizin gitmesini istediğiniz belirli bir hız varsa, bunu da çarpım işlemine ekleyebilirsiniz.
        body.velocity = pushDir * pushPower;
    }
}

Rigidbody bileşenine dair daha detaylı bilgi edinmek isterseniz Unity Rigidbody Nedir? yazımıza göz atabilirsiniz.

OnDrawGizmos: Gizmos sınıfı aracılığıyla hareket veya rotation gibi şekilleri gibi görsel şekiller çizmemize imkan sağlayan fonksiyondur. Sizin için önemli olan veya İstediğiniz objeleri daha belirgin hale getirmek için kullanabilirsiniz.

OnDrawGizmosSelected: OnDrawGizmos fonksiyonu gibi çalışır, ancak sadece obje seçili halde ise oluşturulan Gizmo gözükecektir. 

using UnityEngine;

public class OnDrawGizmosExample : MonoBehaviour {

    float areaRadius = 3;

    //Objenin bulunduğu konumda, mavi renkte, 1 birimlik ölçülere sahip bir küp çizdiriyoruz ekranda.
    //Böylece objeyi diğerlerinden ayırt etme ve seçme işlemlerini daha rahat gerçekleştirebiliyoruz.
    private void OnDrawGizmos () {
        Gizmos.color = Color.blue;
        Gizmos.DrawCube (transform.position, Vector3.one);
    }
    //Objeyi seçtiğimiz anda kırmızı renkli, çizgilerden oluşan bir daire çiziyoruz.
    //Örneğin bir kuleniz var ve belirli alana giren düşmanlara saldırabilmesini istiyorsunuz.
    //AreaRadius değişkeni ile oynayarak ne kadarlık alanda saldırı yapabileceğini görsel olarak tespit etmeniz kolaylaşacaktır.
    private void OnDrawGizmosSelected () {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere (transform.position, areaRadius);
    }
}

OnDrawGizmos fonksiyonlarında, Gizmos sınıfını kullandığımızı farketmişsinizdir. Gizmos sınıfına dair daha detaylı bilgi edinmek için Unity Gizmos Sınıfı yazımızı inceleyebilirsiniz.

OnGUI: Ekran üzerinde arayüz bileşenlerini kodlar aracılığıyla oluşturmamıza imkan veren fonksiyondur. GUI sınıfı aracılığıyla ekrana butonlar, yazılar, görseller yerleştirmek mümkündür. GUI sınıfı hakkında daha fazla bilgi edinmek için Unity GUI dokümanını inceleyebilirsiniz. Kod ile arayüz oluşturmak biraz zahmetli olsa da veya uygulamanızı yayınlarken kullanmanız önerilmese de, geliştirme sürecinde bazı verileri ekranda göstermek, oyuna daha rahat müdahale etmek gibi amaçlarla kendiniz için arayüzler oluşturabilirsiniz.

using UnityEngine;

public class OnGUIExample : MonoBehaviour {
    int yPos = 10, yHeight = 100;

    //Basit bir buton çizdiriyoruz ve tıklandığında ekranda aşağı hareket ettirip metin yazdırıyoruz.
    private void OnGUI () {
        if (GUI.Button (new Rect (10, yPos, 150, yHeight), "Bana Tıkla!!")) {
            print ("Oha bana tıkladın!");
            MoveDown ();
        }
    }
    //ypos değerini butonun yüksekliği kadar arttırdığımızda ekranda kendi boyu kadar yer değiştirmiş olacak.
    void MoveDown () {
        yPos += yHeight;
    }
}

OnJointBreak: Birbirine Joint bileşeni ile bağlı objelerin uygulanan kuvvet sebebiyle birbirinden ayrılması, kopması durumunda çağrılan fonksiyondur. Kopmaya sebep olan kuvveti float cinsinden bize vermektedir.

using UnityEngine;

public class OnJointBreakExample : MonoBehaviour {
    private void OnJointBreak (float breakForce) {
        print (transform.name + " isimli objeye ait joint " + breakForce + " büyüklüğünde kuvvet ile ayrıldı.");
    }
}

OnJointBreak2D: 2D fizik objelerinde birbirine 2D Joint ile bağlanmış objelerin, uygulanan kuvvet sonucu birbirinden ayrılması, kopması durumunda çağrılan fonksiyondur. Joint2D tipinde değeri bize vermektedir.

using UnityEngine;

public class OnJointBreak2DExample : MonoBehaviour {
    private void OnJointBreak2D (Joint2D brokenJoint) {
        print (transform.name + " isimli obje " + brokenJoint.reactionForce +
            " kuvveti ve " + brokenJoint.reactionTorque + " torku ile koptu.");
    }
}

OnMouseEnter: Fare imleci collider bileşenine sahip objenin üzerine getirildiği anda çağrılan fonksiyondur.

OnMouseExit: Fare imleci objenin üzerinden çekildiği an çağrılan fonksiyondur. 

OnMouseOver: Fare imleci objenin üzerinde durduğu süre boyunca, her karede çağrılan fonksiyondur.

using UnityEngine;

public class OnMouseExamples : MonoBehaviour {
    public Renderer rend;

    float colorTimer;

    //Başlangıçta renderer bileşenine erişiyoruz.
    void Start () {
        rend = GetComponent<Renderer> ();
    }

    //Fare ile üzerine geldiğimizde materyal rengini kırmızı yapıyoruz ve colorTimer değerini sıfırlıyoruz
    void OnMouseEnter () {
        rend.material.color = Color.red;
        colorTimer = 0;
    }

    //Fare objenin üzerinde durduğu sürece, rengi kırmızıdan maviye döndürüyoruz.
    //Color.Lerp fonksiyonu iki renk arasında geçiş yapmamızı sağlıyor, 3. değişken olan colorTimer 0 ise ilk değer, 1 ise 2.değer dönüyoruz
    //.5f verirsek de tam ikisinin arasında bir renk değeri elde ederiz. 
    void OnMouseOver () {
        colorTimer += Time.deltaTime;
        rend.material.color = Color.Lerp (Color.red, Color.blue, colorTimer);
    }

    //Fareyi objenin üzerinden çektiğimiz anda tekrar beyaz renge döndürüyoruz.
    void OnMouseExit () {
        rend.material.color = Color.white;
    }
}

OnMouseDown: Collider bileşenine sahip bir objenin üzerine fare ile tıklandığında çağrılan fonksiyondur.

OnMouseDrag: Collider bileşenine sahip bir objenin üzerine fare ile tıklandığında ve tıklama bırakılmadan fare hareket ettirildiği süre boyunca çağrılan fonksiyondur.

OnMouseUp: Fare imleci objenin üzerindeyken fareye tıklama bırakıldığı anda çağrılan fonksiyondur. Ancak dikkat etmekte fayda var, a objesinin üzerindeyken tıklama işlemi yapılıp, daha sonrasında tıklama devam ederken b objesinin üzerine gelip, tıklama bırakılırsa bu fonksiyon yine çalışacaktır. Yani tıklanan obje ile tıklamanın bırakıldığı obje aynı objeler olmak zorunda değildir. 

using UnityEngine;

public class OnMouseInteraction : MonoBehaviour {
    Vector3 startScale;
    Vector3 oldMousePosition;
    //fare ile tıkladığı anda objenin boyutlarını ve farenin tıklama anındaki konumunu değişkenlere saklıyoruz.
    private void OnMouseDown () {
        startScale = transform.localScale;
        oldMousePosition = Input.mousePosition;
    }
    //Tıklama bırakıldığı anda objeyi eski boyutuna döndürüyoruz.
    private void OnMouseUp () {
        transform.localScale = startScale;
    }
    //Fare objeye tıklanılmış halde hareket ettirilirken fare pozisyonunun ne kadar değiştiğini elde edip
    //hareket büyüklüğüne göre objenin boyutunu arttırıyoruz.
    private void OnMouseDrag () {
        Vector3 movement = oldMousePosition - Input.mousePosition;
        transform.localScale += Vector3.one * Time.deltaTime * movement.magnitude;
        oldMousePosition = Input.mousePosition;
    }
}

OnMouseUpAsButton: Fare ile seçili haldeyken tıklanan ve tıklamanın bırakıldığı objenin aynı olması durumunda çalışacaktır. Aynı bir butona basarken olduğu gibi çalıştığından dolayı sonunda  AsButton, button gibi manasında bir ek bulunmaktadır.

OnParticleCollision: Particle System tarafından oluşturulan parçacıkların başka bir objeye temas etmesi durumunda çağrılan fonksiyondur. Hem parçacıklara hem de temas edilen objeye erişip manipüle etmek mümkündür.

OnParticleSystemStopped: Particle System içerisinde bütün parçacıkların yok olduğu ve yeni parçacıkların artık yaratılmayacağı anlarda çağrılan fonksiyondur.

OnParticleTrigger: Particle System içerisinde bulunan Trigger ayarlarına göre parçacıkların belirtilen objelerin içinde geçmesi durumunda çağırılır. .

OnParticleUpdateJobScheduled: Particle System bileşenin kendi içindeki update fonksiyonunda gerekli düzenleme yapıldıktan sonra çağrılan fonksiyondur. Bu fonksiyon sayesinde editör üzerinden yaptığınız ayarlara göre update işleminin gerçekleşmesinin ardından, kod ile parçacıkların pozisyon gibi çeşitli özelliklerine müdahale etmeniz mümkün hale gelir.

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ParticleSystemJobs;

public class ParticleSystemExamples : MonoBehaviour {
    ParticleSystem ps;

    public float collisionForce = 2;

    private void Start () {
        ps = GetComponent<ParticleSystem> ();
    }
    /*
    OnParticleTrigger fonksiyonunun çalışması için Particle system altında
    Trigger seçeneği aktif olmalı ve ayarları 'callback' şeklinde değiştirmeniz gerekiyor.
    Şu durum için enter ve exit durumlarını 'callback' yapmanız yeterli. 
    'kill' seçeneği seçili olanları ise 'ignore' olarak değiştirmelisiniz.
    Ayrıca hangi objeler ile trigger durumu oluşacağını da listeye ekleyerek belirtmeniz gerekir.
    */
    void OnParticleTrigger () {

        // Trigger objesine giren ve çıkan parçacıkları tutmak için 2 liste oluşturuyoruz.
        List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle> ();
        List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle> ();

        // particle system objesi üzerinden trigger etkileşimine giren particle sayılarını elde ediyoruz.
        //bu sayıları bir değişkende tutmamıza gerek yok ama fonksiyonların bunu da döndürdüğünü göstermek istedim
        int numEnter = ps.GetTriggerParticles (ParticleSystemTriggerEventType.Enter, enter);
        int numExit = ps.GetTriggerParticles (ParticleSystemTriggerEventType.Exit, exit);

        /*
        Burada giriş ve çıkış yapan parçacıklara erişiyoruz. 
        Renklerini değiştirip tekrar listedeki değerlerine atama yapıyoruz.
        Daha önceki yorumda dediğim gibi, numEnter yerine direkt enter.Count, exit.Count kullanabilirsiniz.
        */
        for (int i = 0; i < numEnter; i++) {
            ParticleSystem.Particle p = enter[i];
            p.startColor = new Color32 (255, 0, 0, 255);
            enter[i] = p;
        }
        for (int i = 0; i < numExit; i++) {
            ParticleSystem.Particle p = exit[i];
            p.startColor = new Color32 (0, 255, 0, 255);
            exit[i] = p;
        }

        // değiştirdiğimiz parçacıkları tekrar atıyoruz.
        ps.SetTriggerParticles (ParticleSystemTriggerEventType.Enter, enter);
        ps.SetTriggerParticles (ParticleSystemTriggerEventType.Exit, exit);
    }

    /*
    ParticleCollision fonksiyonunun çalışması için particle system altından
    collision seçeneği aktif olmalı ve 'Send Collision Messages' seçeneği aktif halde olmalıdır.
    Ayrıca bu örnek için ben Collision altındaki 'Type' değerini 'World' olarak ayarladım. 
    Böylece dünyadaki trigger özelliği aktif olmayan her bir objeyle collision durumu gerçekleşecek.
     */
    private void OnParticleCollision (GameObject other) {
        //Collision olaylarını bir listede saklıyoruz.
        List<ParticleCollisionEvent> collisionEvents = new List<ParticleCollisionEvent> ();
        int numCollisionEvents = ps.GetCollisionEvents (other, collisionEvents);

        //Çarptığımız objede rigidbody bileşeni olup olmadığını kontrol ediyoruz.
        //Eğer rigidbody varsa çarpışmanın olduğu noktayı ve parçacık hızını kullanarak çarptığımız objeye kuvvet uyguluyoruz.
        if (other.TryGetComponent<Rigidbody> (out Rigidbody rb)) {
            int i = 0;
            while (i < numCollisionEvents) {
                if (rb) {
                    Vector3 pos = collisionEvents[i].intersection;
                    Vector3 force = collisionEvents[i].velocity * collisionForce;
                    rb.AddForceAtPosition (force, pos);
                }
                i++;
            }
        }
    }

    //Yeni bi update particle job oluşturup bunu çalıştırıyoruz.
    void OnParticleUpdateJobScheduled () {
        new UpdateParticlesJob { time = Time.time }.Schedule (ps);
    }

    //Kendi yarattığımız update particle job yapısı. Bu sayede parçacıkların x pozisyonunu zamana göre salınım yapacak şekilde değiştiriyoruz.
    struct UpdateParticlesJob : IJobParticleSystem {
        public float time;

        public void Execute (ParticleSystemJobData particles) {
            var positionsX = particles.positions.x;
            for (int i = 0; i < particles.count; i++) {
                positionsX[i] = Mathf.Sin (time + i);
            }
        }
    }
}

OnPostRender: Kameranın her bir karede render işlemini bitirmesinin ardından çağrılan fonksiyondur.

OnPreCull: Culling işlemi gerçekleşmeden önce çağrılan fonksiyondur.

OnPreRender: Kamera objesinin sahneyi render etme işlemini gerçekleştirmeden önce çağrılan fonksiyondur..

using UnityEngine;

//Kamera objesine eklenmeli
//Kameradan elde edilen görüntüyü yatayda ters hale getiren script
public class FlipRenderHorizontal : MonoBehaviour {
    Camera cam;

    //Camera bileşenine erişiyoruz
    void Start () {
        cam = GetComponent<Camera> ();
    }

    //Cull işlemi yapmadan önce matarix resetlemesi yapıp daha sonrasında matrix'i yatayda ters dönecek hale getiriyoruz.
    void OnPreCull () {
        cam.ResetWorldToCameraMatrix ();
        cam.ResetProjectionMatrix ();
        cam.projectionMatrix = cam.projectionMatrix * Matrix4x4.Scale (new Vector3 (1, -1, 1));
    }

    //PreRender ve PostRender fonksiyonlarında arka yüzlerin algılanma durumunu açıp kapatıyoruz
    //böylece matrix değiştirme sebebiyle yüzeylerin algılanmama, render edilmeme durumlarını önlüyoruz.
    void OnPreRender () {
        GL.invertCulling = true;
    }
    void OnPostRender () {
        GL.invertCulling = false;
    }
}

OnRenderImage: Kamera objesinin sahneyi render etme işleminin tamamlanması ardından çağrılan fonksiyondur. Render sonucu elde edilen görüntüyü manipüle etmeniz mümkündür..

using UnityEngine;
//Script kamera objesinde olmalı
public class OnRenderImageExample : MonoBehaviour {
    /*
    Resim işlemede kullanılacak materyal
    Sprite/Default shader'ı kullanan bir materyal yaratıp beyaz dışında farklı bir renk seçerseniz
    kamera görüntüsünün üzerine o renk eklendiğini göreceksiniz. Eğer sadece renk görünüyorsa, 
    materyal üzerinden rengin alpha değerini azaltın.
    */
    public Material mat;

    void OnRenderImage (RenderTexture src, RenderTexture dest) {
        //Graphics sınıfı yardımıylz, src yani kameranın okuduğu görüntüye
        //istediğimiz materyali uygulayıp dest yani çıktı değerini oluşturuyoruz.
        Graphics.Blit (src, dest, mat);
    }
}

OnRenderObject: Obje ekranda render edildikten sonra çağrılan fonksiyondur. OnPostRender işleminden farklı olarak, kamera objesinde değil, render edilen objelerde çağrılır. Bu sayede her obje için farklı işlemler gerçekleştirmek mümkün olur.

using UnityEngine;

public class OnRenderObjectExample : MonoBehaviour {
    public Mesh mainMesh;
    public Mesh miniMapMesh;

    void OnRenderObject () {
        //Render eden camera ismine bakarak farklı mesh objeleri çizdirmemizi sağlayan fonksiyondur.
        //Minimap kamera oluşturup tepeden bakacak şekilde yerleştirdikten sonra, harita üzerinde
        //ikonlar halinde objeleri göstermemiz mümkündür. Tabii bu oldukça basit bir yöntem.
        if (Camera.current.name == "MiniMapcam") {
            Graphics.DrawMeshNow (miniMapMesh, transform.position, transform.rotation);
        } else {
            Graphics.DrawMeshNow (mainMesh, transform.position, transform.rotation);
        }
    }
}

OnTriggerEnter: İki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme durumunda çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody bileşenine sahip olması gerekir. 

OnTriggerExit: İki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme ve iç içe girmiş olma durumunun bittiği anda çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody bileşenine sahip olması gerekir.

OnTriggerStay: İki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme durumu devam ettiği sürece çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody bileşenine sahip olması gerekir..

using UnityEngine;

public class OnTriggerExamples : MonoBehaviour {

    float speed = 5;

    private void Update () {
        float horizontal = Input.GetAxis ("Horizontal");
        float vertical = Input.GetAxis ("Vertical");
        transform.position += new Vector3 (horizontal, 0, vertical) * speed * Time.deltaTime;
    }
    //SlowArea tagına sahip objeye giriş ve çıkış anında hız değerini değiştiriyoruz
    private void OnTriggerEnter (Collider other) {
        if (other.CompareTag ("SlowArea"))
            speed = 2;
    }
    private void OnTriggerExit (Collider other) {
        if (other.CompareTag ("SlowArea"))
            speed = 5;
    }
    //RotateArea isimli objenin içine girdikten sonra, dışına çıkana kadar objeyi global y ekseninde saniye 90 derece döndürüyoruz.
    private void OnTriggerStay (Collider other) {
        if (other.CompareTag ("RotateArea"))
            transform.Rotate (Vector3.up * 90 * Time.deltaTime);
    }
}

OnTrigger örnekleri için aslında 3 adet küp kullandım. 1 tanesi scriptin atandığı karakter, diğer ikisi de farklı alanları temsil etmesi için. Karakter dışındaki küplerin boyutlarını 5 birimlik hale getirdim ve farklı konumlara yerleştirdim. Ayrıca 2 farklı tipte alan kullandım, birinde hareket hız değeri değişirken, diğerinin içinde bulunduğumuz sürece sürekli bir dönme işlemi gerçekleştiriyoruz. İki alanı algılamak adına da tag, etiket sisteminden yararlandım. Bu fonksiyonlarda bize dönen değer Collider tipinde. Bunlar içerisinde çeşitli fonksiyonlar ve değerlere erişmemiz mümkün. Daha önce görmüş olabileceğiniz Box Collider, Capsule collider gibi bütün collider bileşenlerinin atası, miras aldığı sınıf bu. Genel olarak Collider bileşenleri hakkında bilgi almak için Unity Collider Nedir yazımıza göz atabilirsiniz. Örnekte kullandığımız CompareTag fonksiyonu ise GameObject sınıfından gelen bir fonksiyon, ona dair daha fazla bilgi için Unity GameObject Nedir yazımıza göz atabilirsiniz.

OnTriggerEnter2D: 2D fizik işlemlerinde, iki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme durumunda çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody2D bileşenine sahip olması gerekir.

OnTriggerExit2D: 2D fizik işlemlerinde iki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme ve iç içe girmiş olma durumunun bittiği anda çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody2D bileşenine sahip olması gerekir.

OnTriggerStay2D: 2D fizik işlemlerinde iki objeden birinin Trigger özelliğine sahip Colllider bileşeni içerdiği  temas etme  durumu devam ettiği sürece çağrılan fonksiyondur. Ayrıca objelerden en az birinin Rigidbody2D bileşenine sahip olması gerekir.

2D için olan OnTrigger fonksiyonları da işlevsel olarak aynı şekilde çalışıyor, tabii ki Collider2D ve Rigidbody2D kullanmamız şart. Bi fark olarak da tabii ki 3D için olan Collider değil, Collider2D bileşeni döndürüyor bize. Collider2d hakkında daha fazla bilgi edinmek isterseniz Unity Collider2D dokümanına göz atabilirsiniz, yakında onun da Türkçesi geldiğinde linki buraya ekleriz 🙂

OnValidate: Unity Editör üzerinde değişken yüklendiğinde veya üzerindeki değerler değiştiğinde çağrılan fonksiyondur. Değişkenlerin istediğiniz aralıkta olduğundan emin olmak gibi durumlar için kullanabilirsiniz.

using UnityEngine;
using UnityEngine.UI;
//Bir button yaratıp ona eklediğinizden emin olun. 
[RequireComponent (typeof (Button))]
public class OnValidateExample : MonoBehaviour {

    [SerializeField]
    GameObject prefab;

    //Başlangıçta button bileşenine erişip CreatePrefab fonksiyonunu tıklanma durumunda çalışacak şekilde ekliyoruz.
    private void Start () {
        GetComponent&lt;Button&gt; ().onClick.AddListener (() => {
            CreatePrefab ();
        });
    }
    public void CreatePrefab () {
        Instantiate (prefab);
    }
    //Editor yenilendiğinde veya bu bileşendeki bir değişkeni değiştirdiğimizde OnValidate çalışacak ve button text değerini değiştirecek. 
    private void OnValidate () {
        Text prefabNameText = GetComponentInChildren<Text> ();
        prefabNameText.text = "Create " + prefab.name;
    }
}

OnWillRenderObject: Objenin sahnedeki kameralardan herhangi biri tarafından render edildiği zamanlar, her culling işlemi sırasında çağrılan bir fonksiyondur. Obje için görsel düzenlemeler yapmak amacıyla kullanılabilir. Unity Standard Assets içerisinde bulunan Water.cs dosyasında etkili bir kullanımını görebilirsiniz. Ayrıca bu fonksiyon, kodu eklediğini obje, UI objesi değilse çalışacaktır. Buna da dikkat etmekte fayda var.

Böylece Unity MonoBehaviour Sınıfı yapabileceklerimize örneklerle değinmiş olduk. İsterseniz pek tabii orijinal Unity Monobehaviour dokümanına göz atabilir, örnekleri inceleyebilirsiniz. Faydalı olmuştur umarım, yeni yazılarda görüşmek dileğiyle.

Unity İçin Kod Editörü Kurulumu

1

Bu yazımızda Unity için kod editörü kurulumu nasıl gerçekleştirilir buna değineceğiz. Öncelikle belirtmekte fayda var, Unity üzerinde kullanabileceğiniz çeşitli kodlama editörleri bulunmakta. Benim tercihim ise Visual Studio Community veya Visual Studio Code uygulamaları. Özellikle hız konusu nedeniyle, bazı ufak düzenlemeler gerektirse de, benim oyum kesinlikle VSCode uygulamasına gider. Tabii bunlar dışında da kullanabileceğiniz araçlar bulunuyor, örneğin JetBrains Rider veya Atom. Ancak ben yalnızca 2 uygulamadan bahsedeceğim size. Eğer bahsedeceğim 2 editör dışında başka editörler kullanmak istiyorsanız, herhangi bir editörü kullanmak için “Unity Editör Ayarları” başlığına geçebilirsiniz.

Öncelikle şunu belirtmekte de yarar var, eğer Visual Studio Community kullanmayı düşünüyorsanız, bunu Unity kurulumu esnasında da gerçekleştirebilirsiniz.  Unity için kod editörü kurulumu işlemi için ekstra bir uğraşa girmenize gerek yok. Eğer henüz hiç Unity kurulumu gerçekleştirmediyseniz öncelikle “Unity Kurulumu ve Proje Oluşturmak” isimli yazımıza göz atabilirsiniz.

Eğer hali hazırda Unity kurulumunu hallettiyseniz hiçbir sorun yok, olduğu gibi devam edebilirsiniz. Ama oldu ki indirirken kurmadınız veya ayrı olarak nasıl yapılır bulmak istiyorsunuz, buyrun öncelikle Visual Studio Community ile başlayalım.

Unity için Visual Studio Community

1 – Öncelikle https://visualstudio.microsoft.com/vs/unity-tools/ gidin. Bu kısımdan “Download Visual Studio” seçeneğini seçin. Herhangi bir lisanslamaya sahip olmadığınızı varsaydığımdan, Community seçeneğini seçmenizi istiyorum. Eğer diğer lisanslara sahipseniz onlardan birini de seçebilirsiniz.

Unity için Kod Editörü Kurulumu Visual Studio Community
Unity için Kod Editörü Kurulumu Visual Studio Community

2 – Linke tıkladıktan sonra bir indirme işlemi başlatılacaktır, onaylayın. İndirme tamamlandıktan sonra dosyayı açın.

3 – Yeni açılan pencere aracılığıyla yeni Visual Studio sürümlerini indirebilir, varolanları güncelleyebilirsiniz. Eğer hali hazırda sisteminizde bir Visual Studio versiyonu yüklü ise, “Yüklendi” seçeneği altında görebilirsiniz. Bütün indirilebilir sürümleri görebilmeniz için “Kullanılabilir” sekmesine tıklamanız gerekmekte.

Visual Studio Community Yükleyicisi

4 – Bu kısımdan istediğiniz versiyonu seçip “Yükle” butonuna tıklamanız gerekiyor. Tıkladıktan sonra karşınıza yeni bir pencere açılacaktır. Bu kısımda Unity seçeneğini bulup aktif hale getirmelisiniz. Bunu yaptıktan sonra sağ kısımda listeye yeni şeyler eklenecektir. Hali hazırda Unity Hub kurulu ise veya ayrı şekilde yüklemek istiyorsanız sağdaki “Unity Hub” seçeneğini deaktif hale getirin.

Visual Studio Community Unity Kurulumu

5 – Yükleme tamamlandıktan sonra bu kısımda yapacağımız işlemler tamamlanıyor. Şimdi yazının devamındaki “Unity Editör Ayarları” başlığına geçin.

Unity için Visual Studio Code

Visual Studio Code kurulumu öncesinde sisteminizde .Net Core SDK olduğundan emin olmanız gerekiyor. Eğer hali hazırda yüklü ise tekrar indirip kurulum yapmanıza gerek yok.  İndirmek için https://dotnet.microsoft.com/download gidebilirsiniz.  Bu kısımdan sisteminize uygun şekilde indirmeleri gerçekleştirip kurulumları yapın. Kurulum sonrasında yeniden başlatmanız gerekir.

Ayrıca macOS işletim sistemlerinde Mono yüklü olması gerektiği, Microsoft dokümanlarında belirtiyor. İndirme için https://www.mono-project.com/download/stable/ linkini kullanabilirsiniz. Microsoft tarafından hazırlanan Unity için VSCode yazısına da şu linkten erişebilirsiniz: https://code.visualstudio.com/docs/other/unity 

Bu işlemleri gerçekleştirdikten sonra kuruluma geçebiliriz.

1 – https://code.visualstudio.com/Download adresinden sisteminize uygun olan VSCode sürümünü indirin.

2 – Kurulum işlemlerinde ekstra bir ayar yapmamız gerek yok. Kurulumu hızlıca halledebilirsiniz. Tekrar yeniden başlatmanız gerekebilir.

3 – Kurulum sonrasında VSCode uygulamasını Unity içerisinde kullanılabilir hale getirmek için bazı eklentiler yüklememiz gerekiyor. Bunu ister VSCode üzerinde, isterseniz de tarayıcınızda https://marketplace.visualstudio.com/ üzerinden eklentileri bularak gerçekleştirebilrsiniz. Tarayıcı üzerinden eklentiyi indirme butonuna tıklayıp, VSCode üzerinde açmayı onaylamanız yeterli olacaktır.

4 –  Direkt olarak VSCode üzerinden eklenti kurulumu yapmak isterseniz, sol panelde, görselde de görebileceğiniz, “Extensions” seçeneğine tıklayın. Bu sayede yeni bir panel açılacak ve yükleyebileceğiniz eklentileri görebileceksiniz.

5 – Arama kısmına öncelikle “C#” yazarak C# dili için bize özellikler sunan eklentiyi seçmeniz ve indirmeniz gerekiyor. Bu bizim için en önemli eklentilerden biri.

VSCode Csharp

6 – Bunun ardından da biraz daha işimizi kolaylaştıracak bazı eklentileri yüklemenizi istiyorum. 

Unity Code Snippets: Özellikle otomatik tamamlamada ve yeni sınıflar oluştururken büyük kolaylıklar sağlayan bir eklenti.

VSCode Unity Code Snippets

C# FixFormat: Yazılan kodların düzgün bir görünüm almasına yardımcı olur.

VSCode Csharp FixFormat

7 – Bu eklentiler dışında da size uygun olan eklentiler olabilir. VSCode uygulamasını farklı dillerde çalışırken de rahatlıkla kullanabilirsiniz.

Unity Editör Ayarları

Kod editörü kurulumunu tamamlasak da, tam olarak kullanabilmek için Unity içerisinde bir ayarlama daha yapmamız gerekiyor. 

1 – Öncelikle bir Unity projesi açmanız gerekiyor, isterseniz varolan bir projeyi, isterseniz de yeni bir proje oluşturup bunu açabilirsiniz.

2 – Proje açıldıktan sonra üstteki menüden “Edit” sekmesinden “Preferences” seçeneğine tıklayın. Bu pencere Unity için genel tercihlerimizi düzenleyebildiğimiz bir pencere açacaktır.

Unity Kod Editörü Ayarları Preferences

3 – Açılan pencerede sol kısımda bulunan “External Tools” seçeneğine tıklayın.  Gelen ekranda “External Script Editor” seçeneği üzerinden kullanmak istediğiniz kod editörünü seçmeniz mümkün. İstediğiniz editörü seçtikten sonra bu pencereyi kapatabilirsiniz.

Unity Kod Editörü Ayarları External Script Editor

4 – Böylece Unity ve kod editörümüz arasında bağlantıyı kurmuş olduk. Unity içerisinde oluşturduğumuz kodları açmaya kalktığımızda artık otomatik olarak seçtiğimiz editör üzerinden açacaktır. 

Ekstra Bilgi: Görsellerde gördüğünüzden farklı olarak, Unity açık renkli olabilir. Eğer karanlık temaya geçirmek isterseniz, yine Preferences sekmesi altında “General” seçeneğine tıklayarak genel ayarları açabilirsiniz. “Theme” seçeneği ile temayı değiştirmeniz mümkün.

Yazının sonuna geldik. Bu aşamaya geldiğinizde artık istediğiniz Unity için kod editörü kurulumu nasıl gerçekleştirilir, uyumlu editörleri kullanmak için gerekli olan ayarlar nedir, bunlara hakimsiniz. Umarım faydalı bir yazı olmuştur. Yeni içeriklerle görüşmek dileğiyle. Hoşçakalın.

Unity Kurulumu ve Proje Oluşturmak

0

Unity Kurulumu ve proje oluşturmak için en etkili ve kolay yöntem Unity Hub programından yararlanmaktır. Unity Hub hem projelerimizi oluşturma ve denetlemede hem de farklı versiyonlardaki Unity kurulumu işlemlerini gerçekleştirmede işlerimizi kolaylaştırmaktadır.

Unity kurulumu isterseniz Unity Hub aracılığıyla isterseniz de direkt olarak bir Unity versiyonunu yükleyerek gerçekleştirebileceğiniz bir işlem. Açıkçası Unity Hub proje yönetimi vb konularda daha fazla kolaylık sağlaması ve Unity’nin de bunu önermesi nedeniyle bu yazıda da onu ele alacağız.

Unity Hub ile Unity Kurulumu

Unity kurulumu için öncelikle bir hesap yaratıp, ücretsiz lisansınızı aktif hale getirmeniz gerekiyor.

Kayıt işlemini gerçekleştirmek için https://unity.com/ linkine gidip, sağ üstte bulunan profil simgesine tıklamanız gerekiyor. Ardından da “Create a Unity ID” seçeneğini seçmelisiniz.

Unity Hesap Yaratma
Unity Hesap Yaratma

Bu aşamada isterseniz kullanıcı bilgilerini elle girerek, isterseniz de Apple, Google gibi seçeneklerde sunulan platformlar aracılığıyla kayıt işlemini gerçekleştirebilirsiniz.

Unity Hesap Oluşturma
Unity Hesap Oluşturma

Kayıt işlemini yaptıktan sonra sıra geldi Unity Hub uygulamasını indirmeye. https://unity3d.com/get-unity/download adresine gidin, bu kısımdan “Download Unity Hub” seçeneğini seçin.

Unity Hub İndirme
Unity Hub İndirme

Kurulum kısmında ekstra bir bilgiye ihtiyaç bulunmuyor. İsterseniz ihtiyacınıza göre kurulum yapılacak klasörü değiştirebilirsiniz. Kurulum tamamlandıktan sonra Unity Hub uygulamasını açın ve daha önce kayıt olduğunuz hesap bilgileriyle giriş yapın. Giriş yaptıktan sonra ayarlar simgesinin yanında bulunan profil butonuna tıklayın. “Manage Licence” seçeneğine tıklayın.

Unity Hub Lisans Ayarları
Unity Hub Lisans Ayarları

Bu pencerede aktif olan lisans bilgilerini görebilirsiniz. Eğer “Personal” lisans bulunmuyorsa, “Activate New Licence” seçeneğine tıklayın.

Unity Hub Lisans Aktifleştirme
Unity Hub Lisans Aktifleştirme

Görselde gördüğünüz şekilde Personal planını seçip “Done” seçeneğine tıklarsanız lisansınız aktif olacaktır.

Unity Personal Lisans Seçimi
Unity Personal Lisans Seçimi

Gelelim Unity kurulumuna. Bu işlem de gayet basit. Şimdi “Preferences” yazısının yanındaki geri tuşuna basarak ana pencereye dönün. Burada sol tarafta “Installs” adlı bir buton göreceksiniz. Buna tıkladığınızda, sisteminizde Unity Hub aracılığıyla yüklediğiniz Unity sürümlerini görebilirsiniz. Şayet Unity Hub dışında bir yükleme yaptıysanız bunu “Locate” butonu ile tanıtabilirsiniz. Biz şu an “Add” Butonuna tıklayacağız.

Unity Hub Unity Kurulumu
Unity Hub Unity Kurulumu

Karşınıza çeşitli seçeneklerin olduğu bir ekran gelecektir. Buradan ister kararlı sürümlere, isterseniz de beta denemedeki sürümlere erişmeniz mümkün. Biz şimdi 2019 sürümü yükleyeceğiz, çünkü en kararlı halde olan sürüm şu anda o. Bunu okuduğunuzda farklı yeni bir sürüm en kararlı sürüm olabilir veya yayında olan diğer sürümlere de göz atmak isteyebilirsiniz. Seçiminizi yaptıktan sonra, Next tuşuna basmanızı istiyorum.

Unity Hub Unity Versiyonu Seçimi
Unity Hub Unity Versiyonu Seçimi

Açılan bu pencerede de isterseniz Unity’nin bize sunduğu ekstra araçlar ve platformlara build alabilmek için gerekli altyapıları yükleyebilirsiniz. Örneğin şu an gördüğünüz görselde, Android için build altyapısı da yükleme listesine eklenmiş halde. Tekrar “Next” diyerek kurulum işlemini başlatabilirsiniz. Kurulum durumunu Unity Hub üzerinden görebilirsiniz.

Unity Hub Modül Seçimi
Unity Hub Modül Seçimi

Unity Hub ile Proje Oluşturmak

Herhangi bir Unity versiyonunu Unity Hub aracılığıyla yükledikten sonra artık bir proje oluşturabiliriz veya varolan bir Unity projesini açabiliriz.

Unity Hub üzerinde “Projects” penceresi etkinken, varolan projeleri görmemiz mümkün. Unity sürümlerinde olduğu gibi, varolan bir proje klasörünü “ADD” seçeneği ile seçerek Unity Hub’a tanıtabilir ve buradan açabilirsiniz. Yeni bir proje oluşturmak için ise “Create” Seçeneğini seçmeniz gerekiyor. Görselde gördüğünüz “Create” yanındaki ok işareti, sisteminizde yüklü olan farklı Unity sürümlerini seçerek proje oluşturmanıza imkan tanır. Eğer birden fazla sürüm yüklü ise, “Create” butonuna tıkladığınızda en güncel sürüm üzerinden projeyi oluşturacaktır.

Unity Hub ile Proje Oluşturma
Unity Hub ile Proje Oluşturma

Karşınıza yeni bir pencere gelecektir. Bu pencere içerisinde üst kısımda hangi Unity versiyonu ile projeyi yaratacağınızı görebilirsiniz. Sağ tarafta bulunan “Settings” kısmında projenizin adı ve oluşturulacağı klasörü düzenleyebilirsiniz. Sol tarafta bulunan kısım Unity’nin sunduğu hazır taslak projelerden birini seçerek projenizi yaratmanızı sağlar. Bazıları Unity kurulumuna dahilken bazılarını sonradan indirmeniz gerekmektedir.

Unity Hub Proje Taslakları
Unity Hub Proje Taslakları

Create butonuna tıkladıktan sonra Unity projenizi oluşturup ekrana getirecektir. Bu bilgilerle beraber artık Unity ile yeni sulara yelken açmaya, fikirlerinizi gerçeğe dönüştürmeye ilk adımı atmış oldunuz.

Böylece Unity Kurulumu ve Proje Oluşturmak işlemlerini de tamamlamış olduk. Bundan sonrasında artık isterseniz websitemizdeki yazılardan ister Karadot Youtube kanalımızdan yararlanmaya devam ederek Unity konusunda kendinizi geliştirmeye devam edebilirsiniz. Unutmadan, her zaman orjinal dokümanlara da bakmakta fayda var. O yüzden Unity Başlangıç Dokümanlarına da bakmanızı muhakkak öneririm. Yeni yazılarda görüşmek dileğiyle.