التحرّك في اتجاه النظر
جزء من قسم بناء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 41 من 56.
عندما تنظر الكاميرا إلى اللاعب من زاوية، ينبغي أن تحرّك الأسهم اللاعب كما تظهر الحركة على الشاشة: إلى الأعلى تعني السير بعيدًا عن الكاميرا، وإلى اليمين تعني السير إلى يمين الكاميرا. لا تنطبق محاور العالم بهذه الطريقة إلا عندما تنظر الكاميرا على طول +z. لذا كوّن الحركة من اتجاهات الكاميرا نفسها، cam.forward وcam.right.
يجب تعديلهما أولًا. فالكاميرا التي تنظر إلى اللاعب من الأعلى يكون اتجاه forward لديها مائلًا نحو الأرض، لذا اجعل قيمة y تساوي 0 للاحتفاظ بالجزء الموازي للأرض فقط. سيكون المتبقي أقصر من 1، نحو 0.87 لكاميرا مائلة إلى الأسفل بزاوية 30 درجة، ما يجعل اللاعب يسير ببطء أكبر، لذا طبّع الاتجاه. يتبع هذا المتحرك الكاميرا الرئيسية، التي تنظر إلى أحد أركان المستوى:
Transform cam = Camera.main.transform;
Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();
Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize(); // الحركة القطرية ليست أسرع
controller.Move(move * speed * Time.deltaTime);Camera.main هي الكاميرا التي تحمل الوسم MainCamera. تُقرأ الاتجاهات مرتين كل إطار، لذا تظل عناصر التحكم صحيحة عند دوران الكاميرا. تؤدي إضافة متجهي الوحدة المتعامدين عند الضغط على الأعلى واليمين معًا إلى متجه طوله نحو 1.41، لذا تُطبّع الحركة عندما يتجاوز طولها 1.
التحدي
متوسطتدور الكاميرا ببطء حول اللاعب (CameraRig.cs، جاهز)، لذلك تستمر محاور العالم في الدوران على الشاشة. اجعل الأسهم تحرّك اللاعب بالنسبة إلى الكاميرا في Mover.cs، حيث كُتبت الجاذبية بالفعل. يضبط Inspector قيمة speed (4) وcam، وهو Transform الخاص بالكاميرا.
- السهم للأعلى يجعل اللاعب يمشي مبتعدًا عن الكاميرا على الأرض، والسهم للأسفل باتجاهها، والسهمان لليمين واليسار إلى يمين الكاميرا ويسارها: بسرعة
speedوحدة في الثانية في كل اتجاه، بما في ذلك الاتجاهات القطرية، رغم أن الكاميرا تنظر إلى اللاعب من الأعلى. - أثناء المشي، يستدير اللاعب ليواجه الاتجاه الذي يمشي نحوه. وعندما يتوقف، يظل مواجهًا لذلك الاتجاه.
اضغط على Play، وتجول بينما تدور الكاميرا، ثم اضغط على Check.
جرّب بنفسك
using UnityEngine;
public class Mover : MonoBehaviour
{
public float speed = 4f;
public float gravity = -15f;
public Transform cam;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
verticalSpeed += gravity * Time.deltaTime;
// يتحرك على طول محاور العالم: اجعله يتحرك بالنسبة إلى cam ويواجه اتجاه حركته
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك8متحكّم الشخصية
CharacterController.Moveتطبيق الجاذبية يدويًاالقفزدفع الأشياءالتحرّك في اتجاه النظرمراجعة: القفزة المزدوجة6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك