Menu
CoddyTech

معدل إطلاق النار

الدرس 11 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.

يطلق كل برج طلقة واحدة في الثانية. ينبغي أن يطلق برج السهم الطلقات بسرعة أكبر، أما المدفع، الذي سيأتي لاحقًا، فينبغي أن يطلقها ببطء أكبر، لذا يصبح المعدل حقلًا: عدد الطلقات في الثانية. الوقت بين طلقتين هو 1 مقسومًا على المعدل:

nextShot = Time.time + 1f / 4f; // 4 طلقات في الثانية: بفاصل 0.25 ثانية بين كل طلقتين

يضبط القالب الجاهز ArrowTower معدله على 1.5: طلقة كل 0.67 ثانية.

challenge icon

التحدي

سهل

اجعل كل برج يطلق النار بمعدله الخاص.

  1. في Tower، أضف public float fireRate = 1.5f; (طلقات في الثانية).
  2. بعد إطلاق طلقة، عيّن 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