Menu
CoddyTech
flag Ar iconالعربيةdown icon

مدى المدفع

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 61 من 63.

يقف مدفع عند أحد طرفي ميدان الرماية، وتنزلق ثلاثة أهداف من جانب إلى آخر عبر الميدان على مسافات مختلفة. أمل البندقية إلى الأعلى والأسفل للوصول إلى كل مسافة، وحدد توقيت كل طلقة بحيث تُطلق عندما يعبر هدفٌ خط النار. الكرة التي تصيب هدفًا تُخرجه من اللعبة وتُستهلك؛ أما أي شيء آخر يصطدم بهدف فيتركه دون أن يمسه. الأهداف أجسام حركية، لذا لا تدفعها الاصطدامات أبدًا، ويحمل المدفع خمس كرات.

اكتب نصين برمجيين: Cannon على السبطانة وTarget على كل هدف.

challenge icon

التحدي

صعب

يمنح Inspector مكوّن Cannon القيمة ballPrefab (وهو Rigidbody: قالب الكرة، كتلته 2، ووسمه Ball)، وangle (30)، وturnSpeed (40)، وpower (30)، وballs (5).

  • يرفع السهم للأعلى قيمة angle ويخفضها السهم للأسفل، بمعدل turnSpeed درجة في الثانية، من دون أن تقل عن 10 أو تزيد على 60. في كل إطار، اضبط دوران السبطانة إلى Quaternion.Euler(-angle, 0, 0): في Unity، تجعل زاوية x موجبة المقدمة تميل إلى الأسفل، لذا فإن إشارة الطرح تجعلها تميل إلى الأعلى.
  • يطلق مفتاح المسافة كرة ما دامت قيمة balls أكبر من 0: أنشئها على بُعد وحدة واحدة أمام مركز السبطانة، بمحاذاة السبطانة، وادفعها بقوة Impulse مقدارها power بمحاذاة السبطانة، وأنقص balls بمقدار 1 وسجّل العدد المتبقي، مثل Balls left: 4. إذا لم تبقَ أي كرات، فلن يفعل مفتاح المسافة شيئًا.

لكل هدف مكوّن Rigidbody حركي، ويحدّد Inspector لمكوّن Target قيمتي speed وrange (2 و3 للهدف Target1).

  • في كل خطوة فيزيائية، حرّك الهدف على محور x باستخدام MovePosition بسرعة speed وحدة في الثانية، وغيّر اتجاهه كلما ابتعد بمقدار range عن موضع بدايته.
  • عندما تصطدم كرة (تحمل الوسم Ball) بالهدف، سجّل اسم الهدف وhit!، مثل Target2 hit!، ثم أتلف الهدف والكرة معًا. أما أي شيء ليس كرة فلا يؤثر فيه.

اضغط Play وأسقط الأهداف الثلاثة، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

public class Cannon : MonoBehaviour
{
    [SerializeField] private Rigidbody ballPrefab;
    [SerializeField] private float angle = 30f;
    [SerializeField] private float turnSpeed = 40f;
    [SerializeField] private float power = 30f;
    [SerializeField] private int balls = 5;

    void Update()
    {
        // صوّب باستخدام سهمَي الأعلى والأسفل، وأطلق النار باستخدام Space
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الفيزياء وأسلوب اللعب