Advertisement
  1. Game Development
  2. Physics

كيفية فيكس المشتركة الفيزياء المشاكل في اللعبة

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

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

ونحن سوف دراسة وحل هذه المشاكل كما رأينا في الوحدة، مع التركيز على محرك الفيزياء 3D المدمج نفيديا فساكس، ولكن المبادئ الأساسية التي يمكن تطبيقها على أي محرك الفيزياء ومنصة أخرى.

ملاحظة: يمكن أن تجد تشكيلة واسعة من نماذج ثلاثية الأبعاد للحصول على أنك بدأت في Envato السوق.

عرض

يوضح هذا العرض التوضيحي معظم الأخطاء المذكورة في هذه المقالة في حالة غير صحيحة أو مكسورة، وفي حالة ثابتة:

الحجم العادي

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

حرف تحكم

ويبين هذا الجانب scroller لعبة بسيطة تعمل كما هو. البديل سيئة؛ Rigidbody & يظهر حرف تحكم معا نفس اللعبة، ولكن مع مكون Rigidbody يعلق على الحرف. لاحظ كيف يكسر ريجيدبودي سلوك 'تحكم الحرف'.

الكائنات مع بونسينيس

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

تعديل التحويل ريجيدبودي عدم مباشرة

في هذا السيناريو، يتم دفع كرة ثقيلة حتى منحدر باستخدام Rigidbody.AddForce(). في السيناريو الثاني، بدلاً من استخدام Rigidbody.AddForce() لتحريك الكرة حتى المنحدر، يستخدم Transform.position. نتيجة لاستخدام Transform.position أن تتحرك الكرة مرة أخرى إلى أسفل، يرجع ذلك إلى حقيقة أن ريجيدبودي ليس آخذا في الاعتبار بشكل صحيح سرعة التغيير ريجيدبودي، ولكن ثم تعديل موقف يسبب الكرة غضب صعودا وهبوطاً المنحدر.

الأخطاء الشائعة

مقياس غير صحيح

في معظم الألعاب، اللاعبين سوف نفترض أن حجم العالم relatable بمقياس للأرض. أنهم يتوقعون، على سبيل المثال، السقوط من برج مراقبة لعدو تقع بنفس المعدل أن تتصور على الأرض. إذا كان العدو يسقط ببطء شديد أو بسرعة كبيرة جداً، فإنه يمكن أن ينتقص من الغمر – لا سيما إذا كان العدو الحجم الإنسان!

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

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

يمكنك تحجيم الكائنات الخاصة بك بدقة أكثر بتجميعها في كائن فارغ واحد ، وقياس كائن واحد. على سبيل المثال، إعداد الجدول الكائن الأصل إلى 1.2 على كل محور سيزيد حجم كل كائن ضمن الكائن بنسبة 20%. يمكنك أيضا قياس الكائنات باستخدام أداة القياس بالضغط باستمرار على Ctrl-LMB (في Windows) أو Cmd-LMB (OS X) زيادات.

استخدام ريجيدبودي ووحدة تحكم حرف معا

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

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

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

تعديل التحويل ريجيدبودي بشكل مباشر

على عكس وحدة 'تحكم الطابع'، ليس ممارسة جيدة لتعيين موضع أو دوران ريجيدبودي، أو تغيير حجم كائن ريجيدبودي باستمرار (لمراقبة اللاعب وعلى هذا الأساس). بدلاً من ذلك، يجب عليك استخدام أساليب AddForce() و AddTorque() الموجودة في الفئة ريجيدبودي. أنها بخير لتعيين موضع وتناوب ريجيدبودي مباشرة إذا، على سبيل المثال، كنت التفريخ في الكائن لأول مرة، أو إعادة المشهد. في تلك الحالة فإنه سيكون على ما يرام، طالما هو لا تخترقها Rigidbody الكائنات الأخرى.

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

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

كائنات المتداول للأبد

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

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

كائنات بدون بونسينيس

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

تتمثل إحدى أفضل الطرق لحل هذه المشكلة في إنشاء مادة فيزياء افتراضية خاصة بك وتعيينها في Physics Manager عن طريق النقر فوق Edit> Project Settings> Physics.

Rigidbodies غرق جزئيا في الهندسة

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

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

كيفية تجنب الأخطاء

كتابة التعليمات البرمجية ريجيدبوديس (للمبرمجين)

إذا لم تكن مبرمجاً، كنت لا داعي للقلق حول السيناريو التالي. عند كتابة التعليمات البرمجية التي يتحرك، بالتناوب، أو جداول ريجيدبوديس، من المهم الحفاظ على هذا في حلقة فيكسيدوبداتي. كتابة هذه التعليمة البرمجية في حلقة التحديث يحتمل أن يؤدي إلى نتائج غير مستقرة، إذ يمكن استدعاء الدالة التحديث في 1000 هرتز، بينما محرك الفيزياء والدالة فيكسيدوبداتي كل تسمى بتردد 50 هرتز بشكل افتراضي.

يمكنك تغيير التردد في الفيزياء الخطوات عن طريق تغيير المعلمة تيميستيب الثابتة، وجدت في تحرير > إعدادات المشروع > الوقت. تحدد القيمة هو انتظر مقدار الوقت، بالثواني، بين كل تحديث الفيزياء أو خطوة. يمكنك العمل بالتردد بالهرتز بقسمة القيمة 1 (على سبيل المثال، يعني انتظار ثانية 0.01 1/0.01 = 100 هرتز). الأكثر تواترا بالخطوات، أكثر دقة وسوف تكون مستقرة المحاكاة. ومع ذلك، تحديد تواتر أعلى من وحدة المعالجة المركزية يمكن التعامل مع سيؤدي إلى محاكاة غير مستقرة جداً. حاول الحفاظ على تردد التحديث الثابت بين 30 هرتز و 100 هرتز.

بينما كان يعمل على تدمير إلى طريق مسدود، جريت إلى مشكلة الناجمة عن إنشاء مثيلات الطوب بعد أن دمرت قسما من الجدار. أنا ثابت هذه المسألة بوضع التعليمات البرمجية إشكالية فيCoroutine، ووضع السطر التالي قبل تدمير الكائن:

1
// Wait a frame

2
yield return null; // C#

3
4
yield; // UnityScript

في انتظار الإطار ، فإنه يضمن مزامنة المنطق في وقت التحديث ، بدلاً من FixedUpdate time. يبدو أن هذا يعني أن وظيفة التدمير يتم تنفيذها متزامنة مع حلقة التحديث.

نصيحة Bonus Unity: لا تستخدم مواد المواد الفيزيائية القياسية!

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

كل مادة لديها احتكاك ثابت وديناميكي متطابق. في العالم الحقيقي ، الأشياء التي تقف لا تزال لديها احتكاك أكثر قليلاً عندما تتحرك. معامل الاحتكاك للمواد المطاطية هو 1.0 ، وهو لا يشبه أي مطاط موجود في العالم الحقيقي. وإذا لم يكن ذلك سخيلاً بما فيه الكفاية ، فكل مادة لديها "نطاط" (باستثناء مادة ''Bouncy''). كل هذا يعني أن المواد لا تمثل حتى التمثيل القريب من واقع حياتهم النظير.

من الأفضل إنشاء المواد الفيزيائية الخاصة بك عند الضرورة. هناك الكثير من المواقع الإلكترونية التي تتشارك في الخصائص الفيزيائية للمواد - أهمها الاحتكاك الديناميكي والاحتكاك الساكن والاسترداد أو الارتداد.

استنتاج

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.