دفع الأشياء
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 41 من 60.
لا يدفع CharacterController أي شيء أبدًا: وجّهه نحو صندوق يحتوي على Rigidbody، وسيتوقف كما لو أنه اصطدم بجدار. بدلًا من ذلك، تستدعي Unity الدالة OnControllerColliderHit(ControllerColliderHit hit) في النصوص البرمجية الخاصة بالمتحكم نفسه، لكل مُصادم تلامسه حركة Move، بما في ذلك الأرضية، ويحدد النص البرمجي ما يحدث. يشير hit.collider إلى ما تم لمسه، ويشير hit.moveDirection إلى اتجاه حركة Move التي لامسته، ويشير hit.normal إلى الاتجاه الذي يواجهه سطحه عند نقطة التلامس. هذا هو نص الدفع البرمجي الخاص بـ Unity:
public float pushPower = 2f;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic) return; // لا يوجد شيء لدفعه
if (hit.moveDirection.y < -0.3f) return; // إنه تحت أقدامنا
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
body.linearVelocity = pushDir * pushPower;
}لكل return سبب. لا تحتوي الأرضية والجدران على Rigidbody، لذا تكون قيمة body null بالنسبة إليها، كما أنها تُلمَس في كل حركة Move تقريبًا. يتحرك الجسم الحركي فقط عندما يحرّكه نصه البرمجي الخاص، لذا لا تؤثر فيه السرعة. حركة Move المتجهة بشدة إلى الأسفل قد لمست شيئًا تحت القدمين، ولا ينبغي دفع الصندوق الذي يقف عليه اللاعب.
يحتفظ اتجاه الدفع بـ x وz فقط، لذا ينزلق الصندوق على الأرض بدلًا من الضغط عليه. إن تعيين linearVelocity، بدلًا من إضافة قوة، يجعل الصندوق الخفيف والثقيل يتحركان بالسرعة نفسها؛ أما body.AddForce(pushDir * pushPower, ForceMode.Impulse) فسيدفع الصندوق الثقيل بدرجة أقل.
التحدي
متوسطاجعل اللاعب يركل الكرات التي يصطدم بها أثناء سيره.
- في
Kicker.cs، اكتبvoid OnControllerColliderHit(ControllerColliderHit hit)واحصل علىRigidbody body = hit.collider.attachedRigidbody;. - استخدم
returnعندما تكونbodyفارغة أو حركية، أو عندما يكونhit.moveDirection.y < -0.3f(كرة تحت القدمين). - اضبط
body.linearVelocityعلى اتجاه الحركة مع قيمة y تساوي 0، مضروبًا فيkickPower، مضافًا إليهVector3.up * lift.
اضغط على «العب» وامشِ نحو الكرة الحمراء: ستطير إلى الأمام وإلى الأعلى. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
public class Kicker : MonoBehaviour
{
public float kickPower = 6f;
public float lift = 4f;
// اركل الكرات التي يصطدم بها اللاعب أثناء سيره
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك8متحكّم الشخصية
CharacterController.Moveتطبيق الجاذبية يدويًاالقفزدفع الأشياءالتحرّك في اتجاه النظرمراجعة: القفزة المزدوجة6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity