معدل إطلاق النار
الدرس 11 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يطلق كل برج طلقة واحدة في الثانية. ينبغي أن يطلق برج السهم الطلقات بسرعة أكبر، أما المدفع، الذي سيأتي لاحقًا، فينبغي أن يطلقها ببطء أكبر، لذا يصبح المعدل حقلًا: عدد الطلقات في الثانية. الوقت بين طلقتين هو 1 مقسومًا على المعدل:
nextShot = Time.time + 1f / 4f; // 4 طلقات في الثانية: بفاصل 0.25 ثانية بين كل طلقتينيضبط القالب الجاهز ArrowTower معدله على 1.5: طلقة كل 0.67 ثانية.
التحدي
سهلاجعل كل برج يطلق النار بمعدله الخاص.
- في
Tower، أضفpublic float fireRate = 1.5f;(طلقات في الثانية). - بعد إطلاق طلقة، عيّن
nextShot = Time.time + 1f / fireRate;.
اضغط على «العب»: تطلق أبراج الأسهم ثلاث طلقات كل ثانيتين. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
public class Tower : MonoBehaviour
{
public float range = 4f;
public int damage = 2;
[SerializeField] private Transform head;
[SerializeField] private float turnSpeed = 270f;
[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;
}
Aim();
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 Aim()
{
Vector3 direction = target.transform.position - head.position;
direction.y = 0f;
Quaternion look = Quaternion.LookRotation(direction);
head.rotation = Quaternion.RotateTowards(head.rotation, look, turnSpeed * Time.deltaTime);
}
void Fire()
{
Projectile shot = Instantiate(projectilePrefab, head.position + head.forward * 0.6f, Quaternion.identity);
shot.Launch(target.transform, damage);
}
}
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity