الدليل الشامل لتقنية @export في محرك Godot

Godot

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

بل الاسوء، عندما تستعمل نفس تلك الكائنات في عدة مراحل/مشاهد مختلفة، وتريد استعمال ارقاما مختلفة في كل مرة، فعندها ستكون مشكلة كبيرة كما انها عملية مرهقة وتستهلك وقتًا طويلًا، خاصةً مع تعقّد اللعبة. 

لهذا السبب، يقدم محرك غودو godot ميزة قوية تُسمى exported properties، وحرفيا تُترجم إلى “تصدير الخصائص” ولكن كلمة تصدير لها عدة اسماء اخرى، لذلك استخدم “إتاحة”، واخبرني برايك في هذه الترجمة في التعليقات.

تقنية الإتاحة بمثابة جسر بين التصميم وعالم البرمجة، مما يُسهّل عليك ضبط إعدادات اللعبة دون الحاجة إلى أي تعديل في البرمجة نفسها. 

تختلف هذه الخصائص عن المتغيرات العادية، لأنها تظهر بشكلٍ مرئي في واجهة Godot ضمن لوحة الخصائص/inspector الخاصة بالكائن الذي تنتمي إليه، مما يتيح لك ضبط قيمها بسهولة باستخدام عناصر تحكم بسيطة. 

للتوضيح، تخيل أن لديك كائنًا يُمثّل عدوًا في لعبتك، وتريد استخدامه نفسه في عدة مراحل، ولكن اعطائه قوة مختلفة. فبدلاً من كتابة سطر برمجي لتغيير سرعة العدو في كل مرة، يمكنك استخدام خاصية الاتاحة لتعريف متغير “السرعة” (speed)، وعندها ستجد هذا المتغير مُتاحًا للتعديل مباشرةً في لوحة الخصائص، وتلك التعديلات تبقى في المشهد.

بهذه الطريقة، ستوفر وقتًا وجهدًا كبيرًا، وتُسهل عملية التطوير والاختبار، خاصةً أثناء مرحلة تصميم اللعبة وضبط معالمها. 

في هذا المقال، استفيض اكثر عن هذه التقنية وكيف يمكنك استخدامها وبل حتى احترافها، خاصة أن بها يمكنك استخدام العديد من التقنيات الاخرى كالموارد والادوات، والتي سيكون لها مقالات خاصة في المستقبل.

المبادئ والاساسيات

داخل اي شيفرة/script، يمكنك كتابة الامر @export ثم تعريف متغير جديد وكتابة اسمه، واعطائه قيمة اولية، وذلك وحده كافي باتاحة ذلك المتغير في اعلى لوحة الخصائص/inscpetoer.

ونظرا لوجود العديد من الانواع المختلفة من البيانات، فلديك 3 طرق اساسية، الاولى وهي وضع قيمة افتراضية تدل على نوع البيانات، والثانية وهي توضيح نوع البيانات دون قيمة افتراضية.

# متغير نصي بقيمة افتراضية وهي كلمة (نص)
@export var text = "نص"
@export var Empty_text = "" # متغير نصي بقيمة افتراضية فارغة 
@export var MyNumber = 20 # متغير رقمي بقيمة افتراضية 20 
@export var Number : int # متغير رقمي دون قيمة افتراضية 

اما النوع الثالث والاخير، فهو يعتمد على كلمة @export نفسها، حيث يوجد بها عدة انواع مختلفة، وكل واحدة تعبر عن نوع متخصص من البيانات داخل المحرك نفسه وليس فقط البرمجة، مثل : 

# متغير رقمي من 0 إلى 20 
@export_range(0, 20) var i
# متغير يمكن وضع مسار صورة فيه بامتداد png فقط
@export_global_file("*.png") var tool_image 
# متغير لوني بدون شفافية
@export_color_no_alpha var col: Color

وان لاحظت، ستجد أن في الامر @export_range، كان يوجد قوسين وبداخلهم حددت اصغر واكبر قيمة، هذا النوع من التحديد يسمى بالـFlags او الـ”تعليم” حيث تضع علامات خاصة بذلك المتغير.

هذه العلامات تختلف من “إتاحة” إلى اخرى، فبعضها لديه علاماته الخاصة، مثل @export_node_path، والتي يمكنك وضع علامات تدل على انواع العقد التي يمكن وضعها ققيمة لذلك المتغير.

ومن هنا يجب توضيح جميع انواع الاتاحة في المحرك مع اهم العلامات الخاصة بها.

قائمة بانواع الـExport

يوجد 11 نوع مختلف من انواع الاتاحة /Export، وهم كالتالي : 

المجموعات

منها يمكنك تقسيم الخصائص ووضعها في مجموعات وتصنيفات مختلفة، وذلك لتحسين شكل لوحة الخصائص

@export_group("My Properties") # انشاء مجموعة 
@export var property_number:int = 3
@export_subgroup("Extra Properties") # مجموعة داخلية
@export var player_name:String = ""
@export var is_active:bool = false
@export_category("Main Category") # تصنيف كامل 
@export var main_value:int = 3
@export var main_text:String = ""
@export_category("Extra Category") # تصنيف اضافي 
@export var extra_flag:bool = false

مسارات الملفات – Paths

هنا يمكنك وضع مسار ملف، او مجلد او انواع معينة من الملفات فقط، حيث تضع * ثم . ثم الامتداد

@export_file var file_path:String # مسار ملف عام
@export_dir var directory_path:String # مسار مجلد عام
@export_file("*.txt") var text_file:String # مسار ملف نصي

النطاقات  – Range

النطاق او المدى او range، هي متغيرات رقمية تبدء من قيمة محددة إلى قيمة اخرى عبر قوانين خاصة.
بالاضافة إلى القواميس والنصوص الكبيرة

@export_range(0,20) var range_value:int # قيمة ضمن نطاق محدد
@export_range(-10,20) var adjusted_range:int # نطاق رقمي معدل
@export_range(-10,20,0.2) var precise_float:float # رقم عشري 
@export_range(0,100,1,"or_less","or_greater") var bounded_int:int # عدد محصور بين القيم المعطاة
@export_range(0,100000,0.01,"exp") var exponential_value:float # قيمة أسية
@export_range(0,1000,0.01,"hide_slider") var hidden_slider_value:float # قيمة مع اخفاء شريط التمرير

@export_global_dir var global_directory:String # قاموس عام
@export_multiline var multi_line_text:String # نص متعدد الأسطر

المسافات والزوايا

الإعلام Suffix يمكنه تحديد المتغير الوحدة، والإعلام radias_as_degrees يمكنه تحديد المتغير كزاوية نصف قطرة

@export_range(0,100,1,"suffix:m") var distance_meters:int # المسافة بالأمتار
@export_range(0,360,0.1,"radians_as_degrees") var rotation_angle:float # زاوية الدوران نصف قطرية

التدرج/المنحنيات – Ease

تتيح لك وضع مُنحى/curve داخل لوحة الخصائص، والذي تسهل عليك استخدام التسارع او التباطئ وغيرها.

@export_exp_easing var transition_speed:float # سرعة الانتقال التدريجية

الالوان – Colors

@export var main_color:Color # لون رئيسي
@export_color_no_alpha var color_no_alpha:Color # لون بدون شفافية

العقد – Nodes

كثيرا ما تحتاج إلى استدعاء عٌقد/Nodes بحد ذاتها، وهذه الاتاحات توفر مجموعة لا باس منها من الخصائص، مثل وضع عقدة بحد ذاتها او مسارها لاستدعائها فيما بعد، او وضع إعلامات لتحديد نوع العقد المطلوبة

السطر الثالث هنا لن يعمل، لكي يعمل يجب وضعه داخل دالة

@export var scene_node:Node # عقدة مشهد
@export var button_node:BaseButton # عقدة زر 
@export var node_path_var:NodePath # مسار العقدة
var selected_node = get_node(node_path_var) # الحصول على العقدة من المسار
@export_node_path("Button","TouchScreenButton") var button_path:NodePath # مسار زر معين

الموارد – Resource

الموارد مثل الصور والاصوات وملفات التحريك/animation وغيرها.

@export var main_resource:Resource # مورد عام يمكن وضع اي مورد له
@export var image_resource:Texture #مورد خاص بالصور فقط 
@export var animation_node:AnimationNode # عقدة تحريك

الإعلام – flags

يوجد إعلامات داخل إتاحات/exports مختلفة، ولكن ايضا يكنك استعمالها لوحدها، في هذه الحالة ستظهر بشكل مجموعة من الخيارات، ويمكنك تحديد مجوعة مختلفة، وفي هذه الحالة قيمها ستكون بمضاعفات الرقم 2 وتبدء من 0

@export_flags("Fire","Water","Earth","Wind") var ability_elements:int = 0 # عناصر القدرات
@export_flags("Self:4","Allies:8","Foes:16") var ability_targets:int = 0 # أهداف القدرات
# أهداف متقدمة للقدرات
@export_flags("Self:4","Allies:8","Self and Allies:12","Foes:16") var advanced_ability_targets:int = 0

