مطاردة اللاعب
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 50 من 63.
يحتاج العدو الذي يطارد اللاعب إلى 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 نفسها بدلًا من ذلك: إذ يكتسب السرعة، ويحافظ على زخمه، ويتجاوز اللاعب عندما يخطو جانبًا. تجنّب تحريك Transform الخاص بالمطارد: فهذا يضعه داخل الجدار بسهولة كما يضعه في أي مكان آخر، ولا تستطيع محاكاة الفيزياء إلا دفعه إلى الخارج بعد ذلك.
التحدي
متوسطتتدحرج صخرة خلف اللاعب. اكتب سكربت Boulder على الصخرة، وهي كرة عليها Rigidbody. يزوّدها Inspector بـ player (اللاعب) وforce (6). سكربت Player جاهز: تحرّك الأسهم اللاعب.
- في كل خطوة فيزيائية، ادفع الصخرة نحو اللاعب باستخدام
AddForce، بقوة مقدارهاforceسواء كان اللاعب قريبًا أم بعيدًا. - ادفعها على الأرض فقط، من دون أي حركة إلى أعلى أو أسفل، حتى عندما يقف اللاعب على الحافة.
- لا تحرّك Transform الخاص بها ولا تجمّد دورانها: فالاحتكاك يجعلها تتدحرج.
اضغط Play، واركض في دوائر حول الصخرة، ثم اضغط Check.
جرّب بنفسك
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 للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق