Menu
CoddyTech

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.

challenge icon

Görev

Orta

Oyuncunun Space tuşuyla bir şok dalgası oluşturmasını sağla.

  1. Input.GetKeyDown(KeyCode.Space) durumunda, oyuncunun kendi çarpıştırıcısını atlayarak foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)) döngüsünü kullan.
  2. Her hit.TryGetComponent(out Rigidbody body) için away = hit.transform.position - transform.position değerini al ve away.y = 0f olarak ayarla.
  3. 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

Kendi başına pratik yap: Unity playground