Unity oyun motorunda fizik işlemleri oyunumuzun temel yapılarından biri durumundadır. Şu ana kadar yaptığımız çalışmalarda oluşturduğumuz objelerin hep boşlukta askıda kaldığını fark etmişsinizdir. Bunun sebebi objelerimizde herhangi bir fizik kuralının uygulanabilir durumda olmamasından kaynaklıydı. İşte artık fizik işlemlerini öğrenerek, gerçek hayattaki gibi yer çekimi, sürtünme, sekme gibi kuralları devreye sokacağız.
Gerçek dünya fizik kurallarını uygulamak için birkaç yöntemimiz bulunuyor. Hepsine sırasıyla değineceğiz ama önce fizik materyalinden başlayacağız.
Unity Fizik Materyali
Objelerin “Box Collider” bileşeni üzerinden objemize bir fizik materyali tanımlayarak gerçek dünyadaki gibi fizik kurallarına uymasını sağlayabiliriz.
Project bölümünde yeni bir dosya eklerken “Physic Material” isminde bir seçenek göreceksiniz. Bu seçeneğe tıklayarak yeni bir fizik materyali oluşturabilir ve objelerinize “Box Collider” bileşeni üzerinden atamasını gerçekleştirebiliriz.

O zaman sahne tasarımımızı hazırlayarak örneklerimize başlayalım. Sahne tasarımımız için “MaviTop” ve “YesilTop” isminde iki adet “Sphere” obje ve objeler içinde iki adet fizik materyali oluşturarak isimlerini aynı şekilde “MaviTop” ve “YesilTop” yapalım.
Her iki objemize de “Sphere Collider” bileşenini ekleyelim ve oluşturduğumuz fizik materyallerini atalım.
Videodaki gibi fizik materyallerinin atamasını gerçekleştirdikten sonra oyunumuzu çalıştırdığımızda herhangi bir hareketin olmadığını göreceksiniz.
Unity fizik materyali eklemiş olabiliriz ama objelerimizde fizik işlemlerini yapmamızı sağlayan “Rigidbody” bileşeni ekli olmadığı sürece devreye girmeyecektir. Bu yüzden her iki objemize de “Rigidbody” bileşenini ekliyoruz.
“Rigidbody” ekledikten sonra objelerimiz için yer çekimi devreye girdiği için artık bulundukları konumdan zemine doğru hareket ediyorlar. Artık fizik işlemleri devreye girdiğine göre fizik materyali üzerinden neler yapabileceğimize bakalım.
Oluşturduğumuz fizik materyali dosyalarını tıkladığınızda karşınıza aşağıdaki gibi seçenekler çıkacaktır.

Şimdi tek tek bu seçeneklerin ne anlama geldiğini inceleyelim.
Dynamic Friction
Türkçe karşılığı dinamik sürtünme olan bu özellik bir objenin hareket halindeyken, objeye ne kadar sürtünme uygulanacağının belirlendiği kısımdır. Genellikle 0 ile 1 arasında değer verilir ve sadece pozitif değer almaktadır.
“Dynamic Friction” özelliğini test etmek için sahneye 4 adet top ekledik ve diğer tüm özelliklerini aynı yaparak sadece “Dynamic Friction” değerlerini aşağıdaki gibi değiştirdiğimizde sonuç videodaki gibi olmaktadır.
Kırmızı Top: Dynamic Friction değeri 0
Turuncu Top: Dynamic Friction değeri 0.35
Yeşil Top: Dynamic Friction değeri 0.7
Mavi Top: Dynamic Friction değeri 1
Static Friction
Statik sürtünme ise bir obje sahnede hareketsiz durumda dururken uygulanan sürtünme değeridir. Genellikle 0 ile 1 arasında değer verilir ve sadece pozitif değer almaktadır.
Şimdi bir önceki örneğimize benzer bir sahne yaparak toplarımıza aşağıdaki değerleri verdik ve sonuç videodaki gibi oldu.
Not: Dynamic Friction değeri tüm toplarda 0 olarak belirlendi.
Kırmızı Top: Static Friction değeri 0
Turuncu Top: Static Friction değeri 0.2
Yeşil Top: Static Friction değeri 0.6
Mavi Top: Static Friction değeri 1
Bounciness
Bir objenin herhangi bir yere çarptığı zaman vereceği geri tepkinin belirlendiği alandır. Yukarıdan bırakılan bir topun zemine çarptığı zaman ne kadar sekeceğini belirlediğimiz kısım diye düşünebilirsiniz. 0-1 arasında bir değer almaktadır.
Bu örneğimizde 4 tane topun “Bounciness” değerlerini değiştirdikten sonra belirli bir yüksekten bıraktığımızda sonuç aşağıdaki gibidir.
Kırmızı Top: Bounciness değeri 0
Turuncu Top: Bounciness değeri 0.35
Yeşil Top: Bounciness değeri 0.6
Mavi Top: Bounciness değeri 1
Friction & Bounce Combine
Friction Combine: İki objenin çarpışması durumda bu sürtünme hesaplamasının nasıl yapılacağının belirlendiği alandır. Şöyle düşünebilirsiniz, çarpışan iki objemiz olduğunda hangi objemizdeki sürtünmenin geçerli olacağını belirlemek için pratik seçenekler sunmaktadır. 4 farklı seçenek ile ayarlanmaktadır.
“Average” seçeneği iki objenin sürtünme tepkilerinin ortalamasını almasını sağlar. “Minimum” ise en düşük olanı almasını sağladığı gibi “Maximum” seçeneği ise tam tersi gibi en yüksek olanı almasını sağlayacaktır. “Multiply” seçeneği ise iki objenin sürtünmelerinin çarpımını almasını sağlar.
Bounce Combine: Tıpkı “Friction Combine” özelliğinde olduğu gibi iki objenin çarpması sonucunda, vereceği tepki miktarının nasıl belirleneceğinin ayarlarının yapıldığı kısımdır.
“Average” seçeneği iki objenin çarpma tepkilerinin ortalamasını almasını sağlar. “Minimum” ise en düşük olanı almasını sağladığı gibi “Maximum” seçeneği ise tam tersi gibi en yüksek olanı almasını sağlayacaktır. “Multiply” seçeneği ise iki objenin sürtünmelerinin çarpımını almasını sağlar.
Şimdi şahsen ben bu konuyu ilk öğrendiğimde her iki objeye farklı bir sürtünme kuvveyi verip yokuş aşağı olan bir alanda kaydırmıştım ve sürtünme kuvvetleri farklı olmasına rağmen sonuç aynı olmuştu. Sizde bu tarz bir test yaptıysanız aynı sonucu alacaksınız.
Burada eklediğimiz “Rigidbody” bileşeni devreye girdiği için bu şekilde bir sonuç alıyoruz. O yüzden Unity oyun motorunun ana fiziksel bileşeni olan “Rigidbody” bileşenini de öğrenip kafamızda mantığını oturtalım.
RigidBody Bileşeni
Rigidbody yani fizik bileşeni bir objenin fizik işlemlerini gerçekleştirmesine yarayan bir Unity ana bileşenidir. Hemen özelliklerini incelemeye başlayalım.

Mass: Bir objenin ağırlığını belirlediğimiz alandır.
Drag: Hava ya da su direncinin belirlendiği alandır. Yani bir objeyle temas etmeden önce objeyi saran hava veya suyun sürtünesi sebebiyle gerçekleşecek olan yavaşlama eğilimidir. 0 verildiği zaman hava direncinin olmadığı anlamına gelmektedir.
Angular Drag: Dönüş işlemlerinde uygulanan açısal dirençtir. Örneğin bir topun yere yani bir objeyle temas etmesinden sonra dönüşü sırasında yaşayacağı direncin ayarlandığı kısımdır.
Use Gravity: Bir objenin yer çekiminden etkilenmesini istemediğimiz durumlarda pasif duruma getirebileceğimiz seçenektir. Sadece yer çekimini pasidf duruma getirir diğer fizik işlemleri aktif olmaya devam edecektir.
Is Kinematic: Bir obje için fizik işlemlerini devre dışı bırakmak için kullanılan özelliktir.
Interpolate: Objenin fiziğini bir kare hızında uygulanması için kullanılır. Genellikle objelerin çarpışması durumunda oluşan titremeleri engellemek için kullanılan seçeneklerdir. “Interpolate” ve “Extrapolate” olarak iki seçeneği bulunmaktadır. “Interpolate” seçeneği ile bir önceki kareye göre “Extrapolate” ile bir sonraki kareye göre işlem gerçekleştirmesinidir. Aslında buradaki durum frame hızlarıyla ilgili teknik bir durum. Şimdilik titreşim durumu diyerek bu kısmı teknik detaylara boğulmadan geçeceğiz.
Collision Detection: Çok hızlı şekilde hareket eden objelerde çarpmalarının hesaplamasında, Unity Oyun motorunun hata yapma olasılığı için kullanılır. Bu kısmı bütün projelerimizde “Discrete” olarak kullanacağız. Ama ileride teknik makaleler yazarken bu konuya da değineceğim.
Constraints: Fizik uygulanan objenin belirlediğiniz bir pozisyonuna ya da rotasyonuna fizik işlemini durdurmak için kullanılır. Örneğin objeye üsten bir çarpma olduğunda fizik uygulanmasın ama yandan çarptığında uygulansın gibi.
Fiziksel Etkileşimleri Script ile Yakalama
Peki objelere fizik işlemlerini uyguladık ama örneğin iki obje birbirine çarptıktan sonra bir efekt, ses ya da animasyon gibi bir işlem gerçekleştirmek istiyoruz. İşte bu tarz iki objenin etkileşimi durumlarını C# Script ile yakalayabilir ve istediğimiz işlemi uygulayabiliriz.
Unity oyun motorunun çekirdek yapısından gelen metotları aracılığıyla Rigidbody – Collision ve Collider sınıflarını kullanarak iki farklı şekilde objeler arası etkileşimi yakalayabiliriz.
Her iki yöntem içinde 3 farklı metot bulunaktadır. Bu metotlar e durumlarını bize döner.
RigidBody ile Yakalama
“Rigidbody” yani fizik motoru bileşeninin “Collision” özelliği ile objelerin etkileşimlerini yakalayabiliriz. C# üzerinde etkileşime girme, etkileşimin devam etmesi ve etkileşimin bitmesi durumlarında kullanabileceğimiz 3 farklı metot bulunmaktadır. Bu metotlara geçmeden önce birkaç not ekleyelim.
- Objelerden sadece birinde “Rigidbody” bileşenin ekli olması etkileşimi yakalaması için yeterlidir.
- “Rigidbody” bileşenin “Is Kinematic” özelliğinin her iki objede de aktif durumda olmaması gerekir. En az birinde pasif olması yeterlidir.
Şimdi metotlara ve örneğimize geçelim.
Örneğin sahnemizde “YesilObje” ve “MaviObje” isminde iki adet obje ekledikten sonra her iki objeye ya da sadece bir tanesine “Rigidbody” bileşenini ekleyelim. “FizikYakalama” isminde bir C# Script dosyası oluşturarak objelerden birine atamasını gerçekleştirelim.

OnCollisionEnter Metodu
“OnCollisionEnter” metodu ile objelerin birbirleriyle olan ilk etkileşiminin bilgisini alabiliriz.
Aşağıdaki kodu yazdıktan sonra objeler birbirine değdirdiğiniz anda “Temas Sağlandı” çıktısını alırsınız.
public class FizikYakalama : MonoBehaviour { private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "MaviTop") { Debug.Log("Temas Sağlandı"); } } }
Burada yazdığımız collision.gameObject.name == "MaviTop"
ile sadece istediğimiz objeye temas ettiğinde bilgi vermesini söylemiş olduk.
OnCollisionStay Metodu
“OnCollisionStay” metodu ile iki objenin birbirleriyle temas hallerinin devam etmesi durumunu yakalayabiliriz.
Aşağıdaki kodu uygularsak ve iki objeyi sürekli olarak birbirlerine temas halinde bırakırsak bize “Temas devam ediyor” çıktısı verecektir.
public class FizikYakalama : MonoBehaviour { private void OnCollisionStay(Collision collision) { if (collision.gameObject.name == "MaviTop") { Debug.Log("Temas Devam Ediyor"); } } }
OnCollisionExit Metodu
“OnCollisionExit” metoduyla iki objenin birbirleriyle olan fiziksel temasları bittikten sonraki durumunu yakalayabiliriz.
Örneğin aşağıdaki kodu yazdıktan sonra objeleri temas ettirirseniz ve temasını keserseniz. Kesme işleminde hemen sonra “Temas bitti” çıktısı alırsınız.
public class FizikYakalama : MonoBehaviour { private void OnCollisionExit(Collision collision) { if (collision.gameObject.name == "MaviTop") { Debug.Log("Temas Devam Ediyor"); } } }
Collider ile Yakalama
“Collider” ile iki obje arasındaki fizik etkileşimi yakalayabiliriz. Bu işlem için “RigidBody” bileşeninin ekli olması gerekmiyor fakat en azından objelerden birinin “Collider” bileşeninin “Is Trigger” özeliğinin açık olması gerekiyor.
- Objelerde “RigidBody” bileşeninin olmasına gerek yoktur.
- Objelerden en az birinde “Collider” bileşenin “Is Trigger” özelliğinin açık olması gerekmektedir.
OnTriggerEnter Metodu
“OnCollisionEnter” metodu ile aynı şekilde çalışmaktadır yani objeler arasındaki ilk fizik etkileşimi durumunu yakalar.
private void OnTriggerEnter(Collider other) { if (other.CompareTag("Dusman")) { Debug.Log("Temas Sağlandı"); } }
other.CompareTag("Dusman")
yazarak obje ismi haricinde yaygın olarak kullanılan obje etiketine göre yakalama işleminde gerçekleştirebiliriz.
OnTriggerStay Metodu
“OnCollisionStay” metodu ile aynı mantıkta yani objelerin birbirleriyle olan fiziksel etkileşimi devam ettiği sürece yakalar.
private void OnTriggerStay(Collider other) { if (other.CompareTag("Dusman")) { Debug.Log("Temas devam ediyor"); } }
OnTriggerExit Metodu
OnCollisionExit metodunda olduğu gibi objelerin fiziksel etkileşimi bittiğinde geri dönüş yapar.
private void OnTriggerExit(Collider other) { if (other.CompareTag("Dusman")) { Debug.Log("Temas bitti"); } }
Bir sonraki dersimizde Unity’de kamera kullanımına ve oyun performansı için önemli olan Occlusion Culling konusunu inceledik.
Selamlar hocam static friction ve dynamic frictionu tam anlamadım hocam videoda static frictionla dynamic fricrtion aynı hareket etti bana bu ikisini yeniden anlatırmısınız
Merhaba Mustafa,
Biraz daha farklı anlatmaya çalışayım.
Dynamic Friction ile hareket halinde olan bir objeye uygulanan sürtünme kuvveti belirtirken Static Friction ise obje sabit durumdan hareketli duruma geçerken uygulanan sürtünme kuvvetini belirtiyor.
Örneğin bir penaltı atışında yerden bir vuruş yapıldığını düşünelim. Topa ilk vuruşta top ile zemin arasındaki sürtünme kuvveti Static Friction oluyor. Ama top kaleye giderken yani hareket halindeyken ortaya çıkan sürtünme kuvveti ise Dynamic Friction oluyor.
Umarım anlatabilmişimdir 🙂
Teşekkürler hocam 😊
Selamlar hocam .Hocam rigidbudy ile collison.gameobje.name=….. diye yazıyoruz collider le ise other.comparetag() diye yazıyoruz sorum şu ki rigidbudy ile yakalarken gameobje yazıyoruz colliderde yazmıyoruz gameobje yi neden acaba gameobjeyi yazmak tercihi bir işmi daha doğrusu gameobjenin kullanım alanları tam olarak nedir sorumu cevaplamanız beni çok mutlu eder şimdiden teşekkürler.
Selam Mustafa,
GameObject ve gameObject‘i karıştırmamak gerekiyor. GameObject bir sınıf gameObject ise bir property yani özelliktir.
Soruna gelirsek aslında teknik bir soru olmuş tebrikler. İşin aslı Unity’nin varsayılan bir fonksiyonu olmuş ve bu şekilde zorunlu tutmuş diyerek geçilecek bir durum çoğu kişi için.
OnCollisionStay ve OnTriggerEnter fonksiyonlarının ikisi de Collider sınıfının fonksiyonları.
OnTriggerEnter(Collider other) fonksiyonunda gönderilen other değişkeninin türü Collider olduğu için gameObject yazmadan erişebiliyorsun.
OnCollisionEnter(Collision other) fonksiyonu ise Collision türünde bir değişken gönderdiği için gameObject property kullanarak erişebiliyorsun.
Hocam Udemy kursunuz varmı yada YouTube yoksa bir an önce yapmanızı rica ediyorum siz bu işi biliyorsunuz ama bu sitede çok süper videodan çalışıp burda pekiştiriyoruz hakkınız ödenmez teşekkürler. İyi günler..
Selam Mustafa, Layık gördüğün için teşekkürler ama şuan zamanla ilgili problemler olduğu için eğitim hazırlama durumum bulunmuyor ama ilerde neden olmasın 🙂
Çooooooooooooooook Teşekkür Ederim sayenizde Bir Fps Oyunu yapıcağım
udemy falan hikaye burası müqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq