Odrzut
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 54 z 63.
Odrzucenie to kopnięcie oddalające od tego, co cię uderzyło: jeden impuls wzdłuż linii od uderzającego do uderzonego obiektu. Ten odbojnik odrzuca wszystko, co się o niego obija:
[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 odbojnika do obiektu, który w niego uderzył. Wartość y jest ustawiana na 0, aby kopnięcie odbywało się poziomo, a normalized sprawia, że wektor ma tę samą długość 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 odlatuje z połową prędkości piłki o masie 1. Domyślne ForceMode.Force jest przeznaczone do stosowania w każdym kroku i daje efekt równy jednemu krokowi, czyli 50 razy mniejszy.
Kopnięcie trwa tylko wtedy, gdy nic nie nadpisuje prędkości. Gracz, którego FixedUpdate ustawia rb.linearVelocity na podstawie strzałek w każdym kroku, traci ten efekt już w następnym kroku. Taki skrypt musi więc na chwilę po trafieniu pozostawić prędkość bez zmian albo poruszać graczem za pomocą sił.
Wyzwanie
ŚredniGracz może wywołać falę uderzeniową. Napisz skrypt Shockwave dla obiektu Player. Inspector ustawia jego wartości: radius (4), power (6) i lift (2). Skrypt Player jest gotowy: strzałki poruszają graczem.
- Po naciśnięciu spacji znajdź każdy collider w promieniu
radiusod gracza za pomocąPhysics.OverlapSphere. - Każdy z nich, który ma komponent Rigidbody — z wyjątkiem samego gracza — otrzymuje impuls:
powerbezpośrednio od gracza, równolegle do podłoża, orazliftw górę. - Collidery bez komponentu Rigidbody, takie jak podłoże, pozostają bez zmian.
Naciśnij Play, przejdź między skrzyniami i naciśnij spację, a następnie Check.
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 promieniu radius
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur