هل ظهرت لك رسالة الخطأ التالية أثناء محاولة تصدير 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