مطاردة اللاعب
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 52 من 71.
يحتاج العدو الذي يطارد اللاعب إلى Rigidbody، لكي توقفه الجدران ويتمكن من الدفع والتعرّض للدفع. المطاردة نفسها عبارة عن سرعة موجّهة نحو اللاعب، تُحدَّد مرة واحدة في كل خطوة فيزيائية. يسير هذا الزومبي نحو أي شيء موجود في خانة player لديه:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}يشير player.position - rb.position من الزومبي إلى اللاعب. تُضبط قيمة y فيه على 0 لكي يسير الزومبي على مستوى أفقي عندما يقف اللاعب في مكان أعلى أو أدنى، وتعطيه normalized طولًا يساوي 1، لذا يسير الزومبي بسرعة speed سواء كان اللاعب على بُعد وحدتين أو 20 وحدة. تحافظ السرعة الجديدة على سرعة y القديمة، لذا تواصل الجاذبية سحب الزومبي إلى أسفل عن حافة الدرجة. تم تفعيل Freeze Rotation في Rigidbody الخاص به، لذا لا ينقلب أثناء سيره.
تجعل السرعة التي تحددها العدو السائر يبدأ الحركة ويغيّر اتجاهه فورًا. أما العدو الثقيل، مثل البرميل المتدحرج، فيُدفَع باستخدام AddForce داخل FixedUpdate نفسها بدلًا من ذلك: يكتسب السرعة ويحافظ على زخمه ويتجاوز الهدف عندما يخطو اللاعب جانبًا.
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);تجنّب تحريك Transform الخاص بالعدو المطارد: فهذا يضعه داخل جدار بسهولة كما يضعه في أي مكان آخر، ولا يستطيع محرك الفيزياء سوى دفعه إلى الخارج بعد ذلك.
التحدي
متوسطاجعل الصخرة تتدحرج خلف اللاعب.
- في
FixedUpdate()، عيّنVector3 toPlayer = player.position - rb.position;وtoPlayer.y = 0f;، لكي تبقى الدفعة على امتداد الأرض. - استدعِ
rb.AddForce(toPlayer.normalized * force);، لتكون الدفعة نفسها سواء كان قريبًا أم بعيدًا. اترك دورانها حرًا، لكي يجعلها الاحتكاك تتدحرج.
اضغط «العب» واركض في دوائر حول الصخرة. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// ادفع الصخرة باتجاه اللاعب على طول الأرض
}
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity