Menu
CoddyTech

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ł.

challenge icon

Wyzwanie

Średni

Gracz 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 radius od gracza za pomocą Physics.OverlapSphere.
  • Każdy z nich, który ma komponent Rigidbody — z wyjątkiem samego gracza — otrzymuje impuls: power bezpośrednio od gracza, równolegle do podłoża, oraz lift w 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
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka