التصويب
الدرس 10 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يدور البرج لمواجهة هدفه: ليس البرج كله، الذي يستقر على قاعدته، بل رأسه، وهو كائن فرعي يحمل السبطانة. يؤدي تدوير كائن فرعي إلى تدوير كل ما تحته، مع إبقاء الكائن الأب كما هو.
تسير الأعداء على مستوى أدنى من الرؤوس، لذا يشير الاتجاه من الرأس إلى عدوه إلى أسفل قليلًا، وإذا نظر الرأس مباشرةً في ذلك الاتجاه فسيميل إلى الأمام. إن ضبط y للاتجاه على 0 يبقيه أفقيًا، بحيث يدور الرأس حول المحور الرأسي فقط. مصباح منارة يتبع سفينة:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) هو الدوران الذي يواجه ذلك الاتجاه، لذا يتجه المصباح نحو السفينة فورًا. أما رأس البرج، فينبغي أن يدور بسرعة محددة: تدير Quaternion.RotateTowards(from, to, maxDegrees) من فصل الدوران بحد أقصى قدره maxDegrees، وتعطي سرعة دوران بالدرجات في الثانية مضروبة في Time.deltaTime نصيب كل إطار.التحدي
متوسطأدِر رأس كل برج ليواجه هدفه.
- في
Tower، أضِف[SerializeField] private Transform head;و[SerializeField] private float turnSpeed = 270f;. - عند وجود هدف، أدر
headنحوه حول المحور y فقط، بحد أقصىturnSpeed * Time.deltaTimeدرجة، باستخدامQuaternion.RotateTowards. - أطلِق من فوهة المدفع:
head.position + head.forward * 0.6f.
اضغط «العب»: ستتبع الرؤوس الأعداء وتطلق النار من فوهة المدفع. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
public class Tower : MonoBehaviour
{
public float range = 4f;
public int damage = 2;
[SerializeField] private Projectile projectilePrefab;
private Enemy target;
private float nextShot;
void Update()
{
Enemy found = FindTarget();
if (found != null && found != target)
{
Debug.Log("Target: " + found.name);
}
target = found;
if (target == null)
{
return;
}
if (Time.time >= nextShot)
{
Fire();
nextShot = Time.time + 1f;
}
}
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;
}
void Fire()
{
Projectile shot = Instantiate(projectilePrefab, transform.position + Vector3.up, Quaternion.identity);
shot.Launch(target.transform, damage);
}
}
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity