القائمة الرئيسية

الصفحات

Unity Game Engine:استخدام RigidBody لتحريك كائن اللعبة

Unity Game Engine:استخدام RigidBody لتحريك كائن اللعبة

Unity Game Engine:استخدام RigidBody لتحريك كائن اللعبة

Unity: استخدام طريقة ()AddForce RigidBody لتحريك كائن اللعبة
هناك طريقتان رئيسيتان لتحريك كائن اللعبة في Unity:

1- تغيير تنسيق الموقع:
 عن طريق التغيير المباشر لموضع كائن gameObject دون اعتبار كبير
 لفيزياءه أو مكونات أخرى من هذا القبيل. 
هذا ما كنا نفعله حتى الآن ، ببساطة عن طريق إضافة قيمة إلى موضع الكائن في X كل إطار.

2- فيزياء الجسم الصلب: 
عند التعامل مع الأشياء التي تتبع قواعد الفيزياء 
، فمن المنطقي تطبيق القوى على الأشياء أو تغيير سرعتها 
بدلاً من تحديث الموقع المباشر. تبدو أكثر واقعية.
سنغطي في هذا المقال التعليمي مثالًا مثيرًا للاهتمام لاستخدام فيزياء الجسم الصلب
 للحركة بدلاً من خدعة تغيير الموقع.
 لقد عملنا مع إطلاق الرصاص حتى الآن ، أليس كذلك؟ لكن رصاصاتنا انتقلت فقط 
باستخدام تغيير المركز بغض النظر عن ماهيتها وكيفية تحركها في العالم الحقيقي.
مما يؤدي أيضًا إلى مشكلات مثل تلك التي استمرت فيها الرصاصة لدينا 
حتى بعد أن تصل إلى الهدف (راجع دروسنا السابقة للحصول على المثال) .
إنها ببساطة لم تكن تعلم أنه كان من المفترض أن تتوقف ،
 بعد إصابة الهدف ، لأننا برمجناها لتستمر في الاتجاه الصحيح.
بدلاً من القيام بذلك ، ماذا لو طبقنا قوة اندفاعية قوية جدًا على الرصاصة ،
 مثل تلك الموجودة في الحياة الواقعية؟ 
سيؤدي القيام بذلك إلى جعل الرصاصة تتحرك بسبب زخمها ،
 وليس بسبب تحديث موقع مبرمج.
دعنا نستكشف هذا الخيار ، وسنفهم ()AddForce التي يوفرها الفصل Rigidbody. 
افتح النص الذي يحدد سلوك الرصاصة / كرة النار لدينا:





using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireballBehaviour : MonoBehaviour
{
    private float fireballXValue;
    public float fireballSpeed;
    
    void Start()
    {
        // getting the initial position where prefab is created
        fireballXValue = gameObject.transform.position.x;
    }
    
    // Update is called once per frame
    void Update() 
    {
        // adding speed value to the X axis position
        // value
        fireballXValue += fireballSpeed;
        // setting new X value to position
        gameObject.transform.position = new Vector2(fireballXValue, gameObject.transform.position.y);
        }
    }

}


منذ الكثير من كل شيء جميل كتبنا في هذه الصفقات النصي مع حركة بتغير الموقف، 
دعونا كل شيء واضح حتى لذلك لدينا نظيفة ()Start و ()Update طرق مرة أخرى.





using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireballBehaviour : MonoBehaviour
{
    private float fireballXValue;
    public float fireballSpeed;
    
    void Start()
    {
        
    }
    
    // Update is called once per frame
    void Update() 
    {
        
    }

}


السيطرة على GameObjects باستخدام المكونات

نحن نعلم الآن أنه يمكننا الوصول إلى كائن gameObject في 
البرنامج النصي المرفق به باستخدام المرجع gameObject.
أيضًا ، يمكننا الوصول إلى المكونات (مثل RigidBody و Collider وغيرها) 
المرفقة بجسم gameObject باستخدام GetComponent الوظيفة.
بينما في السابق ، اعتدنا على تحديث خاصية أي مكون باستخدام طريقة العرض المراقب .
 هنا ، سنحاول القيام بذلك من داخل النص.
أولاً ، لا يزال يتعين علينا التصريح عن Rigidbody2D المتغير ، ولكن بدلاً من
 إنشاءه public، دعنا نجعله private بدلاً من ذلك.





private RigidBody2D fireballBody;


الآن ، في ()Start الطريقة ، سنضيف السطر التالي:

void Start()
{
    fireballBody = GetComponent();
}


