نصائح التحسين للوحدة

Unity هو محرك ألعاب يحظى بشعبية كبيرة ليس فقط بين المطورين المستقلين ولكن أيضًا بين الشركات الكبرى.

إنه يتميز بواجهة سهلة الاستخدام، وخط أنابيب عرض قوي، ونظام مكونات سهل الاستخدام، وأخيرًا، فهو يدعم مجموعة واسعة من الأنظمة الأساسية.

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

فيما يلي نصائح مهمة للفئات الثلاث الرئيسية (العرض والبرمجة النصية و والصوت) التي ستساعدك يمكنك تحسين أداء لعبتك:

استدعاء

نصيحة 1: احتفظ بالكائنات التي تحتوي على مكون العارض دون تغيير حجمها

الكائنات التي لا يوجد مقياس لها هي تلك التي لها مقياس (1، 1، 1). في هذه الحالة، ليس من الضروري أن يقوم Unity بإجراء حسابات إضافية لإعادة قياس الكائن في كل إطار.

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

تغيير حجم المبنى

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

أول شيء عليك القيام به هو تغيير حجم النموذج حتى يناسب احتياجاتك (على سبيل المثال، تم تغيير حجم المبنى أعلاه من (1، 1، 1) إلى (0.49482، 0.49482، 0.49482))، ثم حدد النموذج في المشروع عرض وفي إعدادات الاستيراد لاحظ عامل القياس (عادةً ما يكون إما 1 أو 0.1).

قم بتعيين القيمة الجديدة، والتي يجب أن تساوي عامل المقياس الافتراضي مضروبًا في المقياس الجديد (في حالتي هو 1 × 0.49482 = 0.49482)، ثم اضغط على تطبيق. عد الآن إلى النموذج في عرض المشهد واضبط المقياس مرة أخرى على (1، 1، 1).

إعدادات عامل مقياس Unity 3D

يتم الآن قياس الكائن بالطريقة التي تريدها مع الحفاظ على المقياس الافتراضي (1، 1، 1).

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

نصيحة 2: استخدم أقل عدد ممكن من الأضواء

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

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

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

نصيحة 3: استخدم التظليل الشفاف بحذر

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

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

البرمجة النصية

نصيحة 1: قم دائمًا بتخزين مراجع المكونات مؤقتًا

يجب عليك دائمًا تخزين مراجع المكونات مؤقتًا إذا كنت تخطط للوصول إليها في كل تحديث.

على سبيل المثال، تحقق من البرنامج النصي أدناه:

سيء

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

لدينا هنا Script1 الذي يحصل على المتغير "someValue2" من Script2 ويعينه لمتغير محلي.

الآن، استدعاء GetComponent واحد فقط لكل إطار لن يكون له أي تأثير على الأداء، ومع ذلك، يجب عليك اعتماد عادة التخزين المؤقت للمكونات التي سيتم استخدامها بشكل متكرر.

هناك طريقتان لتخزين مكون في برنامج نصي مؤقتًا، إما إنشاء متغير عام وتعيينه في عرض Inspector، أو إنشاء متغير خاص وتعيينه من Start أو Awake. تحقق من المثال أدناه:

جيد

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

والأفضل من ذلك بكثير، أنه يمكن الآن الوصول إلى Script2 في كل تحديث دون زيادة الأداء.

افعل الشيء نفسه بالنسبة للمكونات المضمنة، مثل BoxCollider وRigidbody وما إلى ذلك (باستثناء Transform وGameObject، يتم تخزينها مؤقتًا بالفعل بشكل افتراضي حتى تتمكن من الوصول إليها على الفور).

نصيحة 2: استخدم SendMessage بحذر

يتيح لك SendMessage استدعاء وظيفة محددة (إن وجدت) على كل MonoBehaviour المرتبطة بكائن اللعبة.

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

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

نصيحة 3: استخدم GameObject.Find وGameObject.FindWithTag بحذر

يتيح لك GameObject.Find وGameObject.FindWithTag وGameObject.FindGameObjectsWithTag البحث بسرعة عن الكائنات الموجودة في المشهد. هذه الأساليب أبطأ بكثير من GetComponent ويجب استخدامها فقط أثناء التهيئة.

نصيحة 4: تجنب استخدام OnGUI

تاريخيًا، كانت OnGUI هي الطريقة الوحيدة لإنشاء القوائم في Unity. ولكن منذ ذلك الحين، تمت إضافة بديل يسمى UI Canvas وهو أفضل بكثير من حيث الأداء ويوفر الكثير من الوظائف.

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

شيء واحد يمكنك القيام به هو أن يكون لديك برنامج نصي منفصل يحتوي فقط على OnGUI وتمكينه/تعطيله عند الحاجة.

على سبيل المثال:

UIScript.cs

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Script1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

يتم إرفاق كل من UIScript وScript1 بنفس GameObject. يتحكم Script1 في وقت إظهار القائمة.

عندما يضغط اللاعب على Tab، يتم تمكين UIScript، مما يعرض الأزرار. يؤدي الضغط على Tab مرة أخرى إلى إلغاء تنشيطه وإخفاء الأزرار.

أثناء إلغاء تنشيط UIScript، لا يتم استدعاء أسلوب OnGUI مما يؤدي بدوره إلى تحسين الأداء.

نصيحة 5: استخدم ملف التعريف

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

صوتي

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

ستعتمد إعدادات استيراد الصوت المثالية على طول الصوت وتكرار التشغيل والنظام الأساسي المستهدف.

المقالات المقترحة
مولد لوحة الإعلانات للوحدة
كيفية الاستفادة من التحديث في الوحدة
Unity قم بتحسين لعبتك باستخدام ملف التعريف
تحسين أداء لعبة الهاتف المحمول في Unity
إعدادات استيراد مقطع الصوت من Unity للحصول على أفضل أداء
تويتر نصائح للوحدة
كيف تصبح مبرمجًا أفضل في Unity