Menu
CoddyTech

Odrzut

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 57 z 71.

Odrzut to kopnięcie od tego, co cię uderzyło: jeden impuls wzdłuż linii od uderzającego do uderzonego obiektu. Ten odbijacz odrzuca wszystko, co się z nim zderzy:

[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 wskazuje kierunek od odbijacza do obiektu, który w niego uderzył. Wartość y jest ustawiana na 0, aby kopnięcie pozostało poziome, a normalized sprawia, że wektor ma ten sam rozmiar niezależnie od odległości między środkami obu obiektów. ForceMode.Impulse to jednorazowe kopnięcie: natychmiast zmienia prędkość o wartość power podzieloną przez masę, więc piłka o masie 2 odleci z połową prędkości piłki o masie 1. Domyślne ForceMode.Force służy do stosowania siły w każdym kroku i daje efekt równy jednemu krokowi — 50 razy mniejszy.

Kopnięcie działa tylko wtedy, gdy nic nie nadpisuje prędkości. Gracz, którego FixedUpdate ustawia rb.linearVelocity na podstawie strzałek w każdym kroku, straci ten efekt już w następnym kroku. Taki skrypt musi więc przez chwilę po uderzeniu nie zmieniać prędkości albo poruszać graczem za pomocą sił.

challenge icon

Wyzwanie

Średni

Pozwól graczowi wywołać falę uderzeniową za pomocą spacji.

  1. Po Input.GetKeyDown(KeyCode.Space) wykonaj pętlę foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)), pomijając własny collider gracza.
  2. Dla każdego hit.TryGetComponent(out Rigidbody body) pobierz away = hit.transform.position - transform.position i ustaw away.y = 0f.
  3. Wywołaj body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.

Naciśnij „Graj”, a następnie naciśnij spację wśród skrzyń. Potem kliknij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Shockwave : MonoBehaviour
{
    [SerializeField] private float radius = 4f;
    [SerializeField] private float power = 6f;
    [SerializeField] private float lift = 2f;

    void Update()
    {
        // po naciśnięciu Space: odepchnij od gracza każdy Rigidbody w zasięgu radius
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity