Joylas

Unity’de Rigidbody Kullanımı: Adım Adım Fizik Simülasyonu Rehberi

3D dünyanın kendine has kuralları ve fiziksel yasaları vardır. Unity oyun motoru, bu yasaları simüle edebilmeniz için bir dizi araç ve bileşen sunar. Bu makalede, Unity’de Rigidbody bileşenini kullanarak 3D objeler üzerinde daha gerçekçi ve etkileşimli fiziksel davranışlar oluşturmanın yollarını keşfedeceğiz. Başlangıç olarak, Rigidbody’nin Unity’deki önemini ve bu bileşeni bir objeye nasıl ekleyeceğinizi ele alacağız. Vakit kaybetmeden, bu sürecin detaylarına girelim.

Unity’de Rigidbody Nedir?

Unity’de, 3D objelerin fiziksel davranışlarını yönetmek için kullanılan temel bir bileşen olan Rigidbody, oyun geliştirme sürecinde önemli bir rol oynar. Rigidbody bileşeni, bir objenin yer çekimi, kuvvet ve tork gibi fiziksel kuvvetlere nasıl tepki vereceğini kontrol etmenize olanak tanır.

Öncelikle, Rigidbody’nin bir oyun objesi üzerindeki etkilerini anlamak, bir oyunun dinamik ve gerçekçi bir fizik sistemi oluşturmanın temelini atmaktadır. Unity, fiziksel dünyanın simülasyonunu yapabilmek için Newton’un hareket yasalarını kullanır. Rigidbody bileşeni, bu yasaları objelerin hareketlerine uygular, bu sayede objeler gerçek dünyadaki gibi hareket ederler.

Rigidbody bileşeni, bir objenin hareketini kontrol edebileceğiniz bir dizi özellik ve araç sunar. Bu bileşenle, bir objenin kütlesini, sürüklenmesini ve yerçekimi etkisini ayarlayabilir, aynı zamanda kuvvet ve tork uygulayabilirsiniz. Bu özellikler, objelerinizin daha doğal ve gerçekçi bir şekilde hareket etmelerini sağlar.

Unity’de Rigidbody Bileşeni Nasıl Eklenir?

Unity’de bir objeye Rigidbody bileşenini eklemek, dinamik ve etkileşimli bir oyun dünyası oluşturmanın ilk adımıdır. Rigidbody bileşenini bir objeye eklemek oldukça basittir. İşte bu işlemi gerçekleştirmenin adımları:

  1. Unity Editor‘ü açın ve Hierarchy penceresinde, Rigidbody bileşenini eklemek istediğiniz objeyi seçin.
  2. Inspector penceresinde, “Add Component” butonuna tıklayın.
  3. Physics” kategorisini seçin ve ardından “Rigidbody” (3D objeler için) veya “Rigidbody 2D” (2D objeler için) seçeneğini seçin.
  4. Şimdi, Inspector penceresinde görünen Rigidbody bileşeni üzerinden çeşitli özellikleri (properties) ayarlayabilirsiniz. Bu özellikler arasında Mass (Kütle), Drag (Sürüklenme), Angular Drag (Açısal Sürüklenme) ve Gravity (Yerçekimi) gibi temel fiziksel özellikler bulunur.

Unity Rigidbody Bileşeni: Temel Özelliklerin Ayrıntılı İncelenmesi

Unity oyun motorunda, Rigidbody bileşeni, 3D objelerin fiziksel davranışlarını denetlemenize imkan tanır. Bu bileşen, bir dizi özelliği (property) barındırır ki, bu özellikler objelerin dünyadaki hareketlerini ve etkileşimlerini daha gerçekçi bir şekilde simüle etmenize yardımcı olur.

Mass (Kütle)

Mass property, Unity’de bir objenin “ağırlığını” belirlemenize yardımcı olur. Bu property, objelerin birbirleriyle olan fiziksel etkileşimlerinde önemli bir rol oynar. Örneğin, bir objenin kütlesi daha büyükse, diğer objeler üzerinde daha büyük bir etki yaratabilir. İşte kütle değerini artırmanın etkileri:

  1. Daha Büyük Kütle, Daha Fazla İnert Yapı: Kütle arttıkça, nesne daha fazla “inek” hale gelir, yani onu hareket ettirmek veya durdurmak daha fazla kuvvet gerektirir. Bu, nesnenin daha yavaş ivmelenmesi ve daha uzun süre hareket etmesi anlamına gelir.
  2. Daha Büyük Kütle, Daha Az Hız Değişimi: Kütle arttıkça, nesne daha az hız değiştirecektir. Yani aynı kuvveti uyguladığınızda, nesne daha az hızlanacak veya yavaşlayacaktır.
  3. Fiziksel Etkileşimlerde Daha Büyük Etki: Daha büyük bir kütle, diğer nesnelerle çarpışmalarda daha büyük bir etki yapar. Örneğin, bir top daha büyük bir kütle ile bir duvara çarparsa, daha büyük bir güçle ve daha az hızla yavaşlayacaktır.
  4. Daha Stabil Hareketler: Büyük kütleli nesneler, dış etkilere daha kararlı bir şekilde tepki verirler ve daha düzgün, tahmin edilebilir hareketler sergilerler.
Nelere Dikkat Etmeliyiz?
  1. Denge: Kütleyi ayarlarken, objeler arası dengeyi sağlamak önemlidir. Aşırı büyük veya küçük kütlemi olan objeler, oyunun fiziksel dünyasında beklenmedik davranışlara neden olabilir.
  2. Optimizasyon: Kütleyi, oyunun genel performansını etkilemeyecek şekilde optimize etmek önemlidir. Aksi halde, aşırı yüksek kütlemi olan objeler, oyunun performansında düşüşe neden olabilir.
  3. Test Etme: Kütleyi ayarladıktan sonra, bu ayarların oyun üzerindeki etkilerini test etmek önemlidir. Bu, potansiyel problemleri önceden belirlemenize yardımcı olabilir.

Drag

Drag property, Unity’de bir objenin hava direncini veya sıvı direncini temsil eder. Bu özellik, bir objenin hareketinin ne kadar “sürüklendiğini” kontrol eder, yani obje hareket ettiğinde ne kadar dirençle karşılaşacağını simüler. Drag, objelerin hızlarını düşüren bir kuvvet olarak çalışır; bu da, özellikle doğal hareketlerin simülasyonunda, önemli bir rol oynar.

Drag -> 0

GIF

Drag -> 1

GIF
Püf Noktaları:
  1. Gerçekçi Hareketler: Drag property, objelerin hızlarını zamanla azaltır, bu da gerçek dünyadaki sürüklenme etkilerini daha başarılı bir şekilde simüle eder.
  2. Farklı Ortamlar için Ayarlamalar: Farklı ortamlar (su, hava, vb.) farklı drag katsayıları gerektirir. Bu nedenle, objelerin bulundukları ortama göre farklı drag değerleri ayarlamak, daha gerçekçi simülasyonlar yaratmanıza yardımcı olabilir.

Angular Drag

Angular Drag property, Unity oyun motorunda bir objenin dönme hareketine uygulanan direnci temsil eder. Bu, objenin dönme hızını zamanla nasıl azaltacağına dair bir simülasyon sunar. Düzgün bir şekilde kullanıldığında, bu özellik, oyun objelerinin daha doğal ve gerçekçi hareketler sergilemesine yardımcı olur.

Angular Drag -> 0.05

GIF

Angular Drag -> 1

GIF
Püf Noktaları:
  1. Dengeli Kullanım: Angular Drag değerinin, oyun içindeki diğer fiziksel özelliklerle (örneğin, Mass ve Drag) dengeli bir şekilde kullanılması gereklidir. Bu, oyunun fiziksel dünyasının daha tutarlı ve inandırıcı olmasını sağlar.
  2. Optimizasyon: Yüksek Angular Drag değerleri, objelerin çok hızlı bir şekilde yavaşlamasına neden olabilir, bu da doğal olmayan hareketlere yol açar. Bu nedenle, bu değeri optimize etmek önemlidir.

Automatic Center of Mass

Automatic Center of Mass property, Unity oyun motorunda bir objenin kütle merkezinin otomatik olarak hesaplanmasını sağlar. Bu özellik, objelerin dengesiz şekilde hareket etmesini önler ve fizik simülasyonlarını daha tutarlı hale getirir.

Unity, bir objenin 3D modelinin geometrisine dayalı olarak kütle merkezini (center of mass) otomatik olarak hesaplar ve ayarlar. Bu, genellikle objelerin dengeli ve gerçekçi bir şekilde hareket etmelerini sağlar. Ancak, bazı durumlarda, otomatik kütle merkezi hesaplaması, objelerin istenen şekilde hareket etmemesine neden olabilir. Bu gibi durumlarda, kütle merkezini manuel olarak ayarlamak daha uygun olabilir.

Örnek Kullanımlar:
  1. Kompleks Geometriler: Otomatik kütle merkezi hesaplaması, kompleks geometrilere sahip objeler için ideal sonuçlar veremeyebilir. Bu gibi durumlarda, kütle merkezini manuel olarak ayarlayarak daha dengeli hareketler elde edebilirsiniz.
  2. Özelleştirilmiş Hareketler: Bazı oyun senaryolarında, objelerin özel hareketler sergilemesi gerekebilir. Örneğin, bir aracın öne doğru daha fazla eğilmesini isteyebilirsiniz. Bu durumda, kütle merkezini manuel olarak ayarlayarak bu tür özelleştirilmiş hareketleri elde edebilirsiniz.
Dikkat Edilmesi Gerekenler:
  1. Dengeli Ayarlar: Kütle merkezini manuel olarak ayarladığınızda, objenin dengesiz hareket etmemesi için dikkatli olmalısınız. Dengesiz hareketler, oyununuzun fizik simülasyonlarını gerçekçi olmaktan çıkarabilir.
  2. Uzman Tavsiyeleri: Kütle merkezini manuel olarak ayarlamak, biraz deneyim gerektirebilir. Bu nedenle, bu konuda uzman tavsiyeleri araştırmak ve dikkate almak önemlidir.

Automatic Tensor

Unity’nin Rigidbody bileşeninde, Inertia Tensor, bir nesnenin dönme direncini temsil eden bir özelliktir. Bu özellik, nesnenin kendi ekseni etrafında ne kadar zor veya kolay döneceğini belirler. Bu durum, nesnenin dönme dinamiği üzerinde büyük bir etki yapar ve oyununuzun fiziksel doğruluğunu artırabilir.

Inertia Tensor, bir nesnenin kütlesinin ve şeklinin bir fonksiyonu olarak otomatik olarak hesaplanır. Bu, genellikle çoğu durum için yeterlidir, ancak bazı özel durumlarda, bu tensoru manuel olarak ayarlamanız gerekebilir.

Örnek Kullanımlar:
  1. Özel Nesne Dinamikleri: Bazı oyun senaryolarında, nesnelerin belirli bir şekilde hareket etmelerini isteyebilirsiniz. Bu gibi durumlarda, Inertia Tensoru manuel olarak ayarlayarak bu tür hareketleri gerçekleştirebilirsiniz.
  2. Kompleks Geometriler: Kompleks geometrilerle çalışırken, otomatik hesaplamalar her zaman en uygun sonuçları vermeyebilir. Bu tür durumlarda, Inertia Tensoru manuel olarak ayarlayarak daha doğru sonuçlar elde edebilirsiniz.
