التحرّك في اتجاه النظر
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 42 من 60.
عندما تنظر الكاميرا إلى اللاعب من زاوية، ينبغي أن تحرّك الأسهم اللاعب كما تُظهر الشاشة: إلى الأعلى يمشي مبتعدًا عن الكاميرا، وإلى اليمين يمشي نحو يمين الكاميرا. لا تحقّق محاور العالم ذلك إلا عندما تنظر الكاميرا على امتداد +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.
التحدي
متوسطاجعل الأسهم تحرّك اللاعب نسبةً إلى الكاميرا الدوّارة.
- في
Update()، انسخcam.forwardوcam.right، واجعلyتساوي 0، ثم طبّع المتجهين. - يساوي
dirforwardمضروبًا في المحور الخام"Vertical"زائدًاrightمضروبًا في"Horizontal"، وطبّعه عندما يكون طوله أكبر من 1. - عندما يكون
dir != Vector3.zero، عيّنtransform.rotation = Quaternion.LookRotation(dir);. أنشئmoveمنdir * speed.
اضغط «العب»: يتحرك اللاعب إلى الأمام مبتعدًا عن الكاميرا، أيًّا كان اتجاه نظرها. ثم اضغط «تحقق».
جرّب بنفسك
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مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity