Atak obszarowy
Lekcja 14 z 18 w kursie Gra Unity: Obrona wieżowa w Coddy.
Pocisk działa Cannon eksploduje w miejscu lądowania i rani każdego wroga w pobliżu wybuchu, nie tylko swój cel. Physics.OverlapSphere(center, radius) zwraca każdy collider w odległości radius od center: wrogów, ale też podłoże i ścieżkę. Każdy collider, który ma IDamageable, otrzymuje obrażenia. Cel jest jednym z nich, ponieważ pocisk ląduje na nim, więc nie może otrzymać obrażeń po raz drugi osobno. Bomba, która odrzuca wszystkie skrzynie wokół siebie:
void Explode()
{
foreach (Collider other in Physics.OverlapSphere(transform.position, blastRadius))
{
if (other.TryGetComponent(out Rigidbody body))
{
Vector3 away = (body.position - transform.position).normalized;
body.AddForce(away * push, ForceMode.Impulse);
}
}
}Promień rażenia to dana działa Cannon, więc pocisk potrzebuje teraz czegoś więcej niż tylko wartości obrażeń: Launch przyjmuje także TowerData wieży. Promień rażenia strzały Arrow wynosi 0, więc jej pociski nadal trafiają tylko w swój cel. Obrażenia pozostają osobnym argumentem, ponieważ zależą od poziomu wieży.
Wybuch pokazuje graczowi, gdzie eksplodował pocisk: przezroczysta kula o szerokości równej promieniowi rażenia, która znika po ćwierci sekundy. Destroy(blast, 0.25f) niszczy ją po tym czasie, bez potrzeby używania własnego timera.
Wyzwanie
Średni- W
TowerDatadodaj publiczną zmienną typu floatsplashRadius: 0 oznacza brak obrażeń obszarowych. CannonData ustawia wartość 1.5. - Zmień
Projectile.LaunchnaLaunch(Transform target, int damage, TowerData data)i zachowaj dane. WTowerprzekaż dane wieży. - Po dotarciu, gdy promień obrażeń obszarowych określony w danych jest większy od 0, każdy collider w tym promieniu od miejsca trafienia, który ma IDamageable, otrzymuje obrażenia; cel również, tylko raz. Następnie pokaż wybuch: utwórz instancję serializowanego
blastPrefab(GameObject) w miejscu trafienia, przeskaluj go doVector3.one * data.splashRadius * 2fi zniszcz po 0.25 sekundy. Gdy nie ma obrażeń obszarowych, obrażenia otrzymuje tylko cel, jak wcześniej.
Prefab CannonBall ma Blast w swoim blastPrefab. Naciśnij Play, umieść Cannon tam, gdzie gromadzą się przeciwnicy, a następnie kliknij Check.
Spróbuj swoich sił
using UnityEngine;
public class Projectile : MonoBehaviour
{
[SerializeField] private float speed = 12f;
private Transform target;
private int damage;
public void Launch(Transform target, int damage)
{
this.target = target;
this.damage = damage;
}
void Update()
{
if (target == null)
{
Destroy(gameObject);
return;
}
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
if (transform.position == target.position)
{
if (target.TryGetComponent(out IDamageable damageable))
{
damageable.TakeDamage(damage);
}
Destroy(gameObject);
}
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.