Dikkat Edilmesi Gerekenler:
  1. Bilimsel Yaklaşım: Inertia Tensorunun manuel olarak ayarlanması, bilimsel bir yaklaşım gerektirir. Bu, nesnenin geometrisini ve kütlesini dikkate alarak yapılmalıdır, böylece daha doğru ve gerçekçi sonuçlar elde edilebilir.
  2. Uzman Danışmanlığı: Bu tür manuel ayarlamalar karmaşık olabilir, bu yüzden bu konuda deneyimli bir uzmana danışmak faydalı olabilir.

Use Gravity

Unity’nin Rigidbody bileşeninde “use Gravity” property’si, bir nesnenin dünya üzerindeki yerçekimi kuvvetine tabi olup olmayacağını kontrol eder. Bu özellik, fizik simülasyonları oluştururken oyun geliştiricilerine büyük bir esneklik sağlar.

Dikkat Edilmesi Gerekenler:

Optimizasyon: “Use Gravity” özelliği, gerektiğinden fazla kullanılmamalıdır, çünkü bu, oyunun performansını olumsuz etkileyebilir. Yerçekimi simülasyonlarını sadece gerektiğinde kullanmak, oyununuzu daha verimli hale getirebilir.

Is Kinematic

Unity’nin Rigidbody bileşeninde “is Kinematic” property’si, bir objenin fizik motoru tarafından kontrol edilip edilmeyeceğini belirler. Bu property, bir objenin dinamik olarak hareket edip etmeyeceğini veya statik olarak kalıp kalmayacağını kontrol eder.

“Is Kinematic” property’si aktif olduğunda, nesne fiziksel kuvvetlere ve çarpışmalara karşı bağışıklık kazanır, yani fizik motoru tarafından hareket ettirilemez. Bunun yerine, nesne sadece transform bileşeni aracılığıyla manuel olarak hareket ettirilebilir. Bu, özellikle kontrollü animasyonlar ve script tarafından yönetilen objeler için yararlıdır.

Örnek Kullanımlar:
  1. Animasyon Kontrollü Objeler: Animasyonlar aracılığıyla hareket ettirilen objelerde “is Kinematic” property’si kullanılabilir. Bu, animasyonların fizik motoru tarafından bozulmadan düzgün bir şekilde çalışmasını sağlar.
  2. Script Kontrollü Objeler: “Is Kinematic” özelliği aktif olan objeler, scriptler aracılığıyla hassas bir şekilde kontrol edilebilir, bu da daha kompleks ve kontrollü hareketlerin yaratılmasına olanak tanır.
Dikkat Edilmesi Gerekenler:
  1. Çarpışma Davranışları: “Is Kinematic” aktifken, obje fiziksel çarpışmalara yanıt vermez. Ancak, çarpışma tespiti hala çalışır, bu yüzden scriptlerde çarpışma olaylarına yanıt vermek mümkündür.
  2. Performans: “Is Kinematic” özelliğinin gereksiz yere kullanılmaması, oyunun performansı üzerinde olumlu bir etki yapabilir. Sadece gerçekten gerekli olduğunda bu özelliği kullanmak en iyisidir.

Interpolate

Rigidbody’nin “Interpolate” özelliği, Unity 3D oyun geliştirme sürecinde, objelerin hareketini daha pürüzsüz ve gerçekçi yapmak adına oldukça kritik bir role sahiptir.

Bu property, üç farklı seçenek sunar: None, Interpolate ve Extrapolate.

None

“None” seçeneği, interpolasyonu devre dışı bırakır. Bu durumda, objenin hareketi, fizik simülasyonunun her adımında güncellenir. Bu genelde hızlı ve performans odaklı simülasyonlar için kullanılır, fakat bu, hareketin biraz daha kaba olabileceği anlamına gelir.

Kullanım Durumları:

Interpolate

“Interpolate” seçeneği, objenin mevcut ve önceki pozisyonları arasında ara değerler üreterek hareketini daha pürüzsüz bir hale getirir. Bu, daha gerçekçi ve akıcı animasyonlar yaratır, özellikle yüksek hızda hareket eden objeler için faydalıdır.

Kullanım Durumları:

Extrapolate

“Extrapolate” seçeneği, objenin gelecekteki pozisyonunu tahmin eder ve objeyi bu tahmini pozisyona yerleştirir. Bu, daha az gecikmeli bir hareket yaratır, fakat yanlış tahminler nedeniyle beklenmedik davranışlara yol açabilir.

Kullanım Durumları:

Collision Detection

Unity’nin Rigidbody bileşeni, oyun geliştiricilerine farklı türdeki çarpışma algılamalarını yönetme olanağı tanır. “Collision Detection” property’si, objelerin hareketi sırasında çarpışmaların nasıl algılanacağını kontrol eder.

Bu property, dört farklı seçenek sunar: Discrete, Continuous, Continuous Dynamic, ve Continuous Speculative.

Discrete

“Discrete” çarpışma algılaması, en temel ve performans açısından en hızlı seçenektir. Bu yöntem, objelerin sadece belirli zaman aralıklarında çarpışma kontrolü yapar. Ancak, yüksek hızlarda hareket eden veya çok küçük objelerde, çarpışmaların gözden kaçması olasıdır (tünel etkisi).

Kullanım Durumları:

Continuous

“Continuous” çarpışma algılaması, tüm çarpışmaları doğru bir şekilde yakalamak için daha gelişmiş bir yöntem sunar. Bu, yüksek hızlarda hareket eden objeler için idealdir, çünkü “tünel etkisi”ni önler.

Kullanım Durumları:

Continuous Dynamic

“Continuous Dynamic” seçeneği, sadece dinamik objelerle statik objeler arasındaki çarpışmaları sürekli olarak kontrol eder. Bu, performansı bir dereceye kadar korurken, yüksek hızlarda hareket eden dinamik objeler için daha güvenilir çarpışma deteksiyonu sağlar.

Kullanım Durumları:

Continuous Speculative

“Continuous Speculative” çarpışma algılaması, potansiyel çarpışmaları tahmin eder ve önler. Bu, performansı optimize etmek için kullanılan bir tekniktir ve tünel etkisini önlemeye yardımcı olabilir, ancak bazı özel durumlar dışında genellikle gereklidir.

Kullanım Durumları:

Constraints

Rigidbody’nin “Constraints” property’si, Unity 3D oyun geliştirme platformunda, belirli eksenlerdeki hareket veya dönüşü sınırlamak için bir dizi seçenek sunar. Bu özellik, objelerin istenmeyen hareketlerini önlemek ve daha kontrollü simülasyonlar oluşturmak için oldukça önemlidir.

Freeze Rotation değerleri etkin değil.

GIF

Freeze Rotation değerleri etkin.

GIF

Freeze Position

Bu kısımda, X, Y ve Z eksenlerindeki pozisyonları dondurma opsiyonları yer almaktadır. Bir veya daha fazla eksenin pozisyonunu dondurmak, objenin o eksende hareket etmesini engeller.

Freeze Rotation

Bu kısım ise, X, Y ve Z eksenlerindeki rotasyonları dondurma seçeneklerini içerir. Bir veya daha fazla eksende dönüşü dondurmak, objenin o eksende dönmesini önler.

Layer Overrides

Unity’nin Rigidbody bileşeninde yer alan “Layer Overrides” property’si, belirli katmanlardaki fiziksel etkileşimleri özelleştirmenize imkan tanır. Bu sayede belirli objelerin veya katmanların birbiriyle olan etkileşimleri daha detaylı kontrol edilebilir.

Include Layer

“Include Layer” seçeneği, belirli bir katmanın diğer katmanlarla etkileşime girmesine izin verir. Yani, bu katmanda bulunan objelerin, diğer belirli katmanlarda yer alan objelerle fiziksel olarak etkileşime girmesine olanak sağlar.

Kullanım Durumları:

Exclude Layers

“Exclude Layers” seçeneği tam tersi bir işlevi yerine getirir. Bu seçenek, belirli bir katmanın diğer katmanlarla etkileşime girmemesini sağlar. Yani, bu katmanda bulunan objelerin, diğer belirli katmanlarda yer alan objelerle fiziksel olarak etkileşime girmemesine olanak tanır.

Kullanım Durumları:
Örnek Senaryolar:
  1. Görünmez Duvarlar: Oyun alanınızda, oyuncunun geçemeyeceği ancak göremeyeceği bir duvar oluşturmak isterseniz, bu duvarı bir katmana koyabilir ve “Exclude Layers” ile oyuncu katmanıyla etkileşimini engelleyebilirsiniz.
  2. Özel Etkileşimler: Örneğin, bir “sihir” katmanınız varsa ve bu sihirlerin yalnızca “düşmanlar” ile etkileşime girmesini istiyorsanız, “Include Layer” seçeneğini kullanabilirsiniz.

Unity Rigidbody : Tüm Özellikler (Properties)

Bu makalede bu property’lerin her birini detaylı olarak inceledik. Ancak görsel bir referans veya hızlı bir hatırlatma aracı olarak, Unity’nin resmi dokümantasyonundan alınan “Properties” tablosunu aşağıda bulabilirsiniz. Bu tablo, her property’nin kısa bir açıklamasını ve varsayılan değerlerini içerir. Tabloyu kullanarak, bir bakışta tüm Rigidbody property’lerini görebilir ve geliştirme sırasında hızlı bir referans olarak kullanabilirsiniz.

angularDragNesnenin açısal sürükleme kuvveti.
angularVelocityRigidbodys’nin saniyede radyan cinsinden açısal hızı vektörü.
automaticCenterOfMassKütle merkezini otomatik olarak hesaplanıp hesaplanmayacağı.
automaticInertiaTensorEylemsizlik tensorunun otomatik olarak hesaplanıp hesaplanmayacağı.
centerOfMassDönüşümün orijinine göre kütle merkezi.
collisionDetectionModeRigidbodys’nin çarpışma tespit modu.
constraintsBu Rigidbodys’nin simülasyonu için hangi özgürlük derecelerine izin verildiğini kontrol eder.
detectCollisionsÇarpışma tespiti etkinleştirilmeli mi? (Varsayılan olarak her zaman etkindir).
dragNesnenin sürükleme kuvveti.
excludeLayersBu Rigidbodys’ye bağlı tüm Çarpıştırıcıların, bir Çarpıştırıcının başka bir Çarpıştırıcıyla temas kurup kuramayacağını belirlerken hariç tuttuğu ek katmanlar.
freezeRotationFiziğin nesnenin dönüşünü değiştirip değiştirmeyeceğini kontrol eder.
includeLayersBu Rigidbodys’ye bağlı tüm Çarpıştırıcıların, bir Çarpıştırıcının başka bir Çarpıştırıcıyla temas kurup kuramayacağını belirlerken dahil ettiği ek katmanlar.
inertiaTensorBu cismin eylemsizlik tensoru, bu cismin kütle merkezinde konumlandırılmış bir referans çerçevesinde diyagonal bir matris olarak tanımlanır.
inertiaTensorRotationEylemsizlik tensorunun dönüşü.
interpolationÇalışma zamanında Rigidbody GameObject hareketindeki titremelerin görünümünü yönetmek için interpolasyon sağlar.
isKinematicFiziğin rigidbody’yi etkileyip etkilemeyeceğini kontrol eder.
massRigidbodys’nin kütlesi.
maxAngularVelocityRigidbodys’nin saniyede radyan cinsinden maksimum açısal hızı.
maxDepenetrationVelocityNüfuz eden durumdan çıkarken rigidbodys’nin maksimum hızı.
maxLinearVelocityRigidbodys’nin saniyede metre cinsinden maksimum doğrusal hızı.
positionRigidbodys’nin konumu.
rotationRigidbodys’nin dönüşü.
sleepThresholdNesnelerin uyumaya başlaması için kütle-normalleştirilmiş enerji eşiği.
solverIterationsSolverIterations, Rigidbodys eklemlerinin ve çarpışma temaslarının ne kadar doğru çözüldüğünü belirler.
solverVelocityIterationsSolverVelocityIterations, Rigidbodys eklemlerinin ve çarpışma temaslarının ne kadar doğru çözüldüğünü etkiler.
useGravityBu rigidbodys’ye yerçekiminin etkileyip etkilemeyeceğini kontrol eder.
velocityRigidbodys’nin hız vektörü. Rigidbody pozisyonundaki değişiklik hızıdır.
worldCenterOfMassDünya alanında rigidbodys’nin kütle merkezi (Sadece Okunabilir).

Bu tabloyu, projenizde karşılaştığınız özel senaryolara uygun olarak kullanabilirsiniz. Her property’nin ne işe yaradığını anlamak, oyununuzun fiziksel davranışlarını daha iyi kontrol etmenizi sağlar ve bu da oyun deneyiminizi zenginleştirir.

Rigidbody’nin Public Methodları

Unity’nin Rigidbody bileşeni sadece çeşitli property’lerle sınırlı değildir. Aynı zamanda geliştiricilere nesnenin hareketi, dönüşü ve diğer fiziksel etkileşimleri üzerinde daha fazla kontrol ve esneklik sağlamak için çeşitli public methodlar da sunar. Bu methodlar, oyununuzdaki fiziksel nesneler üzerinde özel hareketler veya etkileşimler gerçekleştirmenize olanak tanır. Özellikle karmaşık fizik simülasyonları veya belirli etkileşimler için bu public methodlar vazgeçilmezdir.

AddExplosionForce

Birçok oyunun vazgeçilmez unsurlarından biri de patlamalardır. Bir granatın patlaması, bir benzin bidonunun havaya uçması veya büyük bir patlama dalgasının etrafındaki objeleri savurması gibi sahneler, oyuncuya etkileyici ve unutulmaz anlar yaşatabilir. İşte tam da bu tür sahnelerde, Unity’nin AddExplosionForce public methodu devreye girer.

GIF

AddExplosionForce methodu, belirli bir patlama merkezinden belirli bir radyusta etkileşime giren tüm rigidbody nesnelerine patlama kuvveti uygular. Bu, patlama merkezine yakın nesnelerin daha büyük bir kuvvetle fırlatılmasını, daha uzakta olan nesnelerin ise daha az etkilenmesini sağlar. Method, patlama kuvveti, patlama merkezi ve etkileşim radyusu gibi parametreleri alarak çalışır.

Oyun geliştiricileri, bu methodu kullanarak gerçekçi patlama efektleri yaratmak için kullanabilir. Örneğin, bir oyuncu bir dinamiti patlatırsa, etrafındaki kutular, variller ve diğer nesneler dinamitin şiddetine ve oyuncunun dinamite olan uzaklığına bağlı olarak farklı yönlerde ve farklı hızlarda savrulabilir.

public float radius = 1.0f;
public float power = 200.0f;

Rigidbody rb;
Vector3 explosionPos;
void Start()
{
    explosionPos = transform.position;
    Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
    foreach (Collider hit in colliders)
    {
        rb = hit.GetComponent<Rigidbody>();
    }
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddExplosionForce(power, explosionPos, radius, 3.0F);
    }
}

Özetlemek gerekirse, AddExplosionForce, oyunlarda dinamik ve gerçekçi patlama simülasyonları oluşturmak için mükemmel bir araçtır. Bir patlama efektini canlandırmak ve bu patlamanın oyun dünyasındaki nesneler üzerindeki etkisini simüle etmek isteyen geliştiriciler için bu method vazgeçilmez bir yardımcıdır.

AddForce

Hareketin fizik dünyasındaki temel etmenlerinden biri kuvvettir. Unity’de nesneleri hareket ettirmek veya onlara momentum kazandırmak için AddForce adında çok yönlü bir public methoda sahibiz. Bu method, oyun içindeki nesnelere belirli bir kuvvet uygulayarak onların hareketini simüle eder. Özellikle fizik tabanlı oyun mekaniği oluştururken bu methoda sıkça başvurulur.

GIF

AddForce methodu, belirttiğiniz bir vektör yönünde kuvvet uygular. Bu, topa vuruş, bir aracın hızlanması veya rüzgarın etkisi gibi birçok senaryoda kullanılabilir.

Methodun en önemli özelliklerinden biri, uygulanan kuvvetin türünü belirlemek için kullanılan ForceMode parametresidir. Bu parametre dört farklı değer alabilir:

  1. ForceMode.Force: Bu, standart bir kuvvet uygulama modudur. Uygulanan kuvvet, nesnenin kütlesine bağlı olarak hızını değiştirir. Özellikle sürekli etkili kuvvetlerde (örn. yerçekimi) kullanılır.
  2. ForceMode.Acceleration: Bu mod, kütleyi dikkate almadan bir hızlandırma uygular. Bu, kütlesi ne olursa olsun tüm nesnelerin aynı şekilde hızlanmasını sağlar.
  3. ForceMode.Impulse: Ani bir kuvvet darbesi uygular. Nesnenin kütlesini dikkate alarak ona anlık bir hız kazandırır. Özellikle patlamalar veya tek seferlik etkileşimlerde kullanılır.
  4. ForceMode.VelocityChange: Nesnenin hızını doğrudan değiştirir, kütlesini dikkate almadan. Özellikle bir nesnenin hızını aniden değiştirmek istediğinizde kullanışlıdır.
void Start()
{
    rb = GetComponent<Rigidbody>();
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(transform.forward * 20f);
    }
}

Özetle, AddForce methodu, Unity oyunlarında dinamik hareket ve etkileşimleri gerçekleştirmek için kritik bir araçtır. Uygulanan kuvvetin türüne ve şiddetine bağlı olarak, bu methodla birçok farklı fiziksel etkileşimi simüle edebilirsiniz.

AddTorque

Fizik tabanlı hareketlerde sadece doğrusal hareket değil, dönüş hareketi de önemli bir rol oynar. Unity’deki AddTorque public methodu, nesnelere dönüş hareketi kazandırmamıza yardımcı olur. Bu method, nesnenin merkezinden belirli bir aks üzerinde bir tork (dönme kuvveti) uygular, böylece nesnenin dönmeye başlamasını sağlar.

GIF

AddTorque, özellikle dönen tekerlekler, kapıların açılması, dönen platformlar veya bir nesnenin yere çarparak yuvarlanması gibi senaryolarda kullanışlıdır. Ayrıca, oyuncunun bir nesneyi ittiğinde veya çektiğinde o nesnenin nasıl tepki vereceğini simüle etmek için de kullanılabilir.

void Start()
{
    rb = GetComponent<Rigidbody>();
    rotationSpeed = 10.0f;
}

void Update()
{
    float rotationAmount = rotationSpeed * Time.deltaTime;
    Vector3 rotation = Vector3.up * rotationAmount;
    rb.AddTorque(rotation);
}

Bu method, bir vektör aracılığıyla torkun yönünü ve şiddetini belirtmemizi sağlar. Örneğin, y ekseninde pozitif bir tork uygulamak, nesnenin saat yönünün tersine dönmesine neden olabilir. Benzer şekilde, z ekseninde negatif bir tork uygulamak nesnenin kendisini saat yönünde döndürebilir.

Uygulanan torkun etkisi, nesnenin kütle merkezinin yerine, eksenleri ve büyüklükleri ile tanımlanan bir vektörle kontrol edilir. Bu, özellikle asimetrik nesnelerle çalışırken dönüş hareketini daha öngörülebilir ve kontrollü hale getirir.

MovePosition

MovePosition metodu, Rigidbody’nin mevcut pozisyonunu belirtilen pozisyona doğru fizik tabanlı bir şekilde değiştirmek için kullanılır. Bu metot, nesnenin bir hedef pozisyona animasyon veya script yardımıyla hareketini simüle etmek istendiğinde oldukça kullanışlıdır.

GIF

Geleneksel olarak, transform özellikleriyle doğrudan hareket etmek yerine MovePosition kullanmak, fizik motoruyla daha tutarlı bir etkileşim sağlar. Özellikle diğer nesnelerle etkileşimde bulunan bir nesneyi hareket ettirirken bu önemlidir. Örneğin, bir platform oyununda bir platformun oyuncuyu taşıdığı bir senaryoda, platformun diğer nesnelerle doğru bir şekilde etkileşimde bulunmasını sağlamak için MovePosition kullanabilirsiniz.

MovePosition, Rigidbody’nin yeni pozisyonunu doğrudan ayarlamaz; bunun yerine, Rigidbody’yi belirtilen pozisyona doğru hareket ettirir. Bu, özellikle hızlı hareket eden nesnelerde beklenmedik çarpışmaları önlemek için kullanışlıdır.

void Start()
{
    m_Rigidbody = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    Vector3 m_Input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
    m_Rigidbody.MovePosition(transform.position + m_Input * Time.deltaTime * 5f);
}

Sonuç olarak, MovePosition metodu, nesnelerin fizik tabanlı bir şekilde hareket etmesini sağlar ve fizik motoruyla uyumlu bir hareket sağlamak için idealdir. Özellikle dinamik oyun ortamlarında, nesnelerin ve karakterlerin diğer nesnelerle doğru bir şekilde etkileşimde bulunmasını sağlamak için bu metot tercih edilir.

MoveRotation

MoveRotation metodu, Rigidbody’nin mevcut dönüş açısını, belirttiğimiz bir Quaternion değerine doğru fiziksel bir şekilde değiştirmek için kullanılır. Bu, nesnenin belirli bir yöne doğru fizik tabanlı bir dönüş yapmasını simüle etmek istediğimizde son derece kullanışlıdır.

Geleneksel olarak, transform özellikleriyle doğrudan dönüş yapmak, bazen beklenmedik sonuçlar doğurabilir. Özellikle nesnenin diğer fiziksel nesnelerle etkileşimde bulunduğu durumlarda bu problematik olabilir. MoveRotation, bu tür etkileşimler sırasında nesnenin dönüşünün fizik motoruyla daha uyumlu olmasını sağlar.

GIF

Örneğin, bir kapının etrafında dönen bir kol gibi hareket eden bir nesne düşünün. Bu hareketi simüle ederken, kolun kapıya sürekli olarak temas etmesini isteyebiliriz. Bu tür bir senaryoda, MoveRotation kullanmak, kolun kapıya doğru tutarlı bir şekilde temas etmesini sağlar.

Ayrıca, MoveRotation metodu, dönüş hareketini ani bir şekilde değil, belirli bir hızla gerçekleştirebilir. Bu, daha gerçekçi ve doğal hareketlerin simülasyonu için önemlidir.

void Start()
{
    m_Rigidbody = GetComponent<Rigidbody>();
    m_EulerAngleVelocity = new Vector3(0, 100, 0);
}

void FixedUpdate()
{
    Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.fixedDeltaTime);
    m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation);
}

Sonuç olarak, MoveRotation metodu, nesnelerin fizik tabanlı bir şekilde dönüşünü kontrol etmek için mükemmel bir araçtır. Dinamik oyun ortamlarında, nesnelerin ve karakterlerin belirli bir yönde dönmesini sağlamak için bu metot ideal bir seçenektir.

Unity Rigidbody : Tüm Public Methodlar

Aşağıda, Unity Docs’tan alınan Public Methods tablosunu bulacaksınız. Bu tablo, her bir metodun ne işe yaradığına dair kısa açıklamalar içermektedir. Geliştiriciler için başvuru kaynağı olarak kullanabileceğiniz bu tabloyu inceleyerek, Rigidbody’nin sunduğu bu fonksiyonları daha derinlemesine anlayabilirsiniz.

AddExplosionForceBir Rigidbody’e patlama efektlerini simüle eden bir kuvvet uygular.
AddForceRigidbody’e bir kuvvet ekler.
AddForceAtPositionBelli bir pozisyona kuvvet uygular. Sonucunda bu, objede bir tork ve kuvvet uygulayacaktır.
AddRelativeForceRigidbody’e kendi koordinat sistemine göre bir kuvvet ekler.
AddRelativeTorqueRigidbody’e kendi koordinat sistemine göre bir tork ekler.
AddTorqueRigidbody’e bir tork ekler.
ClosestPointOnBoundsEkli çarpıştırıcının sınırlama kutusuna en yakın nokta.
GetAccumulatedForceSimülasyon adımından önce Rigidbody’in birikmiş olduğu kuvveti döndürür.
GetAccumulatedTorqueSimülasyon adımından önce Rigidbody’in birikmiş olduğu torku döndürür.
GetPointVelocityGlobal alanda, worldPoint noktasında Rigidbody’in hızı.
GetRelativePointVelocityRelativePoint noktasında Rigidbody’e göre göreli hız.
IsSleepingRigidbody uyuyor mu?
MoveRigidbody’i bir pozisyona taşır ve onu döndürür.
MovePositionKinematik Rigidbody’i bir pozisyona doğru taşır.
MoveRotationRigidbody’i bir rotasyona döndürür.
ResetCenterOfMassRigidbody’in kütle merkezini sıfırlar.
ResetInertiaTensorEylemsizlik tensörü değerini ve rotasyonunu sıfırlar.
SetDensitySabit bir yoğunluğu varsayarak ekli çarpıştırıcılara dayanarak kütleyi ayarlar.
SleepBir Rigidbody’i en az bir frame uyumaya zorlar.
SweepTestBir Rigidbody’nin sahne boyunca hareket ederse herhangi bir şeyle çarpışıp çarpışmayacağını test eder.
SweepTestAllRigidbody.SweepTest gibi, ancak tüm isabetleri döndürür.
WakeUpBir Rigidbody’i uyanmaya zorlar.

Rigidbody Messages

Rigidbody bileşeni, Unity’nin fizik motorunun bir parçası olarak çalışır ve bu fiziksel etkileşimler sırasında belirli olayları tanımlamak için bir dizi “Mesaj” fonksiyonu sunar. Bu mesajlar, çeşitli çarpışma durumlarına yanıt olarak tetiklenir ve oyun geliştiricilerine nesnelerin fiziksel etkileşimleri sırasında özel kodları çalıştırma yeteneği verir.

OnCollisionEnterOnCollisionEnter, bu collider/rigidbody’nin başka bir rigidbody/collider ile temas etmeye başladığında çağrılır.
OnCollisionExitOnCollisionExit, bu collider/rigidbody’nin başka bir rigidbody/collider ile temasını sonlandırdığında çağrılır.
OnCollisionStayOnCollisionStay, bir Collider veya Rigidbody’nin başka bir Collider veya Rigidbody ile her karesinde temas halindeyken çağrılır.

Özellikle, OnCollisionEnter, OnCollisionStay ve OnCollisionExit olmak üzere üç temel mesaj vardır. Bu mesajlar, Rigidbody’nin diğer çarpıştırıcılarla etkileşimde bulunduğu anları tanımlar. Bu mesajlar sayesinde, bir nesnenin başka bir nesneyle ilk temas ettiği andan, sürekli temas halinde olduğu sürece ve nihayetinde teması kesene kadar olan tüm süreci izleyebilir ve bu etkileşimlere özel tepkiler verebiliriz. Bu, oyun mekaniği ve etkileşimlerin zenginleştirilmesi için kritik bir araçtır.

OnCollisionEnter

OnCollisionEnter mesajı, bir Rigidbody’nin başka bir çarpıştırıcı ile ilk temas kurduğu an tetiklenir. Bu, oyun geliştirme sürecinde, iki nesne arasındaki etkileşim başladığında gerçekleştirilmesi gereken belirli işlemler veya tepkiler için oldukça kullanışlıdır.

Örneğin, bir oyun karakteri zemine düştüğünde veya bir duvara çarptığında bu mesaj tetiklenebilir. Bu, oyuncuya hasar vermek, bir ses efekti çalmak veya çarpışma etkisi oluşturmak gibi eylemleri gerçekleştirmek için kullanılabilir.

void OnCollisionEnter(Collision collision) {
    if(collision.gameObject.tag == "Zemin") {
        Debug.Log("Zemine değdi!");
    }
}

Yukarıdaki örnekte, bir nesnenin “Zemin” etiketine sahip bir nesneyle temas kurup kurmadığını kontrol ediyoruz. Eğer temas varsa, konsola bir mesaj yazdırılıyor.

OnCollisionStay

OnCollisionStay mesajı, iki çarpıştırıcının sürekli olarak temas halinde olduğu süre boyunca her fizik güncellemesinde tetiklenir. Bu, iki nesne arasında sürekli bir etkileşim olduğunda ve bu etkileşimin sürdüğü süre boyunca gerçekleştirilmesi gereken işlemler veya tepkiler için oldukça yararlıdır.

Bu mesaj, örneğin, bir oyun karakteri bir platformda sürekli olarak duruyorsa veya bir nesne sürekli olarak bir duvarla temas halindeyse tetiklenebilir. Bu, oyuncuya sürekli hasar vermek, sürekli bir ses efekti çalmak ya da nesnenin üzerinde sürekli bir animasyon oynatmak gibi sürekli etkileşimlerde bulunmak için kullanılabilir.

void OnCollisionStay(Collision collision) {
    if(collision.gameObject.tag == "Lava") {
        Debug.Log("Lava ile temas halinde! Can azalıyor!");
    }
}

Yukarıdaki örnekte, bir nesnenin “Lava” etiketine sahip bir nesneyle sürekli olarak temas halinde olup olmadığını kontrol ediyoruz. Eğer temas devam ediyorsa, konsola bir uyarı mesajı yazdırılıyor.

OnCollisionExit

OnCollisionExit mesajı, iki çarpıştırıcının teması sonlandığında tetiklenir. Bir nesnenin başka bir nesneyle olan teması kesildiği andan itibaren bu mesaj aktif hale gelir. Bu, temasın sona ermesine özel tepkiler veya işlemler oluşturmak için kullanılır.

Bu mesaj, örneğin, bir oyun karakteri bir platformdan atladığında veya bir nesne bir duvarla olan temasını kaybettiğinde tetiklenebilir. Bu, oyuncunun temasın sona ermesiyle birlikte belirli bir animasyonu tetiklemesi, hasar almasının durması ya da bir ses efektinin sonlandırılması gibi durumlar için kullanılabilir.

void OnCollisionExit(Collision collision) {
    if(collision.gameObject.tag == "Platform") {
        Debug.Log("Platform ile olan temas kesildi! Düşüyorsun!");
    }
}

Yukarıdaki örnekte, bir nesnenin “Platform” etiketine sahip bir nesneyle olan temasının sona erip ermediğini kontrol ediyoruz. Eğer temas kesildiyse, konsola bir uyarı mesajı yazdırılıyor.

OnCollision Mesajlarını Kullanırken Dikkat Edilmesi Gerekenler ve Sıkça Sorulan Sorular

OnCollisionEnter, OnCollisionStay ve OnCollisionExit gibi OnCollision mesajları oldukça kullanışlıdırlar, ancak etkili bir şekilde kullanabilmek için bazı önemli detayları bilmek gerekmektedir.

Dikkat Edilmesi Gerekenler:
  1. Rigidbody Kontrolü: Bu mesajların tetiklenmesi için etkileşimde bulunan nesnelerden en az birinin bir Rigidbody bileşenine sahip olması gerekmektedir.
  2. İzolasyon: Eğer bir nesne hareketsiz (isKinematic özelliği true olarak ayarlanmış) bir Rigidbody bileşenine sahipse, sadece hareket eden diğer Rigidbody‘lerle olan çarpışmaları algılar.
  3. Performans: OnCollisionStay sürekli olarak çağrılır. Bu nedenle bu mesajı kullanırken performans konusunda dikkatli olunmalıdır.
Sıkça Sorulan Sorular:

Q: OnCollisionEnter mesajım neden tetiklenmiyor?
A: Bu sorunun birkaç olası nedeni olabilir:

Nesnelerden en az birinin Rigidbody bileşeni olmaması.
Çarpıştırıcıların (Colliders) düzgün ayarlanmamış olması.
Rigidbody’nin isKinematic özelliğinin yanlış ayarlanmış olması.


Q: OnCollisionStay mesajı ne sıklıkla çağrılır?
A: Bu mesaj, iki nesne temas halindeyken her fizik güncellemesinde çağrılır. Bu nedenle performansa dikkat etmek önemlidir.

Q: OnCollisionExit birden fazla kez neden tetikleniyor?
A: Bu, genellikle nesnelerin sık sık teması kesip tekrar temas kurduğu durumlarda meydana gelir. Bu, fiziksel hesaplamalar veya çarpıştırıcı ayarlarından kaynaklanabilir.

Q: OnCollision mesajları 2D oyunlarda çalışır mı?
A: Hayır, 2D oyunlarda bu mesajların 2D eşdeğerleri olan OnCollisionEnter2D, OnCollisionStay2D ve OnCollisionExit2D’yi kullanmalısınız.

Q: Nesnelerim temas ediyor, ancak OnCollision mesajları tetiklenmiyor. Bunun nedeni nedir?
A: Bu, çarpıştırıcıların yanlış veya eksik konfigüre edilmesinden, ya da Rigidbody özelliklerinin yanlış ayarlanmasından kaynaklanıyor olabilir. Ayrıca nesnelerin katman ayarlarını da kontrol etmelisiniz.

Bu ipuçları ve sıkça sorulan sorular, OnCollision mesajlarını daha etkili bir şekilde kullanmanıza yardımcı olacaktır. Ancak, her oyunun kendine özgü birçok farklı senaryoya sahip olabileceğini unutmamanız önemlidir, bu nedenle her zaman dikkatli testler yapmalısınız.


Unity’nin Rigidbody bileşenini ve onunla ilişkilendirilen çeşitli özellikleri, public methodları ve mesajları derinlemesine inceledik. Rigidbody, fizik tabanlı hareketler ve etkileşimler oluştururken oyun geliştiricileri için vazgeçilmez bir araçtır. Doğru bir şekilde kullanıldığında, gerçekçi hareketler ve etkileşimlerle oyununuza canlılık katabilirsiniz.

Eğer makale boyunca herhangi bir konu hakkında sorularınız ya da şüpheleriniz oluştuysa, lütfen aşağıdaki yorum bölümünden bizimle paylaşın. Her türlü soruya yanıt vermeye çalışacağız. Unutmayın, bir konuyu tam anlamıyla öğrenmenin en iyi yolu, onunla deneyim kazanmak ve pratik yapmaktır. Unity ile çalışırken Rigidbody konusunda denemeler yapın, farklı senaryolar oluşturun ve öğrendiklerinizi uygulamaya dökün.

Oyun geliştirmeye olan ilginiz ve bu makaleye gösterdiğiniz ilgi için teşekkür ederiz. Başarılar dileriz!

Exit mobile version