Menu
CoddyTech

المطاردة ضمن النطاق

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

تتركك معظم الأعداء وشأنك حتى تقترب منهم. قِس المسافة إلى اللاعب في كل خطوة فيزيائية، ولا تطارده إلا ضمن نطاق محدد. يطارد هذا الوحل اللاعب ضمن sightRange ويظل ساكنًا خارجه:

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

إن else مهمة: يحتفظ الجسم الصلب بسرعته حتى يغيّرها شيء ما. من دونها، يواصل الوحل الذي يفقدك الانزلاق حتى يوقفه الاحتكاك، أما على الجليد فلا يتوقف أبدًا. وبما أن قيمة y ضُبطت على 0 أولًا، فإن toPlayer.magnitude تمثل المسافة على الأرض، لذا يُعدّ اللاعب الواقف على صندوق بجوار الوحل واقفًا بجواره أيضًا.

للنطاق الواحد نقطة ضعف. فاللاعب الواقف عند حدوده يتحرك إلى داخله وخارجه، ويبدأ الوحل ويتوقف مرارًا. تتجنب الأعداء ذلك باستخدام نطاقين: تلاحظ اللاعب ضمن نطاق قصير، ولا تستسلم إلا عندما يتجاوز نطاقًا أطول. وتتذكر bool ما إذا كان العدو يطارد اللاعب، وبين النطاقين لا يتغير شيء فيها، لذا يواصل العدو ما كان يفعله.

challenge icon

التحدي

متوسط

اجعل الذئب ينتبه إلى اللاعب عندما يكون قريبًا، ويتخلى عن مطاردته عندما يكون بعيدًا.

  1. في FixedUpdate()، احسب المسافة الأفقية إلى اللاعب: إذا كانت أقل من noticeRange، فعيّن الحقل bool chasing إلى true؛ وإذا كانت أكبر من giveUpRange، فعيّنه إلى false.
  2. أثناء chasing، عيّن rb.linearVelocity ليتجه نحو اللاعب بسرعة speed، مع الحفاظ على قيمة y.
  3. وإلا، عيّن rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

اضغط على «العب»، واقترب من الذئب ثم اركض. بعد ذلك اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // لاحظ اللاعب، وتوقّف عن ملاحقته، ثم طارده أو ابقَ ساكنًا
    }
}

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

تدرّب بنفسك: Playground لـ Unity