Menu
CoddyTech

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.

challenge icon

Görev

Orta

Oyuncu 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.OverlapSphere ile oyuncunun radius mesafesi 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 power kuvveti ve yukarı doğru lift kuvveti.
  • 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
    }
}
quiz iconKendini test et

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