الحجم المتضخّم هو أسرع طريقة لخسارة اللاعب قبل أن تبدأ لعبتك أصلًا، لذلك فإن تعلّم كيفية تقليل حجم لعبة Unity WebGL من أكثر المهارات تأثيرًا التي يمكنك اكتسابها. سيمرّ بك هذا الدليل على الإعدادات والعادات التي تصغّر حجم التنزيل ووقت التحميل معًا: الضغط، وتنظيف الكود، وإعدادات الخامات والصوت التي تضاعف حجم ملفك بصمت.
قِس قبل أن تُحسّن
لا يمكنك إصلاح وزن لا تراه. أي بناء WebGL يشحن أربعة ملفات: ملف .wasm (الكود المُترجَم)، وملف .data (كل الأصول مجمّعة معًا)، وملف framework بلغة JavaScript، وملف اللودر (loader). معرفة أيّها الثقيل تدلّك مباشرة على المكان الذي يستحقّ جهدك.
بعد أي عملية بناء، افتح ملف Editor.log وابحث فيه عن Build Report. على ويندوز تجده في المسار %LOCALAPPDATA%\Unity\Editor\Editor.log، وعلى ماك في ~/Library/Logs/Unity/Editor.log. تسرد Unity كل أصل مع حجمه ونسبته من الحجم الكلي. إن كانت الخامات تمثّل 60% من البناء، فلن ينفعك تنظيف الكود مهما فعلت، والعكس صحيح تمامًا. ابدأ دائمًا بالشريحة الأكبر.
فعّل نوع الضغط الصحيح
اذهب إلى Player Settings ← Publishing Settings ← Compression Format، وأمامك ثلاثة خيارات:
- Disabled — لا تشحن بها أبدًا؛ فهي للتجربة المحلية فقط.
- Gzip — خيار متين يعمل في كل مكان، وهو الافتراضي الآمن في Unity.
- Brotli — أصغر عادةً بنسبة 15–25% من Gzip للمحتوى نفسه.
الرابح هو Brotli لكن بشرط: المتصفّح لا يقبله إلا عبر HTTPS (أو localhost)، ويجب أن يرسل خادمك ترويسة Content-Encoding: br. إن لم تكن تتحكّم بترويسات الخادم، فعّل Decompression Fallback لتضمّ Unity فاكّ ضغط صغيرًا بلغة JavaScript يجعل اللعبة تعمل في أي مكان مقابل لودر أكبر قليلًا. المنصّات التي تستضيف WebGL نيابةً عنك، مثل The Gaming Nest، ترسل الترويسات الصحيحة أصلًا، فيمكنك إبقاء Brotli مفعّلًا دون هذا البديل.
نظّف الكود عبر IL2CPP
يعتمد بناء WebGL على IL2CPP، ما يعني أن الكود غير المستخدَم من C# يمكن حذفه قبل أن يتحوّل إلى .wasm. من Player Settings ← Optimization:
- اضبط Managed Stripping Level على
Highلإزالة الدوال والأنواع غير المُشار إليها بقوّة. - فعّل Strip Engine Code كي تسقط وحدات Unity غير المستخدمة (فيزياء لا تستعملها، وميزات جسيمات لا تلمسها).
التنظيف العالي قد يوفّر ميغابايتات من .wasm، لكنه قد يحذف كودًا لا يُستدعى إلا عبر الـ reflection أو SendMessage. إن انهار شيء أثناء التشغيل برسالة MissingMethodException، فلا تخفّض المستوى؛ بل أضف ملف link.xml إلى مجلّد Assets يحافظ على التجميعة (assembly) أو النوع المطلوب تحديدًا. هكذا تبقي التنظيف الصارم مع استثناء ما تحتاجه فعلًا.
الخامات والصوت هما الوزن الخفي
في معظم المشاريع تكون المشكلة في ملف .data لا في الكود، والخامات تتصدّر القائمة. اختر الخامة، وأضف تجاوزًا لمنصّة WebGL من الـ Inspector، ثم:
- حدّد Max Size عند الدقّة التي تعرضها فعليًا. خلفية بحجم 4096 تُعرض بدقّة 1080p هدرٌ خالص؛ أنزلها إلى 2048 أو 1024.
- فعّل Crunch Compression (مع DXT) واسحب مؤشّر Compressor Quality إلى نحو 50%. يقايض Crunch قليلًا من جودة الصورة بحجم تنزيل أصغر بكثير.
- عطّل الـ mipmaps على واجهات المستخدم والرسوم ثنائية الأبعاد التي لا تبتعد عن الكاميرا.
الصوت هو المفاجأة الماكرة. اختر كل مقطع واضبط Compression Format على Vorbis، وأنزل Quality إلى 50–70%، واستخدم Force To Mono للمؤثّرات التي لا تحتاج ستيريو. أمّا مقاطع الموسيقى الطويلة فاجعل Load Type على *Streaming* حتى لا تشغل الذاكرة أثناء التحميل. هاتان الفئتان وحدهما قد تمثّلان أكثر من نصف حجم البناء.
توقّف عن شحن أصول لا تُحمّلها أبدًا
أي شيء داخل مجلّد اسمه Resources يُحزَم في بنائك سواء استخدمته أم لا، وهذا أشهر سبب منفرد لتضخّم ملف .data بشكل غامض. أخرِج الأصول من Resources، وأشِر إليها مباشرة، أو انتقل إلى Addressables ليُحمَّل المحتوى عند الطلب من شبكة CDN. مع Addressables تستطيع شحن تنزيل أوّلي صغير جدًا — القائمة والمرحلة الأولى — ثم بثّ البقية واللاعب يلعب بالفعل، فينهار وقت التحميل *الأوّلي* حتى لو كانت اللعبة كبيرة إجمالًا.
وأثناء المراجعة، احذف الحِزَم غير المستخدمة من Package Manager، وامسح المشاهد التجريبية التي أتت مع حزم متجر الأصول. ما لا يُشار إليه في أي مكان لا مكان له في البناء.
اجعل الزيارة الثانية فورية
التحميل الأوّل لن يكون صفرًا أبدًا، لكن الثاني يمكن أن يكون كذلك. من Publishing Settings فعّل Data Caching لتخزّن Unity ملفات البناء في ذاكرة المتصفّح (IndexedDB)، فيتخطّى اللاعب العائد التنزيل كليًا. وفعّل أيضًا Name Files As Hashes، إذ لا تتغيّر أسماء الملفات إلا عند تغيّر محتواها، ما يجعل تخزين المتصفّح والـ CDN المؤقّت أكثر موثوقية.
إليك قائمة تحقّق سريعة قبل النشر:
- Compression Format ← Brotli
- Managed Stripping Level ← High مع ملف
link.xmlعند الحاجة - الخامات ← Crunch مع تحديد Max Size
- الصوت ← Vorbis، ومؤثّرات مونو، وموسيقى بثّ
- أفرِغ مجلّدات
Resourcesأو انقلها إلى Addressables - Data Caching ← مُفعّل
وبمجرّد أن يصبح بناؤك خفيفًا، صدّره بشكل نظيف للويب وانشره على The Gaming Nest حيث يلعبه اللاعبون في العالم العربي فورًا داخل المتصفّح، دون تنزيل ولا تثبيت. اشحن لعبة تُحمَّل في ثوانٍ وستحتفظ باللاعبين الذين كان بناء ثقيل سيخسرهم. وإن كانت لعبتك تُحمَّل لكنها تعرض شاشة سوداء أو تتجمّد، فدليل إصلاح عدم تحميل Unity WebGL يمرّ بك على الأسباب المعتادة.