الفيزياء والتصيير والملاحة – Physics, Render, Nav

لدى المحرك طبقات مختلفة، منها الخاصة بالفيزياء ومنها الخاصة بالتصيير/render، ومنها الخاصة بالملاحة / Navigation، وفي حال اردت قيم خاصة منها، يمكن اظهارها هكذا:

@export_flags_2d_physics var layers_2d_physics:int
@export_flags_2d_render var layers_2d_render:int
@export_flags_2d_navigation var layers_2d_navigation:int
@export_flags_3d_physics var layers_3d_physics:int
@export_flags_3d_render var layers_3d_render:int
@export_flags_3d_navigation var layers_3d_navigation:int

التعدد – Enum

واحدة من اهم الخصائص على الاطلقا، لانها تتيح لك اختيار خيار ما بين متعدد. مع مجموعة مختلفة من الإعلامات المفيدة.

كما يجب التوضيح، أن هذه الخيارات تظهر في البرمجة بشكل رقمي، اي أن الخيار الاول يكون 0، والثاني يكون 1 وهكذا.

enum NamedEnum {THING_1, THING_2, ANOTHER_THING = -1} # تعداد للقيم المسماة
@export var selected_enum:NamedEnum # قيمة التعداد المختارة
@export_enum("Warrior","Magician","Thief") var character_class:int # تصنيف الشخصية
@export_enum("Slow:30","Average:60","Very Fast:200") var character_speed:int # سرعة الشخصية
@export_enum("Rebecca","Mary","Leah") var character_name:String = "Rebecca" # اسم الشخصية الافتراضي

المصفوفات – Array

المصفوفات تحمل اكبر عدد من الامثلة في هذا المقال، نظرا لوجد طرق مختلفة من استخدامها، فيمكنك انشاء مصفوفة عادية، او مصفوفة خاصة بنوع معين فقط من البيانات.

والمحرك لديه نوعين من المصفوفات من الاصل، العادية التي يطلق عليها array، واخرى خاصة وتكون على حسب البيانات، مثل PackedVector3Array، وهي مصفوفة خاصة بالمتجهات ثلاثية الابعاد فقط

# تعريف المصفوفات
@export var numbers_array:Array[int] = [1, 2, 3] # مصفوفة أعداد صحيحة
@export var nested_array:Array[Array] = [[1.0, 2.0], [3.0, 4.0]] # مصفوفة ثنائية الأبعاد
@export var generic_array:Array = [] # مصفوفة عامة
@export var scene_references:Array[PackedScene] = [] # مصفوفة مشاهد
@export var texture_list:Array[Texture] = [] # مصفوفة من الصور

# تعريف مصفوفات متقدمة
@export var vector3_array:PackedVector3Array = PackedVector3Array() # مصفوفة ثلاثية الأبعاد
@export var string_array:PackedStringArray = PackedStringArray() # مصفوفة نصوص
@export_range(-360,360,0.001,"degrees") var laser_angles:Array[float] = [] # زوايا الليزر
@export_file("*.json") var skill_trees:Array[String] = [] # ملفات شجرة المهارات
@export_color_no_alpha var hair_colors:PackedColorArray = PackedColorArray() # ألوان الشعر
# اقتراحات فواكه
@export_enum("lemon","watermelon","mango") var fruit_suggestions:Array[String] = [] 

معلومات اضافية

خاصية الاتاحة مهمة للعديد من الاشياء، عندما تبدء في تطوير الألعاب المتوسط  او المتقدم، فلا بد من استخدامها مع تقنيات اخرى مثل الموارد والادوات (حيث تصنع مواردك وادواتك الخاصة).

وكمعلومة اضافية حول هذه التقنية، فان كتبت تعليقا فوق او امام السطر، فلن يحصل شيئ، ولكن أن استخدمت علامة # مزدوجة، ففي ذلك الوقت سيظهر تعليقك كانه وصف للخاصية

وفي حال اردت التعرف اكثر على إعلامات/flags اي إتاحة منهم، فيكفي الضغط على زر ctrl، ثم الضغط على اسم الاتاحة، وذلك سيعرض لك جميع المعلومات عنها وايضا إعلاماتها

مصادر

0 0 votes
Article Rating
Subscribe
نبّهني عن
guest

0 تعليقات
Oldest
Newest Most Voted
Inline Feedbacks
View all comments