UObject通常无法调用任何需要传入WorldContext的方法,例如延时函数Delay,TimeLine或者某个SubSystem:
image.pngDelay这种上下文函数根本没办法创建,而Subsystem则会报错
image.png- 蓝图宏定义中会检查是否有传入WorldContext或重写了GetWorld()函数
//蓝图如果定义了这句话则不能在UObject中调用
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject")
void ChildFunction(UObject* WorldContextObject)
主要原因
- 这里卡主了不让UObject正常使用上下文函数
解决方法:
新建UObject子类并重写下列方法
class YOUR_API UChildObject : public UObject
{
GENERATED_BODY()
public:
//UObject work flow
virtual UWorld* GetWorld() const override;
virtual bool ImplementsGetWorld() const override;
}
.CPP中重写
UWorld* UChildObject ::GetWorld() const
{
// CDO objects do not have a world.
// If the object outer is destroyed or unreachable we are likely shutting down and the world should be nullptr.
if (UObject* Outer = GetOuter())
{
if (!HasAnyFlags(RF_ClassDefaultObject)
&& !Outer->HasAnyFlags(RF_BeginDestroyed)
&& !Outer->IsUnreachable())
{
return Outer->GetWorld();
}
}
UWorld* world = nullptr;//= Super::GetWorld();
if (UObject* Outer = GetOuter())
{
world = Outer->GetWorld();
}
if(world == nullptr)
{
for(auto context : GEngine->GetWorldContexts())
{
if(context.WorldType != EWorldType::Editor || context.WorldType != EWorldType::EditorPreview)
{
world = context.World();
}
}
}
if(world == nullptr)
{
world = GEngine->GetWorldContexts()[0].World();
}
return world;
}
bool UChildObject ::ImplementsGetWorld() const
{
return true;
}
在UE编辑器中创建蓝图BlueprintClass并继承上述子类,就会愉快的发现可以调用任何函数了
UE 5.3环境
网友评论