ما هي الـ Unity Attributes وكيفية اضافتها

unity

كمطور العاب أثناء عملك اليومي على أي من مشاريعك، لابد انك تتعامل مع العشرات والمئات من المتغيرات، سواء كانت ذات قيم رقمية، نصيه، او حتي لونيه.

وربما اثناء عملك معها شعرت انك تفقد ميزه ما، نقصها ليس بالشيء المميت، لكن لا شك أنها لو وجدت لسهلت عليك الكثير من العمل ووفرت لك وقتا لا بأس به.

ناهيك عن أنه مع اضافتك للكثير من المتغيرات، يصبح التعامل معها لاحقا مهمة تتطلب بعض الجهد، فبحثك عن متغير بين 5 لن يكون نفس الشيء عندما يزيد عددهم لبضعة عشرات.

ففي هذه الحاله لابد ان وجود شيء ما يمكنك من تنظيمها بطريقة افضل واسهل للعمل معه سيكون بالتأكيد إضافة عظيمة. 

وموضوعنا هذه المره يتمحور حول هذه النقاط، او بكلمة اخرى، نظام الصفات في يونتي Unity Attributes.

ما هي الصفات Attributes

طبقا لتعريف يونتي الرسمي فالصفات هي علامات يمكن وضعها فوق الأصناف – Classes، المتغيرات، أو حتي الدوال – Functions، وهذا لتضيف لها سلوكا إضافيا خاصا.

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

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

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

صفات المتغيرات

تسلسل الحقل – SerializeField

قد يكون هذا أشهرهم بالفعل، وبنسبة كبيرة أغلب استعمالك يعتمد عليه، ووظيفته هي إظهار أي متغير في واجهة محرر يونتي، لكن قد تتسائل لم لا نستعمل الطريقة الاسرع بتغيير نوع وصول المتغير من خاص – Private إلى عام – Public.

اجابة ذلك انه في العاده عندما تنشىء متغيرا جديدا في الشيفرة فإفتراضيا يكون خاص – Private، وفي حالة احتجت لإظهاره في محرر يونتي يمكنك ببساطة تحديده ليكون عام – public.

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

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

[SerializeField] private int Health = 21;

اخفاء في لوحة الخصائص – HideInInspector

أما في حالة اردت ان تخفي المتغير الذي يحمل نوع وصول عام فهذه هي وظيفة إخفاء في لوحة الخصائص بالضبط, وهي عكس تسلسل الحقل والتي تمكنك من اخفاء المتغير مهما كان نوع الوصول المحدد له، بالتالي قد تظن أن إظهار المتغيرات طول الوقت افضل لانه يمكنك من تغييرها بسهولة.

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

[SerializeField] private int Health = 21
[HideInInspector] public float timer;

أدني – Min

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

[Min(5)] public int attackDamage;

 ولكن قد تتسائل هل يوجد شيء يفعل العكس أي يحدد قيمة عليا؟
للاسف لا يوجد حتى الآن أي شيء رسمي ولكن بالطبع يوجد حل لهذا وهو ما نتطرق اليه تاليا.

مدى – Range

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

[Range(10،100)] public float movementSpeed = 12;

تأخير – Delayed

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

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

 اما بواسطة هذه الصفة فأنت تجبر المحرك ان لا يستجيب لهذه التغييرات الا بعد انتهائك تماما من تعيين القيمة.

public int undelayed;
[Delayed] public int delayed;

استعمال اللون – Color Usage, استعمال التدريج – GradientUsage

تكلمت كثيرا عن المتغيرات التي تحمل بيانات رقمية والآن لنتكلم قليلا عن الالوان، ودعني أذكرك مجددا بما يحدث عند انشائك متغيرا من نوع اللون، فكما تعرف اي لون يتكون من 3 ألوان رئيسية بنسب مختلفة مع قناة الشفافية ايضا، وهذا النموذج يوفره لك المحرك فعلا، بالاضافة لنموذج الـ HSV.

ولكن لنفترض انك تريد تغيير نوع اللون أو التدريج ليصبح HDR أو بمعنى آخر تريد اعطائه القدرة على التوهج، ففي هذه الحالة يمكنك تحقيق ذلك باستعمالك صفة استعمال اللون, أو استعمال التدريج, تبعا لنوع المتغير الذي تستعمله, وفي حالة استعمالك له مع اللون تجد ايضا انه يسمح لك أيضا بالتحكم بوجود/عدم وجود قناة الشفافية لهذا اللون.

[ColorUsage(true،true)] public Color backgroundColor;
[GradientUsage(true)] public Gradient skyGradient;

صفات للشيفرة (script)

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

عنوان – Header

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

[Header("Player Stats")][SerializeField] int health = 50;
[SerializeField] float speed = 23.5f;
[SerializeField] int attackDamage = 13;

مسافة – Space

بعد انشائك لبعض العناوين، ربما ترغب في وضع بعض المساحة بين كل مجموعة متغيرات، وتلك هي وظيفة هذه الصفة.

[SerializeField] private int first;
[Space(50)][SerializeField] private int last;

منطقة النص – TextArea, متعدد الأسطر – Multiline

الوظيفة الأساسية لهما هي تمكينك من إدراج أي نص تريده بحيث يكون الغرض منه هو توضيح أو شرح أي من جوانب شيفرتك أو كتابة أي شيء في العموم.

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

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

[Multiline(2)] public string multiLine;
[TextArea(2،10)] public string TextArea;

تلميح الأداة – Tooltip

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

[Tooltip("Time allowed to perform jump after leaving the ground")] public float coyoteTime;

خلاصة

وفي ختام هذه المقالة، والتي عرضت بها أهم الصفات في محرك يونتي، والتي كما ترى توفر مميزات مهمة بدئا من التي تسمح لك بالتحكم في سلوك المتغيرات مثل Min، Color Usage، إلى التي تتمحور وظيفتها حول تحسين مظهر شيفرتك وزيادة وضوحها مثل Tooltip، Header.

ومن خلال استخدامك لهذه الصفات المختلفة يمكنك تنظيم وتحسين عملية التطوير ، بالإضافة إلى زيادة إنتاجيتك.

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

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

0 تعليقات
Inline Feedbacks
View all comments