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ł.
Wyzwanie
ŚredniPozwól graczowi wywołać falę uderzeniową za pomocą spacji.
- Po
Input.GetKeyDown(KeyCode.Space)wykonaj pętlęforeach (Collider hit in Physics.OverlapSphere(transform.position, radius)), pomijając własny collider gracza. - Dla każdego
hit.TryGetComponent(out Rigidbody body)pobierzaway = hit.transform.position - transform.positioni ustawaway.y = 0f. - 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
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwiPoćwicz samodzielnie: Edytor online Unity