Geri İtme
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 57 / 71.
Geri tepme, sana çarpan şeyden uzağa doğru bir itmedir: çarpandan çarpılana uzanan çizgi boyunca tek bir darbe. Bu tampon, ona çarpan her şeyi geri iter:
[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 şeye doğru yönü gösterir. İtmenin yatay kalması için y değeri 0 yapılır; normalized ise iki merkezin arasındaki mesafe ne olursa olsun vektörü aynı büyüklüğe getirir. ForceMode.Impulse, tek seferlik bir itmedir: hızı bir anda power değerinin kütleye bölümü kadar değiştirir; bu nedenle 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 bir adımlık kuvvet uygular; bu, 50 kat daha azdır.
İtme, yalnızca hızı başka bir şey değiştirmediği sürece devam eder. FixedUpdate içinde rb.linearVelocity değerini her adımda ok tuşlarından alan bir oyuncu, bir adım sonra bu etkiyi kaybeder. Bu nedenle böyle bir betik, çarpışmadan sonra kısa bir süre hıza dokunmamalı ya da oyuncuyu kuvvetlerle hareket ettirmelidir.
Görev
OrtaOyuncunun Space tuşuyla bir şok dalgası oluşturmasını sağla.
Input.GetKeyDown(KeyCode.Space)durumunda, oyuncunun kendi çarpıştırıcısını atlayarakforeach (Collider hit in Physics.OverlapSphere(transform.position, radius))döngüsünü kullan.- Her
hit.TryGetComponent(out Rigidbody body)içinaway = hit.transform.position - transform.positiondeğerini al veaway.y = 0folarak ayarla. body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);çağrısını yap.
“Oyna” düğmesine bas ve kasaların arasında Space tuşuna bas. Ardından “Kontrol et” 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 nesnesini oyuncudan uzağa doğru it
}
}
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 DuvarKendi başına pratik yap: Unity playground