Menu
CoddyTech

خط الرؤية

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

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

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

تسجّل كاميرا مراقبة على عمود العبارة I see you بينما تكون CanSee() صحيحة. عندما يكون الهدف في مكان مكشوف، تكون أول إصابة للشعاع هي الهدف. وعندما يكون الهدف خلف صندوق، يصيب الشعاع الصندوق أولًا، وتكون قيمة hit.transform هي قيمة الصندوق، وتكون الإجابة false. تُرجع Physics.Raycast بمفردها true للصندوق أيضًا، ولهذا تتم مقارنة الإصابة بالهدف.

يحتاج الهدف إلى مُصادم كي يعثر عليه الشعاع. ولا يحتاج الشعاع إلى اتجاه مُطبَّع، لأن طوله يأتي من maxDistance. تسأل Physics.Linecast(from, to) السؤال بالعكس، أي ما إذا كان أي مُصادم يقع بين نقطتين: تعني !Physics.Linecast(eye, target.position, wallMask) أنه لا يوجد جدار في الطريق.

challenge icon

التحدي

متوسط

لوّن الحارس بالأحمر ما دام يستطيع رؤية اللاعب، وإلا فبالأخضر.

  1. اكتب bool CanSee(): باستخدام Vector3 toPlayer = player.position - transform.position;، أعد false عندما يكون toPlayer.magnitude > range.
  2. ثم نفّذ Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) وأعد hit.transform == player؛ إذا لم يُصب الهدف، فأعد false.
  3. في Update()، عيّن لون البرج إلى Color.red أو Color.green استنادًا إلى CanSee().

اضغط «العب» وامشِ خلف الجدار. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // أحمر ما دام الحارس يستطيع رؤية اللاعب، وأخضر بخلاف ذلك.
    }
}

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

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