انريل انجنمقالات

🛠️ حل مشكلة “Value cannot be null. (Parameter ‘element’)” عند تصدير الإضافات في Unreal Engine 5.5

هل ظهرت لك رسالة الخطأ التالية أثناء محاولة تصدير Plugin في Unreal Engine؟

❗️ Value cannot be null. (Parameter ‘element’)

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


⚠️ متى تحدث هذه المشكلة؟

تظهر هذه الرسالة غالبًا عند الضغط على “Package Plugin” داخل Unreal Engine 5.5 أو الأحدث، تحديدًا عندما:

  • تستخدم قالب Plugin جديد من نوع Installed.

  • تعتمد على إعدادات bUsePrecompiled = true;.

  • أو عندما يقوم Unreal Build Tool بقراءة إعدادات غير كاملة من ملف ModuleRules.cs.


🔍 السبب الرئيسي للمشكلة

Unreal Engine يقوم داخليًا باستدعاء دالة اسمها:

IsValidForTarget(...)

إذا كانت بعض القيم التي يُفترض أن تكون موجودة (مثل المنصة أو التكوين) غير معرّفة، يتم تمرير null، فينتج الخطأ:

“Value cannot be null. (Parameter ‘element’)”


✅ طريقة الحل (مؤقتة وآمنة)

1. افتح مشروع Unreal Build Tool من مصدر المحرك

اذهب إلى مجلد تثبيت المحرك لديك، وافتح هذا الملف عبر Visual Studio أو Rider:

C:\Programs\Unreal Engine\UE5.5\UE_5.5\Engine\Source\Programs\UnrealBuildTool\UnrealBuildTool.sln

2. ابحث عن ملف ModuleRules.cs

المسار:

Engine\Source\Programs\UnrealBuildTool\System\ModuleRules.cs

ثم ابحث داخله عن دالة:

internal static bool IsValidForTarget(...)

3. استبدل الكود بالكامل بالكود الآتي:

internal static bool IsValidForTarget(Type moduleType, ReadOnlyTargetRules targetRules, [NotNullWhen(false)] out string? invalidReason)
{
	invalidReason = "";

	if (moduleType == null)
	{
		invalidReason = "ModuleType is null.";
		return false;
	}

	IEnumerable<TargetType> supportedTargetTypes;
	try
	{
		supportedTargetTypes = moduleType.GetCustomAttributes<SupportedTargetTypesAttribute>().SelectMany(x => x.TargetTypes).Distinct();
	}
	catch (Exception e)
	{
		invalidReason = $"Error reading SupportedTargetTypesAttribute: {e.Message}";
		return false;
	}
	if (supportedTargetTypes.Any() && !supportedTargetTypes.Contains(targetRules.Type))
	{
		invalidReason = $"TargetType '{targetRules.Type}'";
		return false;
	}

	IEnumerable<UnrealTargetConfiguration> supportedConfigurations;
	try
	{
		supportedConfigurations = moduleType.GetCustomAttributes<SupportedConfigurationsAttribute>().SelectMany(x => x.Configurations).Distinct();
	}
	catch (Exception e)
	{
		invalidReason = $"Error reading SupportedConfigurationsAttribute: {e.Message}";
		return false;
	}
	if (supportedConfigurations.Any() && !supportedConfigurations.Contains(targetRules.Configuration))
	{
		invalidReason = $"Configuration '{targetRules.Configuration}'";
		return false;
	}

	try
	{
		if (!UEBuildPlatform.GetPlatformFolderNames().Any(name => moduleType.Name.EndsWith("_" + name, StringComparison.OrdinalIgnoreCase)))
		{
			var platformAttributes = moduleType.GetCustomAttributes<SupportedPlatformsAttribute>();
			var supportedPlatforms = platformAttributes.SelectMany(x => x.Platforms).Distinct();

			if (platformAttributes.Any() && !supportedPlatforms.Contains(targetRules.Platform))
			{
				invalidReason = $"Platform '{targetRules.Platform}'";
				return false;
			}
		}
	}
	catch (Exception e)
	{
		invalidReason = $"Error reading SupportedPlatformsAttribute: {e.Message}";
		return false;
	}

	try
	{
		IEnumerable<ObsoleteAttribute> obsoleteAttributes = moduleType.GetCustomAttributes<ObsoleteAttribute>();
		if (obsoleteAttributes.Any())
		{
			invalidReason = $"Obsolete '{(obsoleteAttributes.First().Message ?? "unspecified")}'";
			return false;
		}
	}
	catch (Exception e)
	{
		invalidReason = $"Error reading ObsoleteAttribute: {e.Message}";
		return false;
	}

	invalidReason = null;
	return true;
}

أعد بناء UnrealBuildTool (من خلال Visual Studio ➜ “Build Solution”).

⚠️ نصائح هامة قبل التعديل

النصيحة التفاصيل
💾 خذ نسخة احتياطية انسخ الملف ModuleRules.cs قبل التعديل، تحسبًا لأي خطأ.
🧠 استخدم محرر محترف مثل Visual Studio 2022 أو Rider لضمان سهولة التنقل في الكود.
📦 استرجع الكود لاحقًا بعد انتهاء عملية التصدير، يُفضّل أن تعيد الملف لحالته الأصلية.

✅ خطوات مختصرة

الخطوة الإجراء
🔎 1 افتح UnrealBuildTool من مصدر المحرك
🧭 2 اذهب إلى ملف ModuleRules.cs
✏️ 3 استبدل دالة IsValidForTarget بالكامل
🧪 4 جرّب تصدير الإضافة من جديد
🔄 5 استرجع الكود الأصلي بعد التصدير

🚨 تنبيه أخير

هذه الطريقة تعتبر حلًا مؤقتًا فقط، ولا يُنصح باستخدامها على المدى البعيد، خصوصًا في الإضافات التجارية. تابع تحديثات Unreal Engine المستقبلية فقد يتم حل المشكلة رسميًا لاحقًا.


🤝 ساعد غيرك!

شارك المقال مع مطوري Unreal الآخرين. وإذا واجهت مشكلة مختلفة أو اكتشفت طريقة أفضل، يسعدنا أن تشارك تجربتك في التعليقات!

GitHub
اظهر المزيد

Katsu Sama

كاتسو مطور العاب مستقل اقوم بكتابة مقالات وتصوير دورات لبناء جيل جديد من مطوري العاب الفيديو كما اسعى ان اصبح احد افضل مطوري العاب في العالم

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى

دعمك يساعدنا في الاستمرار!

مرحبًا بك في مدونة DZTFIX Studio ❤️
نلاحظ أنك تستخدم حاجب الإعلانات (AdBlock)، ونحن نقدّر حرصك على تجربة تصفح سلسة. ومع ذلك، فإن الإعلانات تساعدنا في تقديم محتوى مجاني عالي الجودة لك.

💡 يرجى تعطيل حاجب الإعلانات أو إضافة موقعنا إلى قائمة الاستثناءات لدعمنا في الاستمرار وتقديم المزيد من المقالات والمحتوى المفيد.

📌 شكرًا لتفهمك ودعمك المستمر! 🙌