Zielen
Lektion 8 von 18 im Kurs Unity-Spiel: Tower Defense von Coddy.
Ein Turm dreht sich zu seinem Ziel: nicht der ganze Turm, der auf seiner Plattform steht, sondern sein Kopf, ein untergeordnetes Objekt, das den Lauf trägt. Wenn sich ein untergeordnetes Objekt dreht, dreht sich alles unter ihm mit, während das übergeordnete Objekt unverändert bleibt.
Die Gegner bewegen sich tiefer als die Köpfe, daher zeigt die Richtung vom Kopf zu seinem Gegner ein wenig nach unten, und ein Kopf, der direkt dorthin blicken würde, würde sich nach vorne neigen. Wenn du den Wert y der Richtung auf 0 setzt, bleibt sie waagerecht, sodass sich der Kopf nur um die vertikale Achse dreht. Eine Leuchtturmlampe, die einem Schiff folgt:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) ist die Drehung, die in diese Richtung blickt, sodass sich die Lampe sofort zum Schiff dreht. Ein Turmkopf sollte sich stattdessen mit einer bestimmten Geschwindigkeit drehen: Quaternion.RotateTowards(from, to, maxDegrees) aus dem Kapitel „Drehungen“ dreht sich um höchstens maxDegrees, und eine Drehgeschwindigkeit in Grad pro Sekunde multipliziert mit Time.deltaTime ergibt den Anteil für jeden Frame.Aufgabe
Mittel- Füge in
Towerzwei serialisierte Felder hinzu:head(ein Transform) undturnSpeed(ein float, Grad pro Sekunde). Das ArrowTower-Prefab weist seinem ArrowHead-Kindobjekt den Wert 270 zu. - Solange der Turm ein Ziel hat, drehe den Kopf nur um die vertikale Achse auf das Ziel zu, und zwar höchstens mit
turnSpeedGrad pro Sekunde. - Ohne Ziel lässt du den Kopf so, wie er ist.
Drücke Play, baue Türme neben dem Weg und beobachte, wie sie den Gegnern folgen, dann Check.
Probier es selbst
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
public float range = 4f;
private Enemy target;
void Update()
{
target = FindTarget();
}
Enemy FindTarget()
{
Enemy nearest = null;
float nearestDistance = range;
foreach (Enemy enemy in Enemy.All)
{
float distance = Vector3.Distance(transform.position, enemy.transform.position);
if (distance <= nearestDistance)
{
nearest = enemy;
nearestDistance = distance;
}
}
return nearest;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.