Viser
Leçon 8 sur 18 du cours Jeu Unity : défense de tours de Coddy.
Une tour se tourne vers sa cible : pas la tour entière, qui repose sur son socle, mais sa tête, un objet enfant qui porte le canon. Tourner un enfant fait tourner tout ce qui se trouve sous lui et laisse le parent tel quel.
Les ennemis marchent plus bas que les têtes, donc la direction d’une tête vers son ennemi pointe légèrement vers le bas, et une tête qui la suivrait droit devant basculerait vers l’avant. Mettre le y de la direction à 0 la maintient à l’horizontale : la tête tourne donc uniquement autour de l’axe vertical. Une lampe de phare qui suit un navire :
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) est la rotation qui fait face à cette direction, donc la lampe se tourne aussitôt vers le navire. La tête d’une tour devrait plutôt tourner à une certaine vitesse : Quaternion.RotateTowards(from, to, maxDegrees), présenté dans le chapitre sur les rotations, tourne d’au plus maxDegrees, et une vitesse de rotation en degrés par seconde multipliée par Time.deltaTime donne la part de chaque image.Défi
Moyen- Dans
Tower, ajoute deux champs sérialisés :head(un Transform) etturnSpeed(un float, en degrés par seconde). Le prefab ArrowTower fournit son enfant ArrowHead et la valeur 270. - Lorsque la tour a une cible, tourne la tête vers celle-ci, uniquement autour de l’axe vertical, à raison d’au maximum
turnSpeeddegrés par seconde. - Sans cible, laisse la tête telle quelle.
Appuie sur Play, construis des tours près du chemin et regarde-les suivre les ennemis, puis clique sur Check.
Essayez vous-même
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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.