إذن ماذا يفعل هذا الخط؟ 
يعتبر هذا السطر من التعليمات البرمجية ، بطريقة ما ، طريقة تلقائية لاكتشاف المتغير وتعيينه. 
من خلال استدعاء GetComponent الطريقة ، فإننا ببساطة نخبر Unity
 بالمضي قدمًا واكتشاف نوع المكون المحدد في أقواس
 الزاوية <>الخاصة بـ gameObject الخاص بنا.
 في حالتنا ، نريد أن يكتشف البرنامج النصي مكون Rigidbody2D ،
 لذلك سنضع ذلك داخل أقواس الزاوية. 
لا تحتوي هذه الطريقة على أي حمولات زائدة (متغير).

إضافة السرعة والقوة إلى مكون RigidBody

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




مضيفا velocity الممتلكات


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireballBehaviour : MonoBehaviour
{
    private RigidBody2D fireballBody;
    public float speed;
    
    void Start()
    {
        fireballBody = GetComponent();
        
        // velocity is a property of RigidBody2D
        fireballBody.velocity = new Vector2(speed, 0);
    }
    
    // Update is called once per frame
    void Update() 
    {
        
    }

}



انتظر لحظة! لقد أضفت fireballBody.velocity الكود إلى
 ()Start الطريقة ، وليس ()Update الطريقة. 
لفهم هذا ، لنأخذ مثالاً. تخيل أن والدتك تطلب منك تغيير المصباح الكهربائي في المطبخ. 
تقول ، "بالتأكيد ، سأفعل ذلك" ، وتقوم بذلك لاحقًا (أو لا تفعل ذلك ، كما هو الحال مع معظمنا). 
الآن تخيل أن والدتك تطلب منك تغيير المصباح ، 60 مرة في الثانية لبقية حياتك 
سواء قمت بتغيير المصباح أم لا. 
مرعب قليلاً ، أليس كذلك؟ نحن نفعل الشيء نفسه تمامًا هنا ، في Unity. 
إذا قمنا بتعيين السرعة في طريقة ()Start ، 
فإننا ببساطة نطلب من اللعبة تغيير السرعة مرة واحدة ثم المضي قدمًا.
ولكن إذا كتبنا نفس الرمز في طريقة ()Update ، فسنطلب من Unity 
تعيين سرعة Rigidbody للقيم المحددة مرارًا وتكرارًا.
 نظرًا لأن قيمنا لا تتغير في الوقت الحالي ، فنحن لا نخبر البرنامج النصي
 بالضرورة بتعيين القيمة لشيء تم إنجازه بالفعل.
اضافة القوة باستخدام ()AddForce 
الآن ، دعنا نستكشف طريقة إضافة قوة إلى كائن gameObject.



الطريق الصحيح للتحرك

تتطلب المعلمة الأولى للطريقة ()AddForce ببساطة Vector2 
معرفة الاتجاه الذي تريد تطبيق القوة فيه.
 على سبيل المثال ، new Vector2(4, 5) ستطبق القوة المستخدمة قوة مقدارها 
4 وحدات أفقيًا لليمين و 5 وحدات عموديًا لأعلى .

المعلمة الثانية أكثر إثارة للاهتمام قليلاً. 
سترى أن المعلمة الثانية الإضافية عبارة عن تعداد مسمى ForceMode2D.
 ForceMode2D هو زوج من الأوضاع لتطبيق قوة على كائن gameObject.
 تتم تسمية هذه الأوضاع القوة و الاندفاع .
 بناءً على نوع القوة التي تريد تطبيقها ، إما أن تدخل 
ForceMode2D.Force (لتطبيق قوة ثابتة ومتسقة) أو
 ForceMode2D.Impulse (لتطبيق قوة ضاربة لحظية).

بالنسبة للسيناريو الخاص بنا ، نريد تطبيق قوة هائلة ومفاجئة 
على كرة النار لدينا حتى تنطلق للأمام.
 إن تطبيق قوة ثابتة سيجعلها تتسارع من سرعة بطيئة ، والتي قد تبدو غريبة نوعًا ما.




using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FireballBehaviour : MonoBehaviour
{
    private RigidBody2D fireballBody;
    public float speed;
    
    void Start()
    {
        fireballBody = GetComponent();
        
        // AddForce is a function of RigidBody2D
        fireballBody.AddForce(new Vector2(speed, 0), ForceMode2D.Impulse);
    }
    
    // Update is called once per frame
    void Update() 
    {
        
    }

}


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

جدول المحتويات