الفصل السابع: تطبيق نظام إدخال ألعاب محاكاة الطيران

العب

آخر أنواع أنظمة التحكم التي سنتطرق لها في هذه الوحدة هي أنظمة محاكاة الطائرات. طبعا لا أقصد بالمحاكاة هنا أن أقوم ببناء نظام مشابه تماما لقمرة قيادة طائرة كالذي في Microsoft Flight Simulator، بل سأتناول نظاما بسيطا كالذي يمكن أن تراه في بعض أجزاء لعبة GTA. نوع الطائرة الذي سنتناوله سيقتصر على الطائرة النفّاثة (ذات الأجنحة) وليس الطائرة العمودية (الهيلكوبتر).

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

الشكل 28: نموذج طائرة بسيط مبني باستخدام الأشكال الأساسية

الشكل 28: نموذج طائرة بسيط مبني باستخدام الأشكال الأساسية

لننتقل الآن لكيفية التحكم بالطائرة. سندع الطائرة تطير تلقائيا باتجاه الأمام دون أي تدخل من اللاعب، وهذا أمر بديهي؛ كون الطيار لا يستطيع إيقاف الطائرة في الهواء أثناء التحليق. ما يستطيع اللاعب فعله هو توجيه الطائرة باستخدام الدوران. سنستخدم سهمي لوحة المفاتيح الأيمن والأيسر لجعل الطائرة تميل إلى اليمين أو اليسار، وذلك بتدويرها حول محور فضائها المحلي z، هذا النوع من الدوران يسمى الالتفاف(roll). النوع الآخر من الدوران هو التأرجح (pitch)، وهو الدوران حول المحور المحلي x أي نحو الأمام أو الخلف، وسنستخدم مفتاحي السهم الأعلى والأسفل لهذا النوع من التدوير.

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

بالنسبة للكاميرا، سنقوم بوضعها خلف الطائرة بارتفاع منها قليلا، ونضيفها كابن لكائن الطائرة حتى تتبعها باستمرار كما في الشكل 29، جدير بالذكر أنه من الأفضل أن نقوم بتغيير قيمة لوح القص البعيد للكاميرا Far Clipping Plane وزيادتها إلى 5000 بدلا من 1000؛ نظرا لأن ألعاب الطائرات تعتمد على رؤية بعيدة المدى كون الطائرة تحلق على ارتفاعات شاهقة وتطير بسرعة كبيرة.أخيرا سنقوم بإضافة البريمج FlyController الموضّح في السرد 14 إلى كائن الطائرة حتى نتحكم بها.

الشكل 29: الطائرة كما تبدو من منظور الكاميرا

الشكل 29: الطائرة كما تبدو من منظور الكاميرا

1. using UnityEngine;
2. using System.Collections;
3. 
4. public class FlyController : MonoBehaviour {
5.  
6.  //سرعة الطيران نحو الأمام مقدرة بـ متر \ ثانية
7.  public float flySpeed = 166;
8.  
9.  //z سرعة الدوران على المحور
10.     public float rollSpeed = 35;
11.     
12.     //x سرعة الدوران على المحور
13.     public float pitchSpeed = 35;
14.     
15.     void Start () {
16.     
17.     }
18.     
19.     void Update () {
20.         //قيم الدوران الخاصة بالإطار الحالي
21.         float roll, pitch;
22.         
23.         //zحساب الدوران حول المحور 
24.         //اعتمادا على مفتاحي الأسهم الأيمن والأيسر
25.         if(Input.GetKey(KeyCode.RightArrow)){
26.             roll = -rollSpeed * Time.deltaTime;
27.         } else if(Input.GetKey(KeyCode.LeftArrow)){
28.             roll = rollSpeed * Time.deltaTime;
29.         } else {
30.             roll = 0;
31.         }
32.         
33.         //x حساب الدوران حول المحور
34.         //اعتمادا على مفتاحي الأسهم الأعلى والأسفل
35.         if(Input.GetKey(KeyCode.DownArrow)){
36.             pitch = -pitchSpeed * Time.deltaTime;
37.         } else if(Input.GetKey(KeyCode.UpArrow)){
38.             pitch = pitchSpeed * Time.deltaTime;
39.         } else {
40.             pitch = 0;
41.         }
42.         
43.         //تطبيق الدوران حول المحورين المحليين
44.         //z و x
45.         transform.Rotate(0, 0, roll);
46.         transform.Rotate(pitch, 0, 0);
47.     
48.         //flySpeed تحريك الطائرة نحو الأمام اعتمادا على قيمة السرعة
49.         transform.Translate(0, 0, flySpeed * Time.deltaTime);
50.         
51.         //منع الطائرة من الانخفاض تحت علو 5 أمتار
52.         Vector3 pos = transform.position;
53.         if(pos.y < 5){
54.             pos.y = 5;
55.         }
56.         transform.position = pos;
57.     }
58. }

السرد 14: نظام التحكم بالطائرة

كما تلاحظ فإن نظام التحكم بسيط ولا يوجد أي حسابات معقدة، كما أنه يستخدم مجموعة من الوظائف والتقنيات التي سبق شرحها. يمكنك مشاهدة النتيجة النهائية في المشهد scene8 في المشروع المرفق.

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

السابقالتالي

تعليقات واستفسارات