كود الحركة "2D" في يونيتي

Ultra Sonk
By -
0

تشريح حركة الشخصيات ثنائية الأبعاد في Unity: دليل المطور المحترف

في قلب كل لعبة ثنائية الأبعاد ناجحة تكمن آلية حركة سلسة ومستجيبة. إن "الإحساس باللعبة" (Game Feel) يعتمد بشكل كبير على كيفية تفاعل اللاعب مع العالم الرقمي. هذا الدليل لا يقتصر على تقديم كود للحركة، بل يغوص في المفاهيم الأساسية والممارسات المثلى لبناء نظام حركة احترافي في Unity.


1. فلسفة الحركة: لماذا نستخدم Rigidbody2D؟

قبل كتابة أي سطر برمجي، يجب أن نفهم الأدوات التي يوفرها Unity. للتحكم في الحركة، هناك طريقتان أساسيتان: التلاعب المباشر بالـ `Transform`، أو استخدام محرك الفيزياء عبر مكون `Rigidbody2D`.

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

قاعدة أساسية: إذا كان الكائن الخاص بك يحتاج إلى الاصطدام بأشياء أخرى، فاستخدم دائمًا `Rigidbody2D` للتحكم في حركته.


سنقوم الآن ببناء سكربت حركة احترافي يسمح بالتحرك في ثمانية اتجاهات باستخدام مدخلات اللاعب (WASD أو مفاتيح الأسهم).

الخطوة 1: إعداد المشهد (Scene Setup)

  1. أنشئ مشروع 2D جديد في Unity.
  2. في المشهد، أنشئ كائنًا جديدًا (Create > 2D Object > Sprites > Square) وسمّه "Player".
  3. أضف مكون `Rigidbody2D` إلى الـ "Player" (Add Component > Physics 2D > Rigidbody 2D).
  4. نقطة احترافية: في مكون `Rigidbody2D`، اضبط قيمة `Gravity Scale` إلى 0 لمنع الشخصية من السقوط، واضبط `Collision Detection` إلى `Continuous` لتجنب اختراق الأجسام السريعة للجدران.

الخطوة 2: كتابة الكود (The Script)

أنشئ سكربت C# جديدًا باسم `PlayerController` وأرفقه بكائن "Player". الصق الكود التالي بداخله:


using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class PlayerController : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 5f;

    private Rigidbody2D rb;
    private Vector2 movementInput;

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");
        movementInput = new Vector2(moveX, moveY).normalized;
    }

    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + movementInput * moveSpeed * Time.fixedDeltaTime);
    }
}
    

3. ما وراء الأساسيات: مفاهيم احترافية

تطبيع المتجهات (Vector Normalization)

لاحظ استخدام .normalized في الكود. هذه الخطوة ضرورية لمنع الحركة القطرية من أن تكون أسرع من الحركة الأفقية أو العمودية. إنها تضمن أن طول متجه الحركة دائمًا يساوي 1.

Update مقابل FixedUpdate

يجب دائمًا قراءة المدخلات في `Update` لأنها تستجيب بشكل فوري لكل إطار. بينما يجب تطبيق العمليات الفيزيائية في `FixedUpdate` لأنها متزامنة مع دورة محرك الفيزياء، مما يمنع السلوك المتقطع (Jitter).


الخاتمة: الحركة هي البداية فقط

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

إرسال تعليق

0تعليقات

إرسال تعليق (0)