Geri Savurma
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 54 / 63.
Geri savurma, sana çarpan şeyden uzağa doğru bir itmedir: çarpan nesneden çarpılan nesneye uzanan çizgi boyunca uygulanan tek bir dürtü. Bu tampon, kendisine çarpan her şeyi geri savurur:
[SerializeField] private float power = 8f;
void OnCollisionEnter(Collision collision)
{
Vector3 away = collision.transform.position - transform.position;
away.y = 0f;
collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}collision.transform.position - transform.position, tampondan ona çarpan nesneye doğru yönelir. İtmenin yatay kalması için y değeri 0 yapılır; normalized ise iki merkezin birbirinden ne kadar uzakta olduğuna bakmaksızın vektörün büyüklüğünü aynı yapar. ForceMode.Impulse, tek seferlik bir itmedir: hızı anında power değerinin kütleye bölümü kadar değiştirir; bu yüzden kütlesi 2 olan bir top, kütlesi 1 olan bir topun yarı hızında uçar. Varsayılan ForceMode.Force her adımda uygulanmak üzere tasarlanmıştır ve tek adımlık bir kuvvet uygular; bu da 50 kat daha azdır.
İtme, yalnızca hızı başka bir şey değiştirmediği sürece devam eder. Her adımda FixedUpdate içinde rb.linearVelocity değerini ok tuşlarından gelen değerlere ayarlayan bir oyuncu, itmenin etkisini bir adım sonra kaybeder. Bu nedenle böyle bir betiğin çarpışmadan sonra bir süre hıza dokunmaması ya da oyuncuyu kuvvetlerle hareket ettirmesi gerekir.
Görev
OrtaOyuncu bir şok dalgası oluşturabilir. Player üzerine Shockwave betiğini yaz. Inspector bu betiğe radius (4), power (6) ve lift (2) değerlerini verir. Player betiği hazır: ok tuşları oyuncuyu hareket ettirir.
- Space tuşuna basıldığında,
Physics.OverlapSphereile oyuncununradiusmesafesi içindeki tüm collider'ları bul. - Oyuncunun kendisi hariç, Rigidbody bileşeni olan her nesneye bir Impulse uygulanır: yerde oyuncudan doğrudan uzağa doğru
powerkuvveti ve yukarı doğruliftkuvveti. - Zemin gibi Rigidbody bileşeni olmayan collider'lar etkilenmez.
Play düğmesine bas, sandıkların arasında yürü ve Space tuşuna bas; ardından Check düğmesine bas.
Kendin dene
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// Space tuşuna basıldığında: radius içindeki her Rigidbody'yi oyuncudan uzağa it
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir Duvar3Tetikleyiciler
Tetikleyici ÇarpıştırıcılarOnTriggerEnterToplanabilir NesnelerÖlüm BölgeleriGiriş ve ÇıkışÖzet: Anahtar ve Kapı6Işın Atışları
Physics.RaycastRaycastHitIşınla Zemin KontrolüKatmanlar ve LayerMaskGörüş HattıOverlapSphere ve SphereCastTekrar: Lazerli Alarm Teli9Düşmanlar
Oyuncuyu Takip EtMenzil İçinde TakipDevriye ve TakipCan ve HasarGeri SavurmaTekrar: Bekçi Köpeği