CharacterController.Move
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 38 من 60.
CharacterController هو مكوّن Unity الخاص بالشخصية التي تمشي: كبسولة لا تتحرك إلا عندما يستدعي النص البرمجي الخاص بك controller.Move(motion). motion هي المسافة التي يجب قطعها في هذا الإطار، لذا فهي سرعة مضروبة في Time.deltaTime. تنزلق Move بالكبسولة بمحاذاة الجدران بدلًا من المرور عبرها، وتصعد المنحدرات حتى حدّ الميل الخاص بها (45 درجة)، وتخطو فوق الحواف حتى إزاحة الخطوة الخاصة بها (0.3 وحدة). وهي ليست Rigidbody: لا قوى، ولا جاذبية، ولا ارتداد، ولا شيء يدفعها. تتحرك تمامًا إلى المكان الذي يوجّهها إليه Move، وهذا ما تحتاج إليه أدوات التحكم الدقيقة في الألعاب.
إضافة الجاذبية إليك، وكذلك العثور على الأرض. تكون isGrounded صحيحة عندما لامست آخر Move شيئًا أسفلها، لذا فإن الحركة التي لا تتضمن جزءًا نحو الأسفل لا تعثر على الأرض أبدًا. لا تفعل Move الأقصر من الحد الأدنى لمسافة الحركة الخاصة بوحدة التحكم (0.001) أي شيء على الإطلاق، لذا فإن وحدة التحكم التي تتحرك جانبيًا فقط تُفيد بأنها غير مرتكزة على الأرض بمجرد أن تتوقف. يمشي هذا الساعي باستخدام مفاتيح الأسهم ويضغط إلى الأسفل قليلًا في كل حركة:
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // ادفع للأسفل دائمًا، حتى يُكتشف سطح الأرض
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}تحافظ الكبسولة على بُعد Skin Width (0.08) عن الأشياء التي تلامسها، لذا فإن وحدة تحكم يبلغ ارتفاعها وحدتين على أرضية عند y = 0 تستقر عند y = 1.08، لا عند 1. وتبدأ Move من الموضع الذي رصدت فيه الفيزياء وحدة التحكم آخر مرة، لذا يمكن التراجع عن تعيين transform.position عليها عند استدعاء Move التالي: لنقلها آنيًا، عيّن controller.enabled = false، وحرّكها، ثم فعّلها مجددًا.
التحدي
متوسطحرّك المستكشف باستخدام CharacterController الخاص به، لكي يوقفه الجدار.
- في
Update()، أنشئVector3 moveمنInput.GetAxisRaw("Horizontal")على المحور x ومنInput.GetAxisRaw("Vertical")على المحور z، ثم اضرب الناتج فيspeed. - عيّن
move.y = -fallSpeed;واستدعِcontroller.Move(move * Time.deltaTime);. - ثم عيّن
rend.material.colorإلىColor.greenعندما يكونcontroller.isGroundedصحيحًا، وإلا فعيّنه إلىColor.red.
اضغط «العب»، وامشِ نحو الجدار ثم تجاوز الحافة اليسرى: يسقط المستكشف باللون الأحمر ويهبط باللون الأخضر. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// حرّك المستكشف باستخدام controller.Move، ثم لوّنه بحسب isGrounded
}
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك8متحكّم الشخصية
CharacterController.Moveتطبيق الجاذبية يدويًاالقفزدفع الأشياءالتحرّك في اتجاه النظرمراجعة: القفزة المزدوجة6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity