diff --git a/Content/Script/Tests/Regression/IssueOverrides/IssueOverridesObject.lua b/Content/Script/Tests/Regression/IssueOverrides/IssueOverridesObject.lua new file mode 100644 index 000000000..378c44f5a --- /dev/null +++ b/Content/Script/Tests/Regression/IssueOverrides/IssueOverridesObject.lua @@ -0,0 +1,7 @@ +local M = UnLua.Class() + +function M:CollectInfo() + return self.Overridden.CollectInfo(self) + 1 +end + +return M diff --git a/Plugins/UnLua/Source/UnLua/Private/LuaOverridesClass.cpp b/Plugins/UnLua/Source/UnLua/Private/LuaOverridesClass.cpp index ecb5daac8..9cdeceea8 100644 --- a/Plugins/UnLua/Source/UnLua/Private/LuaOverridesClass.cpp +++ b/Plugins/UnLua/Source/UnLua/Private/LuaOverridesClass.cpp @@ -71,7 +71,9 @@ void ULuaOverridesClass::AddToOwner() if (!Class) return; -#if UE_VERSION_NEWER_THAN(5, 2, 1) +#if UE_VERSION_NEWER_THAN(5, 2, 1) && UE_VERSION_OLDER_THAN(5, 7, 0) + // 5.3~5.6: Children is TObjectPtr but UField::Next is still a raw pointer, + // so the chain cannot be walked in place with a single slot type auto ChildrenPtr = Class->Children.Get(); auto Field = &ChildrenPtr; @@ -101,7 +103,9 @@ void ULuaOverridesClass::RemoveFromOwner() if (!Class) return; -#if UE_VERSION_NEWER_THAN(5, 2, 1) +#if UE_VERSION_NEWER_THAN(5, 2, 1) && UE_VERSION_OLDER_THAN(5, 7, 0) + // 5.3~5.6: Children is TObjectPtr but UField::Next is still a raw pointer, + // so the chain cannot be walked in place with a single slot type auto ChildrenPtr = Class->Children.Get(); auto Field = &ChildrenPtr; diff --git a/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaDeadLoopCheck.spec.cpp b/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaDeadLoopCheck.spec.cpp index e582b1d45..7c9de2b96 100644 --- a/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaDeadLoopCheck.spec.cpp +++ b/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaDeadLoopCheck.spec.cpp @@ -41,6 +41,11 @@ void FLuaDeadLoopCheckSpec::Define() It(TEXT("设置防止无限循环的超时时间"), EAsyncExecution::TaskGraphMainThread, [this]() { + // a preceding PIE-based test deactivates UnLua on a deferred tick, so the module + // may still be active here; Startup() would then early-return without applying + // DeadLoopCheck to FDeadLoopCheck::Timeout and the chunk below never times out + UnLua::Shutdown(); + auto& Settings = *GetMutableDefault(); Settings.DeadLoopCheck = 1; diff --git a/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaLib_Class.spec.cpp b/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaLib_Class.spec.cpp index 0d30f07d1..b8c1a3895 100644 --- a/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaLib_Class.spec.cpp +++ b/Plugins/UnLuaTestSuite/Source/UnLuaTestSuite/Private/Specs/LuaLib_Class.spec.cpp @@ -59,12 +59,17 @@ void FUnLuaLibClassSpec::Define() { It(TEXT("正确获取类默认对象"), EAsyncExecution::TaskGraphMainThread, [this]() { - const UObject* Expected = LoadClass(nullptr, TEXT("/Game/Core/Blueprints/BP_Game.BP_Game_C"))->GetDefaultObject(); + const auto Class = LoadClass(nullptr, TEXT("/Game/Core/Blueprints/BP_Game.BP_Game_C")); + if (!TestNotNull(TEXT("BP_Game class"), Class)) + return; + const UObject* Expected = Class->GetDefaultObject(); const char* Chunk = "\ local GameModeClass = UE.UClass.Load('/Game/Core/Blueprints/BP_Game.BP_Game_C')\ return GameModeClass:GetDefaultObject()"; UnLua::RunChunk(L, Chunk); - const UObject* Actual = static_cast(UnLua::GetPointer(L, -1)); + // UObject userdata is managed by FObjectRegistry, so it must be read back + // with GetUObject; GetPointer only understands raw/smart-pointer userdata + const UObject* Actual = UnLua::GetUObject(L, -1); TEST_EQUAL(Actual, Expected); }); }); diff --git a/Source/TPSProject.Target.cs b/Source/TPSProject.Target.cs index a880c9118..1dfb7a561 100644 --- a/Source/TPSProject.Target.cs +++ b/Source/TPSProject.Target.cs @@ -20,7 +20,10 @@ public class TPSProjectTarget : TargetRules public TPSProjectTarget(TargetInfo Target) : base(Target) { Type = TargetType.Game; -#if UE_5_4_OR_LATER +#if UE_5_7_OR_LATER + DefaultBuildSettings = BuildSettingsVersion.V6; + IncludeOrderVersion = EngineIncludeOrderVersion.Latest; +#elif UE_5_4_OR_LATER DefaultBuildSettings = BuildSettingsVersion.V4; IncludeOrderVersion = EngineIncludeOrderVersion.Latest; #else diff --git a/Source/TPSProjectEditor.Target.cs b/Source/TPSProjectEditor.Target.cs index 8b0386aef..48f5a7c9d 100644 --- a/Source/TPSProjectEditor.Target.cs +++ b/Source/TPSProjectEditor.Target.cs @@ -20,7 +20,10 @@ public class TPSProjectEditorTarget : TargetRules public TPSProjectEditorTarget(TargetInfo Target) : base(Target) { Type = TargetType.Editor; -#if UE_5_4_OR_LATER +#if UE_5_7_OR_LATER + DefaultBuildSettings = BuildSettingsVersion.V6; + IncludeOrderVersion = EngineIncludeOrderVersion.Latest; +#elif UE_5_4_OR_LATER DefaultBuildSettings = BuildSettingsVersion.V4; IncludeOrderVersion = EngineIncludeOrderVersion.Latest; #else diff --git a/Source/TPSProjectServer.Target.cs b/Source/TPSProjectServer.Target.cs index bc86645bb..4046823ef 100644 --- a/Source/TPSProjectServer.Target.cs +++ b/Source/TPSProjectServer.Target.cs @@ -19,7 +19,10 @@ public class TPSProjectServerTarget : TargetRules public TPSProjectServerTarget(TargetInfo Target) : base(Target) { Type = TargetType.Server; -#if UE_5_4_OR_LATER +#if UE_5_7_OR_LATER + DefaultBuildSettings = BuildSettingsVersion.V6; + IncludeOrderVersion = EngineIncludeOrderVersion.Latest; +#elif UE_5_4_OR_LATER DefaultBuildSettings = BuildSettingsVersion.V4; IncludeOrderVersion = EngineIncludeOrderVersion.Latest; #else diff --git a/TPSProject.uproject b/TPSProject.uproject index f20bd2f52..f48ff6a65 100644 --- a/TPSProject.uproject +++ b/TPSProject.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "5.6", + "EngineAssociation": "5.7", "Category": "", "Description": "", "Modules": [