Zasięg armaty
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 61 z 63.
Armata stoi na jednym końcu strzelnicy, a trzy cele przesuwają się z boku na bok w poprzek strzelnicy, w różnych odległościach. Przechylaj lufę w górę i w dół, aby dosięgnąć każdej odległości, i oddawaj strzały w chwili, gdy cel przecina linię ognia. Kula, która trafi w cel, niszczy go i zostaje zużyta; wszystko inne, co uderzy w cel, pozostawia go w spokoju. Cele są ciałami kinematycznymi, więc trafienia nigdy ich nie popychają, a armata ma pięć kul.
Napisz dwa skrypty: Cannon dla lufy i Target dla każdego celu.
Wyzwanie
TrudnyInspector przypisuje Cannon wartość ballPrefab (prefab Ball typu Rigidbody, masa 2, z tagiem Ball), angle (30), turnSpeed (40), power (30) i balls (5).
- Strzałka w górę zwiększa
angle, a strzałka w dół go zmniejsza z szybkościąturnSpeedstopni na sekundę, nigdy poniżej 10 ani powyżej 60. W każdej klatce ustaw obrót lufy naQuaternion.Euler(-angle, 0, 0): w Unity dodatni kąt x kieruje przód w dół, więc znak minus kieruje go w górę. - Spacja wystrzeliwuje kulę, jeśli
ballsjest większe od 0: utwórz ją 1 jednostkę przed środkiem lufy, wzdłuż lufy, nadaj jej impuls o wartościpowerwzdłuż lufy, odejmij 1 odballsi wyświetl pozostałą liczbę, na przykładBalls left: 4. Gdy nie ma już kul, spacja nic nie robi.
Każdy cel ma kinematyczny komponent Rigidbody, a Inspector przypisuje Target wartości speed i range (odpowiednio 2 i 3 dla Target1).
- W każdym kroku fizyki przesuwaj cel wzdłuż osi x za pomocą
MovePositionz szybkościąspeedjednostek na sekundę, zawracając go za każdym razem, gdy oddali się orangejednostek od miejsca, w którym się rozpoczął. - Gdy kula (z tagiem
Ball) uderzy w cel, wyświetl nazwę celu ihit!, na przykładTarget2 hit!, a następnie zniszcz zarówno cel, jak i kulę. Wszystko, co nie jest kulą, pozostawia cel bez zmian.
Naciśnij Play i zestrzel wszystkie trzy cele, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public class Cannon : MonoBehaviour
{
[SerializeField] private Rigidbody ballPrefab;
[SerializeField] private float angle = 30f;
[SerializeField] private float turnSpeed = 40f;
[SerializeField] private float power = 30f;
[SerializeField] private int balls = 5;
void Update()
{
// Celuj strzałkami w górę i w dół, strzelaj klawiszem Space
}
}
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